我正在制作简单的 3D 游戏。在 3D 场景中检测鼠标悬停对象的最佳方法是什么?
问问题
11497 次
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 回答