언리얼 엔진에서 FRotator와 FQuat은 모두 회전을 표현하는 구조체이다.
하지만 차이점이 존재하고 각자 장단점과 사용목적이 다르다.
FRotator와 FQuat의 차이점
FRotator
구성요소:
- Pitch(y축), Yaw(z축), Roll(x축)
형태:
- 오일러 각(Euler Angles)로 회전을 표현
장점:
- 직관적: 사람이 이해하기 쉽고, 에디터 UI와 직결되어있다.
- 특정 축을 기준으로 회전을 조정하거나 디버깅할 때 유용하다.
단점:
- Gimbal Lock 문제: 특히 90도 회전 근처에서 두 축이 겹쳐져 특정 회전 값에서 하나의 자유도를 잃는 문제 발생
- y축으로 90도 회전하였을 경우, 우측과 같이 x축과 z축이 겹치게 된다.
- 이로 인해 3축 회전이 아니라 2축 회전만 가능하게 되고, 결과적으로 회전을 정확하게 표현하거나 구현할 수 없는 문제가 발생할 수 있다.
FQuat
구성요소:
- x, y, z, w (4D 벡터로 회전 표현)
형태:
- 쿼터니언(Quaternion)으로 회전을 표현
장점:
- 오일러각 방식의 Gimbal Lock을 방지한다.
- 회전 간의 보간에 강하다.(부드러운 회전 애니메이션 구현에 유리)
- 더 빠르고 효율적인 계산이 가능하다.
단점:
- 사람이 직관적으로 이해하기 어렵다.
- 에디터나 디버깅 단계에서 확인하기 어렵다.
사용하는 경우:
- 연속적인 회전 연산이 필요한 경우
- 보간을 사용하는 경우(카메라 회전, 캐릭터 회전)
- 빠르고 정확한 계산이 필요한 경우
- 복잡한 3D 회전 변환을 다루는 경우(회전 축이 끊임없이 변하는 객체)
FRotator와 FQuat 변환
- FRotator → FQuat
FRotator Rotator(0.f, 90.f, 0.f);
FQuat Quat = FQuat(Rotator);
- FQuat → FRotator
FQuat Quat(FRotator(0.f, 90.f, 0.f));
FRotator Rotator = Quat.Rotator();
변환 시 주의점
// RotationSpeed = 90.0f
if (!FMath::IsNearlyZero(RotationSpeed))
{
FRotator Rotator(0.0f, 90.0f, 0.0f);
FQuat ZRotation(Rotator * DeltaTime);
AddActorLocalRotation(ZRotation);
}
if (!FMath::IsNearlyZero(RotationSpeed))
{
// Z를 회전축으로 설정
FVector RotationAxix(0.0f, 0.0f, 1.0f);
// 각도(라디안)
float RotationAngle = FMath::DegreesToRadians(DeltaTime * RotationSpeed);
//Z축 90도 회전
FQuat ZRotation(RotationAxix, RotationAngle);
AddActorLocalRotation(ZRotation);
}
- 첫 번째의 경우 Rotator 내부의 오일러 각이 이미 Gimbal Lock을 겪었을 가능성이 있기 때문에, 결과적으로 쿼터니언도 Gimbal Lock의 영향을 받은 회전 데이터를 포함하게 될 가능성이 있다. 그러므로 Gimbal Lock을 방지하기 위해선 이와 같은 방식으로 접근하면 안된다.
- 쿼터니언은 회전을 단일 축(RotationAxix)과 각도(RotationAngle)를 기반으로 정의한다.
- 두 번째의 경우, FQuat 생성자에 FVector 축과 각도(라디안)을 명확히 설정하여 Gimbal Lock을 방지할 수 있다.
- 쿼터니안 계산에서 회전 각도는 라디안 단위로 사용되므로, FMath::DegreesToRadians 메서드를 통해 각도를 라디안으로 변경하였다.
'내배캠 > Unreal Engine' 카테고리의 다른 글
StaticClass( ) 메서드 (0) | 2025.01.22 |
---|---|
부동 소수점 연산 오차 (0) | 2025.01.21 |
액터의 라이프 사이클 (0) | 2025.01.21 |
로그 카테고리 사용자 정의 (0) | 2025.01.21 |
정적 초기화와 런타임 로드 (0) | 2025.01.20 |