如何正确地使用四元数进行旋转

时间:2018-11-01 18:52:20

标签: c++ opengl 3d rotation quaternions

因此,我正在尝试制作一个摄像头,该摄像头可以查看我创建的对象,并且该对象应响应鼠标和键盘输入而旋转。鼠标提供俯仰和偏航旋转,而键盘则控制滚动。

到目前为止,我所管理的是此类代表四元数相机的课程:

QuaternionCamera::QuaternionCamera(vec3 direction)
{
    this->initial_state = quat(1, 0, 0, 0);
    this->distance = direction;
}

void QuaternionCamera::RotateCamera(float Xangle, float Yangle, float Zangle) {
    quat temp = initial_state.qFromAngleAxis(Xangle, vec4(1,0,0,1));
    quat temp2 = temp * initial_state.qFromAngleAxis(Yangle, vec4(0,1,0,1));
    quat temp3 =  temp2 * initial_state.qFromAngleAxis(Zangle, vec4(0, 0, 1, 1));
    initial_state = initial_state * temp3;
    initial_state = initial_state.qNormalize();
}

mat4 QuaternionCamera::ViewMatrix() {
    mat4 rotatingMatrixFromQuaternion = initial_state.qGLMatrix(initial_state, mat4());
    mat4 res = MatrixFactory::translationMatrix(distance);
    return res*rotatingMatrixFromQuaternion;
}

这是非常简单的,单击并移动鼠标时,使用RotateCamera(Pitch,Yaw,0)调用RotateCamera函数,按下键盘时,我使用RotateCamera(0,0,Roll)调用它)。这里的问题是对象绕着怪异的轴旋转,而不是绕着自己的轴旋转。

要正确理解我要达到的目标,请观看以下视频: Video of Quaternion Functioning

1 个答案:

答案 0 :(得分:1)

您错误地计算了四元数。

您的相机应具有四元数Q,我相信这是您的initial_state。 当您要旋转方向时,只需要像平时一样计算一个新的四元数(四元数),然后将其应用到左边即可。

由于四元数不是可交换的,因此必须以正确的顺序应用它,即Q2 * Q1,其中Q2是新的四元数,而Q1是旧的四元数。