FRotator와 FQuat

2025. 1. 21. 15:15·내배캠/Unreal Engine
언리얼 엔진에서 FRotator와 FQuat은 모두 회전을 표현하는 구조체이다.
하지만 차이점이 존재하고 각자 장단점과 사용목적이 다르다.

 

 

FRotator와 FQuat의 차이점

 

FRotator

구성요소:

  • Pitch(y축), Yaw(z축), Roll(x축)

형태:

  • 오일러 각(Euler Angles)로 회전을 표현

장점: 

  • 직관적: 사람이 이해하기 쉽고, 에디터 UI와 직결되어있다.
  • 특정 축을 기준으로 회전을 조정하거나 디버깅할 때 유용하다.

단점:

  • Gimbal Lock 문제: 특히 90도 회전 근처에서 두 축이 겹쳐져 특정 회전 값에서 하나의 자유도를 잃는 문제 발생

오일러 각을 짐벌이라는 장치를 사용해 시각화 / y축으로 90도 회전을 하였을 경우, 우측과 같이 x축과 z축이 겹치게 된다.

  • 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
액터의 라이프 사이클  (1) 2025.01.21
로그 카테고리 사용자 정의  (0) 2025.01.21
정적 초기화와 런타임 로드  (0) 2025.01.20
'내배캠/Unreal Engine' 카테고리의 다른 글
  • StaticClass( ) 메서드
  • 부동 소수점 연산 오차
  • 액터의 라이프 사이클
  • 로그 카테고리 사용자 정의
동그래님
동그래님
  • 동그래님
    개발자 동그래
    동그래님
  • 전체
    오늘
    어제
    • 분류 전체보기 (210)
      • 공부 (51)
        • Code Cata (50)
      • 내배캠 (151)
        • TIL (50)
        • C++ (37)
        • Unreal Engine (48)
        • GAS(Gameplay Ability System.. (16)
      • Project (7)
        • Gunfire Paragon (5)
        • Arena Fighters (1)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    동그래님
    FRotator와 FQuat
    상단으로

    티스토리툴바