3

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

4

1 回答 1

2

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

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

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;
}
于 2013-02-19T09:15:58.767 回答