Opengl 根据相机方向移动

Opengl 根据相机方向移动,opengl,camera,Opengl,Camera,我使用以下方法围绕相机自身旋转(当相机位于(0,0,0)时): glRotatef(x_camera_angle, 1.0, 0.0, 0.0); glRotatef(y_camera_angle, 0.0, 1.0, 0.0); 我希望沿其外观方向移动摄影机,并根据摄影机方向移动对象(例如,将对象移动到摄影机并远离摄影机) 我已经尝试使用此处指定的modelview矩阵来实现这一点,但这似乎不起作用。例如,我尝试使用以下代码向前移动摄影机(根据其方向): glTranslatef(front

我使用以下方法围绕相机自身旋转(当相机位于(0,0,0)时):

glRotatef(x_camera_angle, 1.0, 0.0, 0.0);
glRotatef(y_camera_angle, 0.0, 1.0, 0.0);
我希望沿其外观方向移动摄影机,并根据摄影机方向移动对象(例如,将对象移动到摄影机并远离摄影机)

我已经尝试使用此处指定的modelview矩阵来实现这一点,但这似乎不起作用。例如,我尝试使用以下代码向前移动摄影机(根据其方向):

glTranslatef(front[0] * units_forward, front[1] * units_forward, front[2] * units_forward);
其中,“front”是答案中指定的矩阵。摄影机不会向前移动,而是根据其方向进行不同的移动


我做错了什么?任何帮助都将不胜感激。

您是否尝试了GLTRANSTEF(0,0,单位向前)?这可能是你所期望的吗

你困惑的根本原因是矩阵是如何工作的。gl(矩阵)函数都将当前矩阵与其构建的矩阵相乘。正如凯尔塔在左边纠正的那样。矩阵的一个奇怪之处是A*B!=通常,产品的右侧“先发生”。因此,如果A是旋转,B是向前移动,A*B表示“向前移动,然后围绕我移动到的点旋转”,而B*A表示“旋转,然后向前移动,我们现在指向前方的位置”

你提到的答案采用了一条没有多大帮助的捷径

您始终有两个选择:

  • gl(操作)乘以左
  • glGet(tempmatrix),glLoadIdentity()gl(操作)glMultMatrix(tempmatrix)右乘

两个都试试!看看他们有什么不同。其中一个函数只需操作=平移和(0,0,数量)即可执行所需操作。

GL应用矩阵,因此
result=new\u multiplier*result
。它提供“自然”顺序-
glRotate
+
glTranslate
=先旋转,然后平移。如果需要相反的顺序,通常最好只是更改操作顺序。谢谢您的更正。我总是忘了:)我会把答案编辑成正确的。@keltar:恰恰相反。最后指定的矩阵是首先应用的矩阵。因此,如果你调用
glRotate
glTranslate
,平移首先应用于你的坐标,然后旋转。@RetoKoradi相反的顺序正是我告诉你的。关于其余部分,请参见“注释”部分。我有一种感觉,我们说的是同样的话,但用的是不同的词。@keltar:看看你的评论,你说的是“glRotate+glTranslate=rotate,然后translate”。这个调用序列先转换,然后轮换。opengl.org上这些手册页的格式在我的浏览器中不起作用。但是如果你看,它说“也就是说,如果M是当前矩阵,T是传递给glMultMatrix的矩阵,那么M被替换为M•T”,如果将向量乘以右边的列向量,这是正确的顺序。所以在你的符号中,这是
result=result*new\u乘法器
。矩阵运算的顺序是什么?(包括相机和图纸)。你反转相机矩阵吗?如果您准备好投入一些时间来了解3D图形编程中相机的工作原理,那么它将提供您想要的详细信息。一旦你理解了这一点,你应该能够自己编写代码。