【问题标题】:How To Properly do Rotations With Quaternions如何正确使用四元数进行旋转
【发布时间】:2019-04-06 01:10:56
【问题描述】:

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

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

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 )。这里的问题是对象绕着奇怪的轴旋转,而不是绕着自己的轴旋转。

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

【问题讨论】:

    标签: c++ opengl 3d rotation quaternions


    【解决方案1】:

    你计算错了你的四元数。

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

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

    【讨论】:

      猜你喜欢
      • 2014-04-30
      • 2018-11-17
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-09
      • 2022-10-17
      • 2019-08-28
      • 1970-01-01
      相关资源
      最近更新 更多