如何在OpenGL中检测某些对象上的鼠标?

时间:2013-02-19 08:43:57

标签: c++ c opengl graphics

我正在制作简单的3D游戏。在3D场景中检测鼠标悬停在物体上的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

实际上,我会避免使用这些拣选方法,只是以数学方式进行。从鼠标光标位置直接创建一条直线到场景中,并将其与场景中每个对象的边界球相交。对于它相交的每个边界球,只需检查哪个顶点最接近眼睛位置。

可以使用此算法创建直线,z分别设置为0。

math::Vec3f windowToObjectf(const math::Vec3f& windowCoord) {
  math::Matrix4f modelViewMatrix;
  math::Matrix4f projectionMatrix;
  std::array <GLint, 4> viewport;
  glGetFloatv( GL_MODELVIEW_MATRIX, modelViewMatrix.data() );
  glGetFloatv( GL_PROJECTION_MATRIX, projectionMatrix.data() );
  glGetIntegerv( GL_VIEWPORT, &viewport.front() );
  math::Vec3f ret(0, 0, 0);
  auto succes = gluUnProject( windowCoord.x , windowCoord.y, windowCoord.z, modelViewMatrix.data(), projectionMatrix.data(), &viewport.front(), &ret.x, &ret.y, &ret.z );
  RASSERT(succes == GL_TRUE);
  GL_RASSERT();
  return ret;
}