부트캠프/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을 사용합니다. 이유는 다음과 같습니다.
- 깜빡임 현상(Gimbal Lock) 방지
- 오일러 각도를 사용하면 특정 각도에서 축 하나가 고정되어 회전이 비정상적으로 동작하는 Gimbal Lock 문제가 발생함
- 쿼터니언은 4차원 회전 방식을 사용하므로 이 문제를 방지할 수 있음
- 부드러운 보간(Slerp, Lerp) 가능
- Quaternion.Lerp 또는 Quaternion.Slerp을 사용하면 자연스럽게 회전을 보간할 수 있음
- 오일러 각도를 사용하면 보간 중 예상치 못한 회전값이 나올 수 있음
- 연산 효율성
- 쿼터니언은 행렬보다 연산이 가볍고, 직접적인 회전 적용이 빠름
간단히 말하면, 쿼터니언을 사용하면 회전할 때 발생하는 문제를 방지하고 더 자연스럽고 안정적인 움직임을 만들 수 있습니다.