matlab 角度转四元数_实时渲染中的坐标系变换(7):UE4四元数补充

def1150ac96190156152cc7ee1fa53e5.png

上一篇 在写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,参考上一篇 的推导可知,对任意三维向量

,可以将其构造成四元数
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值