2025. 3. 3. 01:45ㆍUnity 게임 프로그래밍/Unity 이해하기
1. Transform 회전 개요
유니티에서 객체의 회전을 제어할 때 주로 오일러 각(Euler Angles)과 쿼터니언(Quaternion)을 사용한다.
이 두 방식은 각각의 장단점이 있으며, 올바르게 사용하기 위해서는 그 수학적 배경을 이해하는 것이 중요하다.
1.1 오일러 각 (Euler Angles)
오일러 각은 X, Y, Z 축을 기준으로 회전을 순차적으로 적용하는 방식이다.
예를 들어, 유니티 트랜스폼 컴포넌트의 rotation에 (30, 45, 60)을 입력하면 X축으로 30°, Y축으로 45°, Z축으로 60°으로 회전하는 것을 의미한다.
Unity에서는 기본적으로 Z → X → Y 순서로 적용되며(Intrinsic Rotation 방식), 각 회전이 이전 축에 따라 변하는 방식이다.
① 장점
∙ 직관적인 이해가 쉽다.
∙ 각 축별 회전값을 쉽게 수정할 수 있다.
② 단점
∙ 짐벌 락(Gimbal Lock) 현상이 발생할 수 있다.
∙ 복잡한 회전을 표현하기 어렵다.
③ 수학적 표현


※ 짐벌 락(Gimbal Lock)
짐벌 락은 오일러 각을 사용할 때 발생할 수 있는 회전 문제로, 두 개 이상의 회전축이 겹침으로 인해 회전 축이 하나 감소하는 현상이다.
이로 인해 특정 방향으로의 회전이 불가능해지거나 예기치 않은 동작이 발생할 수 있다.
유니티에서는 트랜스폼 컴포넌트에 회전값(오일러 각)을 입력하면 쿼터니언으로 변환함으로써 짐벌락 문제를 방지한다.
1.2 쿼터니언 (Quaternion)
∙ 쿼터니언은 4차원 복소수로 표현되는 회전 방식으로, 하나의 스칼라 값(w)과 3개의 벡터 값(x, y, z)으로 구성된다.


쿼터니언은 회전 축과 각도를 기반으로 회전을 표현하며, 짐벌 락 없이 부드러운 회전이 가능하다.
오일러각에서 쿼터니언으로의 변환 공식

① 장점
∙ 짐벌 락 문제가 없다.
∙ 부드러운 회전과 보간이 가능하다.
② 단점
∙ 직관적으로 이해하기 어렵다.
∙ 디버깅이 까다롭다.
③ 유니티에서 쿼터니언과 오일러 각 변환 함수:
- 오일러 각 → 쿼터니언:
Quaternion q = Quaternion.Euler(30f, 45f, 60f);
- 쿼터니언 → 오일러 각:
Vector3 euler = q.eulerAngles;
2. Transform 회전 구현 방법
2.1. Transform.Rotate
∙ Transform.Rotate는 로컬 축 또는 월드 축을 기준으로 덧셈 방식으로 회전을 추가한다.
① 예제 코드
public float velocity;
void Update()
{
transform.Rotate(new Vector3(0, velocity, 0) * Time.deltaTime);
}

② 설명
매 프레임마다 Y축을 기준으로 velocity 속도로 회전한다.
③ 추천 사용처
∙ 연속적인 회전 애니메이션 (예: 바람개비, 레이더 회전)
∙ 입력에 따른 회전 조작 (예: 키보드 입력에 따른 캐릭터 회전)
2.2. Transform.rotation
∙ 객체의 절대적인 회전 값을 설정한다.
① 예제 코드
public Transform target;
void Update()
{
if (Input.GetKey(KeyCode.A))
{ // 객체를 정면으로 바라보게 설정
transform.rotation = Quaternion.identity;
}
else if (Input.GetKey(KeyCode.S))
{
// 다른 객체를 바라보게 회전
transform.rotation = Quaternion.LookRotation(target.position - transform.position);
}
}

② 설명
∙ Quaternion.identify: (0, 0, 0) 방향으로 설정
∙ Quaternion.LookRotation: 지정된 방향으로 설정
∙ target.position – transform.position: 현재 위치에서 target 방향으로 바라보도록 설정
③ 추천 사용처
∙ 정밀한 회전 설정 (예: 특정 방향으로 객체 배치)
∙ 특정 방향으로의 회전 적용 (예: 캐릭터가 목표 방향을 바라보도록 설정)
2.3. Quaternion.Lerp & Quaternion.Slerp
∙ 두 쿼터니언 사이를 보간하여 부드러운 회전을 구현할 수 있습니다.
① 예제 코드
∙ Lerp
public Transform target;
public float velocityInterpolation; // 보간 속도
void Update()
{
Quaternion targetRotation = Quaternion.LookRotation(target.position - transform.position);
transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, velocityInterpolation);
}

∙ Slerp
public Transform target;
public float velocityInterpolation; // 보간 속도
void Update()
{
Quaternion targetRotation = Quaternion.LookRotation(target.position - transform.position);
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, velocityInterpolation);
}

② 설명
현재 회전에서 목표 회전으로 부드럽게 전환한다.
③ 추천 사용처
∙ Lerp: 간단한 회전 전환 (예: UI 애니메이션, 낮은 정확도가 필요한 경우)
∙ Slerp: 자연스러운 회전 전환 (예: 캐릭터 회전, 카메라 회전, 정확도가 중요한 경우)
3. Transform 회전의 장단점
3.1. 장점
∙ 유연성: 다양한 회전 방법을 제공하여 원하는 방식으로 구현할 수 있다.
∙ 부드러운 전환: 쿼터니언을 이용해 부드러운 회전과 보간이 가능하다.
3.2. 단점
∙ 직관성 부족: 쿼터니언 기반 회전은 직관적으로 이해하기 어렵다다.
∙ 복잡성: 짐벌 락을 피하기 위한 추가적인 학습이 필요하다.
4. Transform 회전 시 주의사항
① 짐벌 락 방지: 복잡한 회전이 필요한 경우 오일러 각 대신 쿼터니언을 사용해야 한다.
② 로컬 vs 월드 좌표: 로컬 좌표 기준으로 회전할 경우 Transform.Rotate에서 Space.Self을 추가하거나 Transform.rotation 대신 Transform.localRotation을 사용한다.
// 로컬 좌표계 기준 회전
transform.Rotate(Vector3.up * 90, Space.Self);
transform.localRotation = Vector3.up * 90;
③ 보간 사용: 부드러운 회전 전환을 위해 Quaternion.Slerp를 사용한다.
④ 디버깅: 쿼터니언 값을 직접 디버깅하기 어렵기 때문에 디버깅이 필요한 경우 `eulerAngles`로 변환해 확인한다.
Debug.Log(transform.rotation.eulerAngles);'Unity 게임 프로그래밍 > Unity 이해하기' 카테고리의 다른 글
| Unity Transform 이동 (8) | 2025.01.10 |
|---|---|
| Unity Transform 이해하기 (3) | 2024.12.29 |