天天看點

Unreal Engine 4:學習筆記(三)坐标變換相關API簡要使用說明

FRotator (float pitch, float yaw, float roll)
           

Pitch     俯仰

Rotation around the right axis (around Y axis), Looking up and down (0=Straight Ahead, +Up, -Down)

Yaw     偏航

Rotation around the up axis (around Z axis), Running in circles 0=East, +North, -South.

Roll     翻滾

Rotation around the forward axis (around X axis), Tilting your head, 0=Straight, +Clockwise, -CCW.

FRotationMatrix中存放物體相對于世界坐标系的旋轉角度資訊

FRotationMatrix.GetScaledAxis(EAxis::X);
           

此函數的傳回值為:在物體的局部坐标系中指向X軸的向量,當轉換成世界坐标系後此向量的值為多少

下面是三個例子:

1.

FVector v1 = FRotationMatrix(FRotator(90, 0, 0)).GetScaledAxis(EAxis::X);
FVector v2 = FRotationMatrix(FRotator(90, 0, 0)).GetScaledAxis(EAxis::Y);
FVector v3 = FRotationMatrix(FRotator(90, 0, 0)).GetScaledAxis(EAxis::Z);
UE_LOG(LogTemp, Log, TEXT("v1: %s, v2: %s, v3: %s"),*v1.ToString(), *v2.ToString(), *v3.ToString());
           

輸出結果:

LogTemp: v1: X=-0.000 Y=-0.000 Z=1.000, v2: X=0.000 Y=1.000 Z=0.000, v3: X=-1.000 Y=0.000 Z=-0.000
           

2.

FVector v1 = FRotationMatrix(FRotator(0, 90, 0)).GetScaledAxis(EAxis::X);
FVector v2 = FRotationMatrix(FRotator(0, 90, 0)).GetScaledAxis(EAxis::Y);
FVector v3 = FRotationMatrix(FRotator(0, 90, 0)).GetScaledAxis(EAxis::Z);
UE_LOG(LogTemp, Log, TEXT("v1: %s, v2: %s, v3: %s"),*v1.ToString(), *v2.ToString(), *v3.ToString());
           

輸出結果:

LogTemp: v1: X=-0.000 Y=1.000 Z=0.000, v2: X=-1.000 Y=-0.000 Z=-0.000, v3: X=-0.000 Y=-0.000 Z=1.000
           

此處v1,v2中向量的方向與與設想的相反,是因為yaw軸的方向正好與世界坐标中的Z方向相反

3.

FVector v1 = FRotationMatrix(FRotator(0, 0, 90)).GetScaledAxis(EAxis::X);
FVector v2 = FRotationMatrix(FRotator(0, 0, 90)).GetScaledAxis(EAxis::Y);
FVector v3 = FRotationMatrix(FRotator(0, 0, 90)).GetScaledAxis(EAxis::Z);
UE_LOG(LogTemp, Log, TEXT("v1: %s, v2: %s, v3: %s"),*v1.ToString(), *v2.ToString(), *v3.ToString());
           

輸出結果:

LogTemp: v1: X=1.000 Y=0.000 Z=0.000, v2: X=0.000 Y=-0.000 Z=-1.000, v3: X=-0.000 Y=1.000 Z=-0.000
           

順便也說一下FTransform、FMath、FVector的部分用法:

1.

FTransform(CameraRotation).TransformVector(MuzzleOffset);  
           

将局部坐标系統中的向量值轉化成世界坐标系中的向量值

2.

T FMath::Clamp(const T X, const T Min, const T Max) 
           

若X < Min, 則傳回Min

若X > Max, 則傳回Max

若X >= Min && X <= Max, 則傳回X

3.

FVector FVector::GetClampedToMaxSize(float MaxSize)
           

建立一個新vector,方向與原vector相同,長度等于MaxSize

 4.

FVector FVector::GetClampedToSize(float Min,float Max) 
           

建立一個新vector,方向與原vector相同,長度等于:

若長度 < Min, 則新vector長度等于Min

若長度 > Max, 則新vector長度等于Max

若長度 >= Min && 長度 <= Max, 則新vector等于原vector

5.求兩FVector之間的角度

float Angle = FMath::RadiansToDegrees(FMath::Acos(FVector::DotProduct(ForwardVector.GetClampedToSize(1, 1), FinalVector.GetClampedToSize(1, 1))));
           

參考文檔:

pitch yaw roll是什麼

繼續閱讀