在 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 轴是根据从 eye
到 center
的方向计算得出的,最后 X 轴是Y 和 Z 的叉积。
顺便说一句,您不能完全旋转 360 度。在水平方向 +/- 90 度处,您会遇到一个奇点,其中有两种可能的方式来表示相同的角度。如果您通过该欧拉角插入旋转,那么您最终可以翻转您的方向。实际上,如果您的三个轴中有两个平行(当您向上或向下看时会发生这种情况),那么欧拉角会变得非常混乱。
【讨论】:
以上是关于在 FPS 场景中理解 gluLookAt xyz 旋转的问题的主要内容,如果未能解决你的问题,请参考以下文章
两个Sphere和gluLookAt函数之间的OpenGL碰撞