GameEngine/Unity

객체의 회전에 대하여

chinodaiski 2025. 2. 3. 19:12

1. 회전 방법: 오일러각 vs 쿼터니언

회전의 경우 오일러각이라 불리는 x, y, z 축을 가지고 객체를 회전시키게 되는데, 행렬을 사용해 카메라를 조작하다보면 축이 겹치는 상황에서 객체의 회전이 180도 돌아버리는 상황이 나온다. 이를 짐벌락이라 한다. 

 

짐벌락은 오일러 각에서 발생하는 회전 순서에 의해 발생하는 문제이다. 즉, 오일러 각은 회전 순서가 고정되어 있기 때문에, 예를 들어 첫 번째 축으로 회전한 후 두 번째 축을 회전시키면, 첫 번째 축의 회전이 두 번째 축에 영향을 미쳐서 비정상적인 회전 결과가 나오는 것이다. 이때 두 축이 평행해져서 더 이상 회전이 제대로 이루어지지 않으며, 이 상태를 짐벌락이라고 한다.

이 문제를 해결하기 위해 쿼터니언을 사용한다. 쿼터니언은 짐벌락 현상을 피할 수 있게 해주는 수학적 방법이다. 오일러 각은 특정 각도로 세팅할 때는 편리하지만, 점진적인 회전에서는 쿼터니언이 더 적합하다.


2. 쿼터니언의 회전 함수

쿼터니언에는 RotateTowards, Lerp, Slerp 등 여러 함수들이 존재한다.

 

2.1 RotateTowards

RotateTowards는 일정한 속도를 기반으로 회전한다. 목표 각도로 일정 속도로 가까워지며, 최종적으로 정확한 목표 각까지 도달한다.

 

2.2 Lerp

Lerp는 비율대로 회전하면서 그 안에서 선형 보간(직선)으로 회전한다. 회전 속도는 일정한 비율로 설정되며, 목표 각도까지 일정한 비율로 회전한다.

 

2.3 Slerp

Slerp는 비율대로 회전하면서 그 안에서 구면 보간(호)으로 회전한다. 구면 보간은 회전의 각도와 관계없이 부드럽고 자연스러운 회전을 만들어주며, 회전각이 커질수록 더 빠르게 회전하여, 시각적으로 더 부드럽고 일관성 있게 느껴진다.

 

3. 회전 함수들의 차이점

Lerp는 회전각이 크면 일정하게 회전하기에 작을 때와 똑같은 속도로 회전해 각이 클 시 이상하게 보인다.
Slerp는 회전각이 클수록 중간에 더 빠르게 회전하여 각도에 상관없이 부드러운 움직임을 보인다. 단, Lerp에 비해 더 많은 연산을 잡아먹는다는 단점이 있다.

 

4. 정확한 회전 도달

RotateTowards는 특정 각에 도달할 때까지 일정하게 움직이고, 최종적으로 그 각까지 회전하지만, Lerp와 Slerp는 비율로 보간되기에 정확하게 설정한 값까지 도달하지 않을 수 있다. 물론 그렇다고 해도 인게임에서 볼 시 육안으로 확인할 수 없을 정도니 신경 쓸 필요는 없다.

 

5. 결론

결론은 플레이어의 회전이나 카메라의 회전 등 객체의 자연스러운 회전을 위해선 Slerp를 사용하는 것이 제일 좋다는 것이다. Slerp는 부드럽고 자연스러운 회전이 가능하고, 쿼터니언을 사용하기에 짐벌락 문제 없이 안정적으로 회전할 수 있다.