Unity 강의 정리 5-3장: C# 프로그래밍 [중급] (1/2) : 회전과 쿼터니언🎮

나무에물주기·2023년 8월 18일
1

Unity

목록 보기
12/21
post-thumbnail

인프런에 있는 레트로의 유니티 C# 게임 프로그래밍 에센스 강의를 듣고 정리하는 글입니다!

회전과 쿼터니언: 유니티에서의 3D 회전 🔄


1. 유니티에서 Rotation: 큐브 오브젝트의 회전 🎮

유니티에서 큐브 오브젝트의 회전을 제어하려면 먼저 큐브 오브젝트를 씬에 생성해야 한다. 이렇게 하려면:

  1. Hierarchy 창에서 마우스 오른쪽 버튼을 클릭합니다.
  2. 3D Object > Cube를 선택하여 큐브 오브젝트를 생성합니다.

큐브 오브젝트가 생성되면 회전을 조정할 수 있다. 이를 위해 SetRotation.cs 스크립트를 작성하고 큐브에 적용하자.

using UnityEngine;

public class SetRotation : MonoBehaviour
{
    void Start()
    {
        transform.rotation = Quaternion.Euler(60, 60, 60); // x, y, z 축에 대해 60도씩 회전
    }
}
  • Scripts 폴더를 만들고 그 안에 SetRotation.cs를 저장한다.
  • 스크립트를 작성한 후, 큐브 오브젝트를 선택하고 Inspector 창에서 Add Component 버튼을 클릭하여 SetRotation 스크립트를 추가한다.

이제 큐브는 게임이 시작될 때 x, y, z 축을 중심으로 각각 60도 회전한다.


2. Vector3를 쿼터니언으로 변환하는 방법 🔄

유니티에서 회전을 제어하려면 종종 Vector3 값을 쿼터니언으로 변환해야 할 수 있다. 이렇게 하려면 Quaternion.Euler 메서드를 사용하면 된다.

  1. Vector3 값 생성: 먼저 회전하려는 각도를 Vector3 값으로 정의한다. 이 값은 x, y, z 축을 중심으로 회전할 각도를 나타낸다.
Vector3 rotationVector = new Vector3(60, 60, 60); // 각 축을 중심으로 60도 회전
  1. 쿼터니언으로 변환: Quaternion.Euler 메서드를 사용하여 Vector3 값을 쿼터니언으로 변환한다. 이 메서드는 Vector3 값을 입력으로 받아 해당 각도로 회전하는 쿼터니언을 반환한다.
Quaternion quaternion = Quaternion.Euler(rotationVector);
  1. 회전 적용: 변환된 쿼터니언 값을 오브젝트의 회전에 적용할 수 있다.
transform.rotation = quaternion;

이렇게 하면 Vector3 값을 사용하여 오브젝트를 원하는 각도로 정확하게 회전시킬 수 있다.


3. 쿼터니언과 오일러 각 📐

쿼터니언오일러 각은 3D 공간에서 회전을 나타내는 두 가지 방법이다.

오일러 각

오일러 각은 3D 공간에서 회전을 표현하는 가장 직관적인 방법이다. x, y, z 축을 중심으로 각각 회전할 각도를 나타낸다.

Vector3 eulerRotation = new Vector3(60, 60, 60); // x, y, z 축에 대해 60도씩 회전

쿼터니언

쿼터니언은 복소수 확장으로, 3D 회전을 나타내기 위해 널리 사용된다. 쿼터니언은 4개의 부분으로 구성되며, 각 부분은 회전의 다른 측면을 나타낸다.

Quaternion quaternionRotation = Quaternion.Euler(60, 60, 60);

쿼터니언은 오일러 각보다 안정적이며, 복잡한 회전을 표현할 때 주로 사용된다.


4. 오일러 각의 문제점: 짐벌락 ⚠️

오일러 각은 간단하고 직관적이지만, "짐벌락"이라는 문제가 있다. 짐벌락은 두 회전 축이 정렬되어 하나의 자유도를 잃는 현상이다. 이로 인해 예기치 않은 회전이 발생할 수 있다.

예를 들어, 비행기가 거의 수직으로 올라갈 때, 특정 축을 중심으로 회전하는 능력을 잃을 수 있다. 이 문제는 쿼터니언을 사용함으로써 해결할 수 있다.


5. 쿼터니언 🧮

쿼터니언은 w, x, y, z의 네 가지 부분으로 구성된다.

Quaternion quaternion = new Quaternion(w, x, y, z);
  • w: 회전의 크기를 나타내며, cos(θ/2)로 계산된다.
  • x, y, z: 회전 축을 나타내며, 각 축에 sin(θ/2)을 곱한 값이다.

쿼터니언은 짐벌락 문제를 피할 수 있으며, 복잡한 3D 회전을 효과적으로 처리한다. 유니티에서는 Quaternion 클래스를 사용하여 쿼터니언 회전을 쉽게 관리할 수 있다.

Quaternion rotation = Quaternion.Euler(60, 60, 60); // 오일러 각을 쿼터니언으로 변환

쿼터니언은 선형 보간, 정규화 등 고급 회전 제어 기능을 제공하며, 복잡한 3D 애니메이션과 상호작용을 구현하는 데 필수적이다.


6. 유니티에서 Quaternion 함수 🎲

유니티에서는 여러 Quaternion 함수를 제공하여 회전을 쉽게 제어할 수 있다.

Quaternion.Euler

오일러 각을 쿼터니언으로 변환한다.

Quaternion rotation = Quaternion.Euler(45, 30, 60);

Quaternion.LookRotation

방향을 향한 회전을 생성한다. 예를 들어, 오브젝트가 특정 타겟을 향하게 하려면 이 함수를 사용할 수 있다.

Vector3 targetDirection = target.position - transform.position;
Quaternion rotation = Quaternion.LookRotation(targetDirection);

Quaternion.Lerp

두 쿼터니언 사이를 선형 보간한다. 부드러운 회전 효과를 만들 때 사용된다.

Quaternion rotation = Quaternion.Lerp(from, to, Time.deltaTime * speed);

7. 회전값끼리의 덧셈 🧮

쿼터니언은 회전을 나타내기 때문에, 단순히 더하면 안 된다. 올바른 방법은 쿼터니언을 곱하는 것이다.

쿼터니언끼리 합하기 (곱셈)

두 회전을 합치려면 쿼터니언을 곱해야 한다.

Quaternion combinedRotation = rotation1 * rotation2;

이 방법은 두 회전을 순차적으로 적용하는 것과 동일하다. 첫 번째 회전이 적용된 후 두 번째 회전이 적용된다.

Local 회전, Global 회전

유니티에서 회전을 적용할 때, Local 또는 Global 좌표계를 기준으로 할 수 있다.

  • Local 회전: transform.localRotation을 사용하여 부모 오브젝트에 대한 상대적인 회전을 설정한다.
  • Global 회전: transform.rotation을 사용하여 전역 좌표계에 대한 절대 회전을 설정한다.
transform.rotation *= Quaternion.Euler(0, 45, 0); // Global 회전
transform.localRotation *= Quaternion.Euler(0, 45, 0); // Local 회전
profile
개인 공부를 정리함니다

0개의 댓글