본문 바로가기

[Unity] 트랜스폼(Transform) 회전(Rotation)

·
2019. 11. 21. 16:27
반응형

짐벌락(Gimbal Lock)

먼저 짐벌락을 설명하기 전에 오일러각(Euler angle)에 대해서 이해해야 합니다. 오일러각은 3차원 공간에서 강체가 놓인 방향을 표시하기 위해 도입한 오일러가 도입한 세 개의 각도입니다. x축을 롤(roll), y축을 피치(pitch), z축을 요(yaw)라고도 부릅니다.

오일러각을 이용해서 물체를 회전하다보면 두 축이 한 축으로 되는 현상이 발생합니다. 이를 짐벌락이라고 합니다. 짐벌락은 두 축이 한축으로 되기 때문에 한 축이 제 역할을 못하게 되는 현상입니다. 한 축으로 회전함에도 불구하고 다른 축들이 영향을 받는 이유는 축들이 서로 연결되어있기 때문입니다.

이해를 돕기 위해 예를 들어 보겠습니다. 아래 하이어라키 구조를 보면 x축(빨간색)은 y축(초록색)에 연결되어 있고, z축(파란색)은 x축에 연결되어 있습니다. x축이 회전을 하게 되면 y축과 z축이 겹쳐지게 되는데 바로 이것이 짐벌락입니다.

이해가 되지 않으신다면 유튜브에 짐벌락 현상에 대한 더 자세한 영상이 있습니다. 참조 바랍니다.

쿼터니언(Quaternion)

유니티에서는 짐벌락 문제 때문에 회전에 대한 값으로 쿼터니언을 사용합니다. 다른말로는 사원수 또는 해밀턴 수 라고도 하는데 복소수를 확장해서 만든 수 체계입니다. 쿼터니언은 4개의 실수 성분을 가집니다. 쿼터니언을 사용하면 짐벌락 문제를 해결할 수 있습니다.

Transform.Rotation

Transform.Rotation은 게임오브젝트의 절대적인 회전 각도를 나타냅니다. 회전은 쿼터니언으로 되어있기 때문에 우리가 일반적으로 알고 있는 Vector3의 오일러각도를 쿼터니언으로 변환해서 대입해야 합니다.

Quaternion.Euler(x, y, z)를 사용하면 Vector3의 오일러각도를 쿼터니언으로 변환해 줍니다.
다음은 Transform.Rotation의 예제 코드입니다.

transform.Rotation = Quaternion.Euler(x, y, z);

Transform.localRotation

Transform.Rotation은 게임오브젝트의 상대적인 회전 각도를 나타냅니다. 게임오브젝트의 부모가 있을 경우 부모를 기준으로 상대적인 회전 각도를 나타냅니다. 부모가 없을 경우에는 Transform.Rotation과 동일합니다. Transform.RotationVector3의 오일러각도를 대입하면 해당 각도로 회전합니다. 다음은 Transform.localRotation의 예제 코드입니다.

transform.localRotation = Quaternion.Euler(x, y, z);

Transform.Rotate

Transform.Rotate는 게임오브젝트를 회전시키기 위한 함수입니다. 회전하고자 하는 Vector3의 오일러 각도를 인자로 넘겨주면 됩니다. 현재 게임오브젝트의 절대적인 회전 각도로 회전할 경우에는 Space.World 옵션을 사용하면 됩니다. 회전에 대해서는 여러가지 함수가 있지만 Vector3로 회전하는 함수만 설명하였습니다. 다음은 Transform.Rotate의 예제 코드입니다.

public class RotateExample : MonoBehaviour
{
    void Update()
    {
        // 게임 오브젝트 기준으로 회전
        transform.Rotate(new Vector3(10f, 20f, 30f) * Time.deltaTime);

        // 절대 좌표 기준으로 회전
        transform.Rotate(new Vector3(10f, 20f, 30f) * Time.deltaTime, Space.World);
    }
}

Transform.RotateAround

Transform.RotateAround는 특정 좌표를 기준으로 게임오브젝트를 회전시키기 위한 함수입니다. 회전할 기준 좌표, 회전할 기준 축, 회전할 각도를 인자로 넘겨주면 됩니다. 지구가 태양 주위를 공전하는 것 처럼 특정 좌표를 기준으로 공전할 경우 Transform.RotateAround 함수를 사용합니다. 다음은 Transform.RotateAround의 예제 코드입니다.

public class RotateAroundExample : MonoBehaviour
{
    public Transform Target;

    void Update()
    {
        transform.RotateAround(Target.position, Vector3.up, 20 * Time.deltaTime);
    }
}

Quaternion

  • Quaternion.identity : 오일러 각도가 (0, 0, 0)인 쿼터니언

참고

반응형
블로그 이미지
Frontend Engineer

댓글