[UE4][线性代数]已知方向向量,求该向量与空间坐标轴的夹角
keywords: [UE4][线性代数]已知方向向量,求该向量与空间坐标轴的夹角
原始的数学公式不列举了,需要的话找个Math库看下源码。这里以UE4的API说明:
情况一:已知两个坐标点,求连线与空间坐标的夹角
已知空间中两个点FVector V1, V2,方向向量V3 = V2 - V1,求V3与空间坐标的夹角:
FRotator R = (V2 - V1).Rotation();
情况二:单个向量与世界坐标的夹角
已知方向向量Vector V1,求V1与空间坐标轴的夹角Rotator R1:即将Vector转换为Rotator
FRotator R1 = FVector(100.f, 100.f, 0.f).Rotation();
FRotator R2 = FVector(-100.f, -100.f, 0.f).Rotation();
FRotator R3 = FVector(100.f, 0.f, 0.f).Rotation();
FRotator R4 = FVector(0.f, 100.f, 0.f).Rotation();
结果分别是:
R1 = {Pitch=0.0 Yaw=45.0 Roll=0.0 }
R2 = {Pitch=0.0 Yaw=-135.0 Roll=0.0 }
R3 = {Pitch=0.0 Yaw=0.0 Roll=0.0 }
R4 = {Pitch=0.0 Yaw=90.0 Roll=0.0 }
FVector::Rotation()函数的内部实现(局部):
FRotator R;
// Find yaw.
R.Yaw = FMath::Atan2(Y,X) * (180.f / PI);
// Find pitch.
R.Pitch = FMath::Atan2(Z,FMath::Sqrt(X*X+Y*Y)) * (180.f / PI);
// Find roll.
R.Roll = 0;
return R;
情况三:两个空间向量的夹角度数
FVector V1 = ...;
FVector V2 = ...;
float Angle = FMath::RadiansToDegrees(acosf(FVector::DotProduct(V1.GetSafeNormal(), V2.GetSafeNormal())));
运算结果值的范围为:0到180。
求点积时的两个向量一定要是单位向量,否则计算结果会大于Pi(正常范围是0到Pi)。