我参考了网上的代码:
void Ctest11View::TranslateGL(int x,int y,GLdouble &posX,GLdouble &posY,GLdouble &posZ)
{
GLint viewport[4];
GLdouble modelview[16];
GLdouble projection[16];
GLfloat winX,winY,winZ=.5;
glPushMatrix();
/* glLoadIdentity();
glTranslatef(0,0,-1.5);
glRotatef(angx,1,0,0);
glRotatef(angy,0,1,0);
glRotatef(angz,0,0,1);*/
glGetIntegerv(GL_VIEWPORT, viewport);
glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
glGetDoublev(GL_PROJECTION_MATRIX, projection);
glPopMatrix();
winX = (float)x;
winY = viewport[3] - (float)y;
glReadPixels( x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );
TRACE("z%f %d %d %d %d\n",winZ,viewport[0],viewport[1],viewport[2],viewport[3]);
TRACE("%d",gluUnProject(double(winX),double(winY), double(winZ), modelview, projection, viewport, &posX, &posY, &posZ)); }
每次结果都是glReadPixels输出的winZ毫无修改(应该是出错了)
然后直接导致gluUnProject出错
就算我把
glLoadIdentity();
glTranslatef(0,0,-1.5);
glRotatef(angx,1,0,0);
glRotatef(angy,0,1,0);
glRotatef(angz,0,0,1);
的注释去掉,结果依然相同(这些图像操作与我绘图时相同)
是环境设置的问题么OpenGL
void Ctest11View::TranslateGL(int x,int y,GLdouble &posX,GLdouble &posY,GLdouble &posZ)
{
GLint viewport[4];
GLdouble modelview[16];
GLdouble projection[16];
GLfloat winX,winY,winZ=.5;
glPushMatrix();
/* glLoadIdentity();
glTranslatef(0,0,-1.5);
glRotatef(angx,1,0,0);
glRotatef(angy,0,1,0);
glRotatef(angz,0,0,1);*/
glGetIntegerv(GL_VIEWPORT, viewport);
glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
glGetDoublev(GL_PROJECTION_MATRIX, projection);
glPopMatrix();
winX = (float)x;
winY = viewport[3] - (float)y;
glReadPixels( x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );
TRACE("z%f %d %d %d %d\n",winZ,viewport[0],viewport[1],viewport[2],viewport[3]);
TRACE("%d",gluUnProject(double(winX),double(winY), double(winZ), modelview, projection, viewport, &posX, &posY, &posZ)); }
每次结果都是glReadPixels输出的winZ毫无修改(应该是出错了)
然后直接导致gluUnProject出错
就算我把
glLoadIdentity();
glTranslatef(0,0,-1.5);
glRotatef(angx,1,0,0);
glRotatef(angy,0,1,0);
glRotatef(angz,0,0,1);
的注释去掉,结果依然相同(这些图像操作与我绘图时相同)
是环境设置的问题么OpenGL
GCPosition4D OpenGLControl::ScreenToPoint(int x,int y)
{
GLint viewport[4];
GLdouble mvmatrix[16],projmatrix[16];
glPushMatrix();
glGetIntegerv(GL_VIEWPORT,viewport);
glGetDoublev(GL_MODELVIEW_MATRIX,mvmatrix);
glGetDoublev(GL_PROJECTION_MATRIX,projmatrix);
GLdouble wx, wy, wz;
gluUnProject(x, viewport[3]-y - 1, 0.5, mvmatrix, projmatrix, viewport, &wx, &wy, &wz);
glPopMatrix();
return GCPosition4D(wx,wy,wz);
}
不过这个函数我一般仅用在Ortho投影,wz坐标一般是ortho立方体的Near面所在位置的值这个x,y,z 和Ortho的上下前后左右设置有关,不一定是坐标系的XYZ向
我的不是Ortho,而是 gluPerspective(50,aspect,0,2);
怎么办?
好的,我回去试试
根源在我用了gluPerspective(50,aspect,0,2);
而glReadPixels返回的是点在近远平面的比例,而近平面是0,则永远返回1(无穷大)