0

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

vec3 eye = vec3(0.0,0.0,-10.0);
vec3 to = vec3(0.0,0.0,0.0); // initial
vec3 up = vec3(0.0,1.0,0.0);

vec3 d = to - eye;

并在显示回调。

        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;

所以我的问题是,LookAt 功能只是让相机坐标?是否有任何旋转矩阵来使相机坐标?如您所见,我通过使用 LookAt 中没有的一些旋转来旋转我的相机,我将使用四元数来进行旋转。但是 LookAt() 使用一些旋转,我将实现 LookAt 的四元数版本以避免万向节锁定

4

1 回答 1

2

LookAt 所做的只是平移 T(因此新原点位于点 eye),然后是旋转 R。旋转是通过从 3 个向量(由从 eye 到中心的向量定义的方向,直接指定的上向量,以及定义为垂直于两者的右向量)。LookAt 产生的最终变压器是 R*T。

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

于 2013-04-28T16:19:19.467 回答