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

问题描述 投票:0回答:1

所以我正在尝试制作一个可以看到我创建的对象的相机,该对象应该响应鼠标和键盘输入而旋转。鼠标提供俯仰和偏航旋转,键盘处理滚动。

到目前为止我管理的是这个代表四元数相机的类:

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函数用RotateCamera(Pitch,Yaw,0)调用,当按下键盘时我用RotateCamera(0,0,Roll)调用它。这里的问题是物体围绕奇怪的轴旋转而不是围绕其自身的轴旋转。

要正确理解我想要实现的目标,请参阅此视频:qazxsw poi

c++ opengl 3d rotation quaternions
1个回答
1
投票

您正在计算四元数是错误的。

你的相机应该拿着Quaternion Q,我相信这是你的initial_state。当你想要旋转你的方向时,你只需要像你一样计算一个新的四元数(quat temp)并将它应用于左边。

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

© www.soinside.com 2019 - 2024. All rights reserved.