gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:27:36 30 4
gpt4 key购买 nike

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

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

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

最佳答案

您计算的四元数错误。

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

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

关于c++ - 如何正确地使用四元数进行旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53107578/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com