【问题标题】:OpenGl getting mouse positionOpenGL获取鼠标位置
【发布时间】:2013-12-16 10:21:07
【问题描述】:

我有一个函数可以在 3d 空间中用鼠标坐标创建一个向量。

这是我的代码:

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 轴指向我时在 x/z 轴上以及在 y/z 轴上当 x 轴指向我时。

另外,我如何将 z 位置设置为与我的视点之间的固定距离?

【问题讨论】:

  • 在调用glGet*() 之前是否旋转矩阵...如果不是,那可能是您的问题。
  • 如何旋转它们?
  • "但是当我旋转场景时,这些点不会跟随鼠标的光标" ...在调用 glGet*() 之前你会旋转吗?

标签: c++ opengl mouse mousemove


【解决方案1】:

您的问题很可能出在以下几行:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多