gluUnproject给出非逻辑值(C ++)

时间:2014-06-30 15:27:06

标签: 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, 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);
}

我用这种方式:

glm::ivec2 pos = _input.getMousePosition(); //0, 0 is high left corner                                                                                                                                     
glm::vec3 posIn = GetOGLPos(pos.x, pos.y);

以像素为单位的位置很好,但我认为,我得到的位置是假的。

如果我点击屏幕中心(我的对象原点位于(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

所以我在这里有两个问题:

  1. Z值不会改变(所以它可能是一个向量而不是协调)
  2. 对象移向我的鼠标(因为我将我的对象转换为新的coordonates,所以新的原点应该是XOGL,YOGL,ZOGL),但仅限于几个像素。所以价值观错误或误用。
  3. 有人可以帮助我吗?

0 个答案:

没有答案