C++ gluUnproject提供非逻辑值(C+;+;)

C++ gluUnproject提供非逻辑值(C+;+;),c++,opengl,mouse,raycasting,glm-math,C++,Opengl,Mouse,Raycasting,Glm Math,我目前正在进行一个项目,我需要能够用鼠标移动对象,并进行一些鼠标拾取。我生成了一个1024*768的窗口,我的gluUnproject代码是: glm::vec3 GetOGLPos(int x, int y) { GLint viewport[4]; GLdouble modelview[16]; GLdouble projection[16]; GLfloat winX, winY, winZ; GLdouble posX, posY, posZ; // posX2,

我目前正在进行一个项目,我需要能够用鼠标移动对象,并进行一些鼠标拾取。我生成了一个1024*768的窗口,我的gluUnproject代码是:

 glm::vec3 GetOGLPos(int x, int y)
 {
  GLint viewport[4];
  GLdouble modelview[16];
  GLdouble projection[16];
  GLfloat winX, winY, winZ;
  GLdouble posX, posY, posZ; // posX2, posY2, posZ2;                                                                                                                                                             

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

  winX = (float)x;
  winY = (float)viewport[3] - (float)y;

  glReadPixels( x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );

  gluUnProject( winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);

  std::cout << "PosX = " << posX << " - PosY = " << posY << " - Pos Z = " << posZ << std::endl;                                                                                                                                        

  return glm::vec3(posX, posY, posZ);
}
像素的位置是好的,但是我得到的位置,我认为是错误的

如果我在屏幕中央单击(我的对象原点位于(0,0,0)),这里是一些输出:

Xpixel=512 Ypixel=364 XOGL=0 YOGL=-0.0111111 ZOGL=1

以及单击其他位置时的输出:

Xpixel=237 Ypixel=207 XOGL=-0.537109 YOGL=0.425 ZOGL=1

所以我这里有两个问题:

  • Z值不变(因此可能是一个向量,而不是坐标)
  • 对象向我的鼠标移动(因为我将对象转换为新坐标,所以新原点应为XOGL、YOGL、ZOGL),但仅在几个像素上。因此,这些值要么是错误的,要么是误用的

  • 有人能帮我吗?

    你给GlunProject输入的Z值是多少?这是唯一会影响你的ZOGL值的变量。Z值由代码中的“glReadPixel”给出
    glm::ivec2 pos = _input.getMousePosition(); //0, 0 is high left corner                                                                                                                                     
    glm::vec3 posIn = GetOGLPos(pos.x, pos.y);