OpenGl获取鼠标位置
问题描述:
我有一个函数可以在三维空间中用鼠标坐标创建一个向量。OpenGl获取鼠标位置
这里是我的代码:
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;
}
然后,将载体作为吸引一些点是I'draw。如果我将z位置设置为0,代码运行得非常好,但是当我旋转场景时点不跟随鼠标的光标。但是,如果我将vector.z设置为上面的代码,则粒子开始向我移动,然后它们消失(即它们落在视点之后)。
我希望我的观点只能在z轴指向我时在x/y轴上跟随鼠标,在y轴指向我时在x/z轴上跟随鼠标,在y/z上指向y/z轴当x轴指向我时,它是一个轴。
或者,我怎样才能在距离我的观点的固定距离上设置z位置?
答
最有可能你的问题就出在这些线路:
glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
glGetDoublev(GL_PROJECTION_MATRIX, projection);
glGetIntegerv(GL_VIEWPORT, viewport);
OpenGL是一个状态机和您查询什么有可能是任何东西。在绘制时,通常以各种方式操作这些矩阵的内容,因此您查询的内容可能不会有最初用于绘制的矩阵。
为了解决您的问题,您应该在设置初始视图后立即在绘图时制作投影和模型视图以及视口设置的副本。然后使用这些副本而不是查询的值,这可能与您实际需要的值非常不同。
在调用'glGet *()'之前,您是否旋转了矩阵......如果不是这可能是您的问题。 – Vallentin
我该如何旋转它们? – user3098549
“,但是当我旋转场景时点不跟随鼠标的光标”...在调用'glGet *()'之前旋转吗? – Vallentin