Opengl 使用鼠标移动项目对象

Opengl 使用鼠标移动项目对象,opengl,picking,Opengl,Picking,我尝试使用openGL 2.1中的Gluunproject方法用鼠标移动对象,但我在这里真的很挣扎;以下是我编写的代码: int viewport[4]; double modelview[16], projection[16], X1, Y1, Z1; double realY; GLfloat depth[2]; for(_compt=_OjebctScene.begin();_compt!=_OjebctScene.end();_compt+

我尝试使用openGL 2.1中的Gluunproject方法用鼠标移动对象,但我在这里真的很挣扎;以下是我编写的代码:

int viewport[4];
double  modelview[16],
       projection[16],
       X1, Y1, Z1;
double realY;
    GLfloat depth[2];

    for(_compt=_OjebctScene.begin();_compt!=_OjebctScene.end();_compt++)
    {

    if ((*_compt)->IsSelected())
    {
        GLdouble mouseX=event.x;
        GLdouble mouseY=event.y;

      glGetIntegerv(GL_VIEWPORT, viewport);
      glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
      glGetDoublev(GL_PROJECTION_MATRIX, projection);
      realY = viewport[3] - (GLint) mouseY - 1;
      glReadPixels(mouseX, realY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, depth);
      gluUnProject(mouseX, realY, 0, modelview, projection, viewport, &X1, &Y1, &Z1);
      (*_compt)->setX(X1);
      (*_compt)->setY(Y1);
      (*_compt)->setZ(Z1);
    }
}
我使用循环检查场景中的所有对象(我已将它们推到向量中),然后当我找到选定对象时,我尝试使用鼠标移动它


然后,我将对象的坐标设置为鼠标在3D空间中的位置(X1,Y1,Z1);但这并没有真正起作用。

我想我已经通过将深度[0]传递给glunproject方法解决了这个问题。 以下是我所做的,改变这一点:

  gluUnProject(mouseX, realY, 0, modelview, projection, viewport, &X1, &Y1, &Z1);
据此:

  gluUnProject(mouseX, realY,depth[0], modelview, projection, viewport, &X1, &Y1, &Z1);

我不明白这意味着什么,如果有人能向我解释一下,那就太好了。

我想我已经通过将深度[0]传递给GlunProject方法解决了这个问题。 以下是我所做的,改变这一点:

  gluUnProject(mouseX, realY, 0, modelview, projection, viewport, &X1, &Y1, &Z1);
据此:

  gluUnProject(mouseX, realY,depth[0], modelview, projection, viewport, &X1, &Y1, &Z1);

不过我不明白这意味着什么,如果有人能给我解释一下,那就好了。

什么是“真的不起作用”呢?物体并不像预期的那样移动,它们从右到左“跳跃”,没有真正跟随鼠标的移动。嗯。有很多东西不清楚。调用此函数时,实际设置了什么modelview矩阵?在渲染过程中,如何转换使用这些
setX()
等方法设置的位置?为什么要在mouese位置读回深度缓冲区值?你为什么要在近平面上取消投影点呢?嗯,我只是用我在网上找到的东西自学openGL,这是我在研究如何用鼠标移动物体后发现的。我知道GlunProject会给你鼠标在3D空间中的坐标,但除此之外,老实说,我对这个问题没有深入的了解。modelview是我猜的Id矩阵(我总是确保弹出它)。SetX()方法修改对象的坐标,每次我渲染对象时,我都通过访问器使用这些属性。“真的不起作用”是什么意思?对象不会像预期的那样移动,它们会从右到左“跳跃”,没有真正跟随鼠标的移动。有很多东西不清楚。调用此函数时,实际设置了什么modelview矩阵?在渲染过程中,如何转换使用这些
setX()
等方法设置的位置?为什么要在mouese位置读回深度缓冲区值?你为什么要在近平面上取消投影点呢?嗯,我只是用我在网上找到的东西自学openGL,这是我在研究如何用鼠标移动物体后发现的。我知道GlunProject会给你鼠标在3D空间中的坐标,但除此之外,老实说,我对这个问题没有深入的了解。modelview是我猜的Id矩阵(我总是确保弹出它)。SetX()方法修改对象的坐标,每次渲染对象时,我都通过访问器使用这些属性。