![def1150ac96190156152cc7ee1fa53e5.png](https://i-blog.csdnimg.cn/blog_migrate/b82574fff9787e70518ee2f64b0e8d48.jpeg)
上一篇 在写3D空间中的旋转时,对四元数做了基本推导,限于篇幅没有进一步展开。这篇结合UE4的四元数,来稍微写一下。
UE4中的四元数示例
UE4中四元数的数据结构为 FQuat,参见 Quat.h。表达四元数的4个变量为 X/Y/Z/W,如下:
MS_ALIGN(16) struct FQuat
{
public:
/** The quaternion's X-component. */
float X;
/** The quaternion's Y-component. */
float Y;
/** The quaternion's Z-component. */
float Z;
/** The quaternion's W-component. */
float W;
......
四元数的乘法实现,参见 UnrealmathSSE.h (分析下面代码可知,UE4的这个四元数乘法,跟上一篇 中的四元数乘法律一致):
FORCEINLINE VectorRegister VectorQuaternionMultiply2( const VectorRegister& Quat1, const VectorRegister& Quat2 )
{
VectorRegister Result = VectorMultiply(VectorReplicate(Quat1, 3), Quat2);
Result = VectorMultiplyAdd( VectorMultiply(VectorReplicate(Quat1, 0), VectorSwizzle(Quat2, 3,2,1,0)), GlobalVectorConstants::QMULTI_SIGN_MASK0, Result);
Result = VectorMultiplyAdd( VectorMultiply(VectorReplicate(Quat1, 1), VectorSwizzle(Quat2, 2,3,0,1)), GlobalVectorConstants::QMULTI_SIGN_MASK1, Result);
Result = VectorMultiplyAdd( VectorMultiply(VectorReplicate(Quat1, 2), VectorSwizzle(Quat2, 1,0,3,2)), GlobalVectorConstants::QMULTI_SIGN_MASK2, Result);
return Result;
}
UE4的四元数也是基于
即,已知
FORCEINLINE float FQuat::GetAngle() const
{
return 2.f * FMath::Acos(W);
}
......
FORCEINLINE FVector FQuat::GetRotationAxis() const
{
// Ensure we never try to sqrt a neg number
const float S = FMath::Sqrt(FMath::Max(1.f - (W * W), 0.f));
if (S >= 0.0001f)
{
return FVector(X / S, Y / S, Z / S);
}
return FVector(1.f, 0.f, 0.f);
}
UE4中四元数对方向向量的旋转是怎么施加的呢?Well,参考上一篇 的推导可知,对任意三维向量