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

Posted

技术标签:

【中文标题】在 FPS 场景中理解 gluLookAt xyz 旋转的问题【英文标题】:Problems understanding gluLookAt xyz rotation in FPS scenario 【发布时间】:2014-04-30 17:46:18 【问题描述】:

我在使用 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 函数。

【问题讨论】:

FPS 相机通常不会滚动(绕 Z 旋转)。 gluLookAt (...) 是专门为考虑该属性而构建的。它总是产生一个与向上 (Y) 和向前 (Z) 成直角的右向量(X 轴)。如果您无法弄清楚如何实现滚动,这可能就是原因。您必须先旋转您的 Y 轴(向上矢量),然后再将其输入gluLookAt (...) 【参考方案1】:

gluLookAt (...) 产生一个正交的视图空间。当您调用它时,您已经知道两个轴之一(Y 轴为 up),Z 轴是根据从 eyecenter 的方向计算得出的,最后 X 轴是Y 和 Z 的叉积。

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

【讨论】:

以上是关于在 FPS 场景中理解 gluLookAt xyz 旋转的问题的主要内容,如果未能解决你的问题,请参考以下文章

在按键时更改 gluLookAt。上、右、下、左

两个Sphere和gluLookAt函数之间的OpenGL碰撞

使用 OpenGL 和 GLUT 创建 FPS 风格的运动系统

gluLookAt() 的问题 - 旋转

如何将“相机”放在 OpenGL 中的立方体内

gluLookAt() 在 OpenGL 中无效