首页 > 解决方案 > 如何在两个四元数之间获得 Vector3 旋转

问题描述

我正在编写一个Rigidbody使用 a旋转 a 的脚本Configurable Joint。我已经targetRotation弄清楚了,但现在我正在努力解决targetAngularVelocity,如果设置正确,这应该可以帮助我避免晃动。

targetAngularVelocity文档中是这样定义的:“这是一个Vector3。它定义了关节应该旋转到的所需角速度”。问题是我不知道如何Vector3基于两个Quaternions- 对象的当前旋转和目标旋转来获得它。

我没有正确理解它吗?是否有一个函数可以返回基于两个的旋转向量Quaternions

标签: c#unity3dquaternions

解决方案


所以在数学上,四元数代表刚体的方向。首先考虑前向问题,看看方向q_1在应用旋转速度ω t时间后如何转换为另一个方向q_2 。

数学上,旋转矢量的大小为ω和方向k,使得ω = ω* k

这是通过四元数乘法完成的

q_2 = q_ω * q_1

其中q_ω表示绕k轴旋转角度 θ=ω*t。

反过来,你需要找到q_ω

var q_ω = q_2 * Quaternion.Inverse(q_1);

并提取旋转轴和角度

q_ω.ToAngleAxis(out float angle, out Vector3 axis);

并组成旋转速度矢量,以time秒为单位对应于该变换。

var ω = (angle/time)*axis;

推荐阅读