use*_*210 1 3d rotation quaternions
我的方向用四元数表示,角速度表示为四元数或数字(围绕原始方向的弧度/秒)。我知道如何使用转换为轴角的方法来做到这一点,但是该方法在计算上相当昂贵,而且不是现实的选择。给定时间间隔(以秒为单位),我将如何修改方向四元数?我需要两种情况(四元数和数字)的解决方案。但是,将一种情况转换为另一种情况是可以接受的,并且可能会更好,具体取决于转换所需的各种算法/公式的计算复杂性。
要更新方向,您需要将当前方向乘以增量旋转。与轴角度转换相比,这是可比的昂贵操作。
表示角速度的常见方法是与旋转轴和旋转速度(弧度/秒)平行的3d向量中的“指数图”。转换为增量旋转四元数看起来像
Quaternion deltaRotation(const Vector3& em, double deltaTime)
{
Quaternion q;
Vector3 ha = em * deltaTime *0.5; // vector of half angle
double l = ha.norm(); // magnitude
if( l > 0 )
{
double ss = sin(l)/l;
q = Quaternion(cos(l), ha.x()*ss, ha.y()*ss, ha.z()*ss);
}else{
q = Quaternion(1.0, ha.x(), ha.y(), ha.z());
}
return q;
}
Run Code Online (Sandbox Code Playgroud)
如果您的deltaTime小且转速小,则可以使用1st Taylor级数乘数的近似值。但是您应该对结果四元数进行归一化,以避免更多的数值不稳定。
Quaternion deltaRotationAppx1(const Vector3& em, double deltaTime)
{
Vector3 ha = em * deltaTime *0.5; // vector of half angle
return Quaternion(1.0, ha.x(), ha.y(), ha.z());
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3157 次 |
| 最近记录: |