我正在尝试使用gluUnProject将鼠标坐标转换为世界坐标,但是它似乎无法正常工作,或者我只是误解了glUnProject函数的功能,这是我正在使用的代码,我的矩阵都可以正常运行至于在鼠标x坐标上的-300,我使用的是C ++ Win32对话框,而ScreenToClient给了我时髦的结果。
int appWidth = CApplication::GetInstance()->GetWidth();
int appHeight = CApplication::GetInstance()->GetHeight();
float fAspect = (float)appWidth / (float)appHeight;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0f, fAspect, 0.1f, 100000.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(m_vecCamera.x, -m_vecCamera.y, m_vecCamera.z);
GLint viewport[4];
GLdouble modelview[16];
GLdouble projection[16];
GLfloat winX, winY, winZ;
GLdouble posX, posY, posZ;
glEnable(GL_DEPTH);
//Retrieve the Model/View, Projection, and Viewport Matrices
glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
glGetDoublev( GL_PROJECTION_MATRIX, projection );
glGetIntegerv( GL_VIEWPORT, viewport );
//Retrieve the Mouse X and the flipped Mouse Y
winX = (float)pInput->msg.param1-300.0f;
winY = (float)viewport[3]-(float)pInput->msg.param2;
glReadPixels( int(winX), int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );
gluUnProject(winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);
但是,这给了我相对于屏幕中心的坐标,并且我假设是相对于我的相机,我还尝试实现自己的功能
Vector2f MouseUnProject(int x, int y)
{
GLint viewport[4];
GLdouble modelview[16];
GLdouble projection[16];
GLfloat winX, winY, winZ;
GLdouble posX, posY, posZ;
glEnable(GL_DEPTH);
//Retrieve the Model/View, Projection, and Viewport Matrices
glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
glGetDoublev( GL_PROJECTION_MATRIX, projection );
glGetIntegerv( GL_VIEWPORT, viewport );
//Retrieve the Mouse X and the flipped Mouse Y
winX = (float)x;
winY = (float)viewport[3]-y;
glReadPixels( int(winX), int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );
double projectionX, projectionY;
double viewX, viewY;
double worldX, worldY;
//Convert from Screen Coords to Projection Coords
projectionX = (double)winX / ((double)viewport[2]/2.0) - 1.0;
projectionY = (double)winY / ((double)viewport[3]/2.0) + 1.0;
//Convert from projection Coords to View Coords
viewX = projectionX * modelview[14];
viewY = projectionY * modelview[14];
//Convert from View Coords to World Coords
worldX = viewX + modelview[12];
worldY = viewY - modelview[13];
return Vector2f(worldX, worldY);
}
它可以在特定的安装座上使用,但是当移动摄像机时,数字会立即消失,从投影到视点的转换“似乎”是可以的,并且投影点绝对是好的。
我真的更喜欢使用glUnProject而不是我自己的函数,但是我无法让它在我的生命中发挥作用,而且我发现的所有Google搜索似乎都无法回答我的问题。 GL文档中“对象空间”到底是什么意思,也许我对此的理解是错误的,如果是这样,我还必须做些什么才能使坐标位于正确的空间中?
最佳答案
是一年前发布的,但是无论如何....所以您正在获取相对于屏幕的坐标,因为您调用了gluPerspective。此调用在内部调用glfrustum,它将生成{-1,1}范围内的归一化坐标。但是,如果您直接使用您的近/远值调用glfrustum,您将在该范围内从gluUnproject获得结果。
要返回地图编辑器坐标,只需从gluUnproject获取结果并手动将范围转换回编辑器坐标系,即{-1,1} => {0,max}
首先,您应该通过输入(0,0),(midX,midY),(maxX,maxY)测试gluUnProject,并且gluUnProject的结果应为(-1,-1,depth),(0、0,depth)和(1,1,深度)。如果使用glFrustum设置投影矩阵,则以上结果将在近/远范围内返回。