关于LookAt()函数

时间:2013-04-28 15:55:49

标签: opengl graphics

我需要实现四元数来旋转相机。在实现四元数之前,我使用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的四元数版本以避免万向节锁定

1 个答案:

答案 0 :(得分:2)

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

如果正确指定输入向量,可以使用LookAt而不会出现任何云台锁定问题,但您也可以通过位置向量(定义T)和方向四元数(定义R)来描述您的相机,而不必使用一点看。