Opengl 关于LookAt()函数

Opengl 关于LookAt()函数,opengl,graphics,Opengl,Graphics,我需要实现一个四元数来旋转相机。在实现四元数之前,我使用LookAt(&eye,&at,&up)表示相机坐标(vpn、vup,…) 和在显示回调 m = LookAt(eye,to,up); glUniformMatrix4fv(ModelView,1,GL_TRUE,m); 并添加旋转(仍然是欧几里德旋转和键盘交互) 所以我的问题是,注视功能只是使摄像机保持坐标?是否有旋转矩阵使相机坐标?正如你们所看到的,我通过使用一些旋转来旋转我的相机,而不是在注视中,我

我需要实现一个四元数来旋转相机。在实现四元数之前,我使用LookAt(&eye,&at,&up)表示相机坐标(vpn、vup,…)

和在显示回调

        m = LookAt(eye,to,up);

        glUniformMatrix4fv(ModelView,1,GL_TRUE,m);
并添加旋转(仍然是欧几里德旋转和键盘交互)


所以我的问题是,注视功能只是使摄像机保持坐标?是否有旋转矩阵使相机坐标?正如你们所看到的,我通过使用一些旋转来旋转我的相机,而不是在注视中,我将使用四元数来旋转。然而,LookAt()使用了一些旋转,我将实现四元数版本的LookAt以避免万向节锁定

LookAt所做的一切都是平移T(使新原点位于点眼处),然后是旋转R。旋转是通过从3个向量构建正交基来定义的(由从眼睛到中心的向量定义的方向,直接指定的上方向向量,以及定义为垂直于两者的右方向向量)。LookAt生成的最终变换为R*T


如果正确指定输入向量,则可以使用LookAt而不会出现任何万向节锁定问题,但也可以通过位置向量(定义T)和方向四元数(定义R)来描述相机,并且根本不需要使用LookAt。

这是事实,它是第一个应用于LooAt的t和R变换。我也在这段视频中看到了一些讨论:但我不知道为什么我们不能应用R和t。你有什么解释吗?@Narek:每个仅考虑旋转和平移的变换矩阵都可以被反编译转换成
M=T1*R
M=R*T2
形式,只是翻译值本身在这两种形式之间会发生变化。
        m = LookAt(eye,to,up);

        glUniformMatrix4fv(ModelView,1,GL_TRUE,m);
        case 'a':
                temp = RotateX(1.0) * vec4(d,0);
                temp1 = RotateX(1.0) * vec4(up,0);
                d = vec3(temp.x, temp.y, temp.z);
                up = vec3(temp1.x, temp1.y, temp1.z);
                eye = to - d;
                break;
        case 'd':
                temp = RotateY(1.0) * vec4(d,0);
                temp1 = RotateY(1.0) * vec4(up,0);
                d = vec3(temp.x, temp.y, temp.z);
                up = vec3(temp1.x, temp1.y, temp1.z);
                eye = to - d;
                break;