问个老问题,屏幕坐标转化OpenGl世界坐标?
刚才我试过 zhangci226 的一段代码:但是得不到实际坐标,不知道哪里出问题了?
CPoint pTemp;
::GetCursorPos(&pTemp); //当前鼠标点
调用下面的函数:
GetSelectionRay(pTemp.x,pTemp.y);
得到的坐标不对,并不是我转到3D图形中地面上一点。
void OpenGL::GetSelectionRay(int mouse_x, int mouse_y)
{
GLint viewport[4];
GLdouble modelview[16];
GLdouble projection[16];
GLfloat winX, winY, winZ;
GLdouble posX, posY, posZ;
glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
glGetDoublev(GL_PROJECTION_MATRIX, projection);
glGetIntegerv(GL_VIEWPORT, viewport);
winX = (float)mouse_x;
winY = (float)viewport[3] - (float)mouse_y;
glReadPixels(int(winX), int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ);
gluUnProject(winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);
Point3f[0] = posX;
Point3f[1] = 0.1; //略高于地面上一点
Point3f[2] = posZ;
}
[解决办法]
Point3f[0] = posX;
Point3f[1] = 0.1; //略高于地面上一点
Point3f[2] = posZ;
这里,y值设置是错误的
应为这里得到的posX,posY,posZ,是经过了透视变换的值,如果你直接给一个0.1,这个值是没有经过透视变换的,所以不正确
[解决办法]
或者说你在GetSelectionRay()中按这个顺序调用,这样获得的坐标为世界坐标。
glMatrixMode(GL_MODEVIEW);glIdentity();gluLookAt();glGetDoublev(GL_MODELVIEW_MATRIX, modelview);