我正在改变相机的位置和方向根据鼠标移动和按下的按钮。
为了将相机向前移动5个单位(例如)根据其方向移动,我使用以下代码:
float mview[16];
glGetFloatv(GL_MODELVIEW_MATRIX, mview);
translate_forward_camera += 5; //I have translate_right_camera and
//translate_up_camera variables too
glLoadIdentity();
glTranslatef(0, 0, 5);
glMultMatrixf(mview);
同样向两侧移动。
但是,我不知道如何在不改变位置的情况下改变相机的方向。我正在(0,0,0)绕着自己旋转相机。 之前的 y , x 旋转角度为:
old_x_ang, old_y_ang
新的 y , x 旋转角度(我需要使用此角度将相机旋转到(0,0,0)) 是:
x_ang, y_ang
如果我将使用以下代码,相机位置将会改变:
glLoadIdentity();
glTranslatef(translate_right_camera,translate_up_camera,translate_forward_camera);
glRotatef(x_ang,1,0,0);
glRotatef(y_ang,0,1,0);
如何在不改变位置的情况下旋转相机?
答案 0 :(得分:1)
在典型情况下,视图矩阵可以分解为两个单独的转换:
您可能已经从世界空间中的对象放置中学习过,您通常首先(围绕对象的原点)进行漫游,然后将对象转换为世界空间的最终位置。由于固定函数GL变换使用矩阵* colum-vector约定,因此必须将操作定义为T * R以获得先旋转然后平移的效果。
这就是你在这里做的事情。它不起作用。原因是视图矩阵没有将相机放置在世界中,而是顶点变换的一部分,以从顶点从世界空间转换到视图空间 - 因此视图矩阵是逆 。通常对于你得到的矩阵(A * B)^ - 1 = B ^ -1 * A ^ -1。
所以这意味着在我们的情况下T是相机世界位置的倒数,R是反向旋转,你必须应用R * T.这也是完全有意义的,因为T将顶点转换成视图空间,原点是摄像机位置,然后围绕该本地原点旋转以旋转摄像机而不改变其位置。所以你要做的就是如果转换序列那么将glTranslate()
调用到最后。
我通常建议你停止使用GL矩阵堆栈,不仅因为它已被弃用而且在现代GL中不可用,而且因为从GL读取矩阵效率非常低。
答案 1 :(得分:0)
先旋转,然后翻译。通常,您希望先缩放,然后旋转,然后按相反的顺序翻译 。对于ModelViewProjection矩阵,通常看起来像这样:
MVP = ProjectionViewMatrix * translationMatrix * rotationMatrix * scaleMatrix;