在FPS场景中理解gluLookAt xyz旋转的问题

时间:2014-04-30 17:46:18

标签: c++ opengl camera sdl-2 glulookat

我在使用gluLookAt时遇到了麻烦。

我的相机可以通过管道相对鼠标移动事件沿X轴和Y轴旋转。问题是Z轴 - 我不知道如何计算它。

所以,我的相机可以向上,向下,向左和向右看。但我无法弄清楚如何完全旋转360度!

有人可以帮忙吗?

编辑:

所以,到目前为止,这是我的代码的一个简单示例:

Point3 test(0,0,0);

Matrix4 camera = Camera::getInstance().getCameraM();
if ((event.motion.xrel > 200) || (event.motion.yrel > 200))
{
    break;
}

float mx = (event.motion.xrel);
float my = -(event.motion.yrel);
mx /= 20;
my /= 20;
test.setX(test.getX()+mx);
test.setY(test.getY()+my);
Camera::getInstance().lookAt(Point3(0,0,15),test,Vector3(0,-1,0));

Camera::lookAt简单地包装了glu lookAt函数。

1 个答案:

答案 0 :(得分:1)

gluLookAt (...)生成正交视图空间。当你调用它时你已经知道了两个轴中的一个(Y轴给定为up),给定从eyecenter的方向计算Z轴,然后最终X轴是Y和Z之间的叉积。

顺便说一句,你无法完全旋转360度。在水平方向+/- 90度处,您会遇到奇点,其中有两种可能的方式来表示相同的角度。如果您通过欧拉角插补旋转,那么您可以最终翻转您的方向。实际上,如果你的三个轴中的两个变得平行(当你直视或直线向下看时会发生这种情况)那么欧拉角就会变得非常混乱。