我正在制作简单的3D游戏。在3D场景中检测鼠标悬停在物体上的最佳方法是什么?
答案 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;
}