부트캠프/Unity [ 스파르타 ]

[스파르타 ][TIL] 유니티 스파르타 7기 38일차 - 쿼터니언에 대해서

맏난거 2025. 3. 17. 22:40

1. 카메라 회전 코드 (C#)

using UnityEngine;

public class FirstPersonCamera : MonoBehaviour
{
    public float mouseSensitivity = 100f; // 마우스 감도
    public Transform playerBody; // 플레이어 몸체 (회전할 대상)
    
    private float xRotation = 0f; // X축 회전 값

    void Start()
    {
        Cursor.lockState = CursorLockMode.Locked; // 마우스 커서 고정
    }

    void Update()
    {
        float mouseX = Input.GetAxis("Mouse X") * mouseSensitivity * Time.deltaTime;
        float mouseY = Input.GetAxis("Mouse Y") * mouseSensitivity * Time.deltaTime;

        xRotation -= mouseY;
        xRotation = Mathf.Clamp(xRotation, -90f, 90f); // X축 회전 제한 (고개가 360도 도는 걸 방지)

        transform.localRotation = Quaternion.Euler(xRotation, 0f, 0f); // 상하 회전 (카메라)
        playerBody.Rotate(Vector3.up * mouseX); // 좌우 회전 (플레이어 몸체)
    }
}

 

  • mouseX: 마우스의 X축 움직임을 받아 좌우 회전 적용
  • mouseY: 마우스의 Y축 움직임을 받아 위아래 회전 적용
  • xRotation: 고개를 위아래로 돌릴 때 90도를 넘지 않도록 Mathf.Clamp 사용
  • Quaternion.Euler(xRotation, 0f, 0f): 오일러 각도를 쿼터니언으로 변환해 회전 적용

2. 유니티가 Quaternion을 사용하는 이유

유니티는 회전을 표현할 때 Vector3(오일러 각도) 대신 Quaternion을 사용합니다. 이유는 다음과 같습니다.

  1. 깜빡임 현상(Gimbal Lock) 방지
    • 오일러 각도를 사용하면 특정 각도에서 축 하나가 고정되어 회전이 비정상적으로 동작하는 Gimbal Lock 문제가 발생함
    • 쿼터니언은 4차원 회전 방식을 사용하므로 이 문제를 방지할 수 있음
  2. 부드러운 보간(Slerp, Lerp) 가능
    • Quaternion.Lerp 또는 Quaternion.Slerp을 사용하면 자연스럽게 회전을 보간할 수 있음
    • 오일러 각도를 사용하면 보간 중 예상치 못한 회전값이 나올 수 있음
  3. 연산 효율성
    • 쿼터니언은 행렬보다 연산이 가볍고, 직접적인 회전 적용이 빠름

간단히 말하면, 쿼터니언을 사용하면 회전할 때 발생하는 문제를 방지하고 더 자연스럽고 안정적인 움직임을 만들 수 있습니다.