OpenGl获得鼠标位置

时间:2013-12-16 10:21:08

标签: c++ opengl mouse mousemove

我有一个函数来创建一个三维空间中鼠标坐标的矢量。

这是我的代码:

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位置?

1 个答案:

答案 0 :(得分:0)

很可能你的问题出在这些方面:

glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
glGetDoublev( GL_PROJECTION_MATRIX, projection );
glGetIntegerv( GL_VIEWPORT, viewport );

OpenGL是一个状态机,你在那里查询的内容可能是什么。在绘制时,您通常会以各种方式操纵这些矩阵的内容,因此您在那里查询的内容可能不是最初用于绘制的矩阵。

要解决您的问题,您应该在设置初始视图后立即复制投影和模型视图以及视口设置。然后使用这些副本而不是查询值,这可能与您实际需要的非常不同。