问题描述——
view的OnSize(int xsize, int ysize)事件中有如下代码:
void DitkImageView::OnSize(int newX,int newY)
{
MakeCurrent();
glViewport(0,0,newX,newY);
glMatrixMode(GL_PROJECTION);
glLoadIdentity(); if(newY == 0)
newY = 1;
float asp = ((float)newX)/newY;
gluOrtho2D(-300.0f*asp,300.0f*asp,-300.0f,300.0f);
}而我要显示一张尺寸为size[2]的图像,用GL_TEXTURE_2D载入,有如下代码:
texdata为图像像素数据
bool DitkImageModel::_LoadTexture(unsigned char* texdata)
{
glEnable(GL_TEXTURE_2D);
GLuint texture[1]; int width = this->m_TexImageWidth;
int height = this->m_TexImageHeight; glGenTextures(1,&texture[0]);
glBindTexture(GL_TEXTURE_2D,texture[0]);
glTexImage2D(GL_TEXTURE_2D,0,1,width,height,0,GL_LUMINANCE,GL_UNSIGNED_BYTE,texdata);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
this->Reset();
glColor3f(0.0f,1.0f,0.0f);
glBegin(GL_POLYGON);
glTexCoord2f(0.0f,1.0f);
glVertex3f((-1)*m_DummyTexWidth/2,m_DummyTexHeight/2,0.0f); //m_DummyTexWidth=2^m >= max(size[0],size[1])
glTexCoord2f(0.0f,0.0f);
glVertex3f((-1)*m_DummyTexWidth/2,(-1)*m_DummyTexHeight/2,0.0f);
glTexCoord2f(1.0f,0.0f);
glVertex3f(m_DummyTexWidth/2,(-1)*m_DummyTexHeight/2,0.0f);
glTexCoord2f(1.0f,1.0f);
glVertex3f(m_DummyTexWidth/2,m_DummyTexHeight/2,0.0f); glEnd(); glDeleteTextures(1,&texture[0]);
glDisable(GL_TEXTURE_2D);

return true;
}现在我用鼠标在显示的图像上选取了某个区域,请问有没有办法知道我选取的区域在实际图像中对应的具体位置?
如果可以,请简单提供下思路——
可以得到的数据:1,选取区域在局部坐标系中的一系列坐标(v1,v2,v3...)
2,所有变换矩阵
要求输出:  选取区域在显示图像中的一系列坐标

解决方案 »

  1.   


    Opengl中好像没有提供投影反变换,,,
      

  2.   

    gluUnproject
    gluproject
    glreadpixels
      

  3.   

    gluOrtho2D(-300.0f*asp,300.0f*asp,-300.0f,300.0f);
    平行投影下,窗口和opengl世界坐标系空间之间的对应关系比较好计算
    从世界坐标系下的范围,对应找到几何体的范围,再根据这些几何体上的贴图关系反算出纹理图的范围
    然后再从源图当中找到对应的象素区域
      

  4.   

    已搞定——
    由gluOrtho2D()可以计算出世界坐标到规范坐标的转换矩阵m_WorldToNormal;
    有glViewport()可以计算出规范坐标到viewport中坐标的变换矩阵m_NormalToViewport对Windows窗口中任意一点坐标(x,y),可以得到它在viewport中坐标,
    假设glViewport(0,0,width,height),则该点在viewport中坐标为(x,height-y)而viewport和世界坐标系坐标之间的转换可以由两个转换矩阵计算得到——