我有一个函数来创建一个三维空间中鼠标坐标的矢量。
这是我的代码:
void myMouse(int x, int 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)x;
winY = (float)viewport[3] - (float)y; // Subtract The Current Mouse Y Coordinate
glReadPixels( x, winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );//Reads the depth buffer
gluUnProject( winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);
vector.x=posX;
vector.y=posY;
vector.z=posZ;
}
然后将该矢量用作吸引的一些点的吸引子。如果我把z位置设置为0,代码工作得很好,但是当我旋转场景时,这些点不会跟随鼠标的光标。但是如果我将vector.z设置为上面的代码,那么粒子开始向我移动然后它们就会消失(即它们会在视点后面)。
当z轴指向我时,我希望我的点仅在x / y轴上跟随鼠标,当y轴指向我并且在y / z轴上时,在x / z轴上跟随鼠标当x轴指向我时。
或者,如何在距我的视角固定距离处设置z位置?
答案 0 :(得分:0)
很可能你的问题出在这些方面:
glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
glGetDoublev( GL_PROJECTION_MATRIX, projection );
glGetIntegerv( GL_VIEWPORT, viewport );
OpenGL是一个状态机,你在那里查询的内容可能是什么。在绘制时,您通常会以各种方式操纵这些矩阵的内容,因此您在那里查询的内容可能不是最初用于绘制的矩阵。
要解决您的问题,您应该在设置初始视图后立即复制投影和模型视图以及视口设置。然后使用这些副本而不是查询值,这可能与您实际需要的非常不同。