[Unity]오브젝트의 회전

윤여준·2022년 6월 27일
0

Unity

목록 보기
1/1

1. Quaternion과 Euler angle

Unity에서 회전을 다룰때, Quaternion과 Euler angle을 빼놓고는 이야기 할 수 없을 정도로 중요한 개념입니다.

  • Euler angle(오일러 각)
    - 정의 : 3차원 공간에서 강체*가 놓인 자세를 표현하기 위해 나타내는 3개(X, Y, Z)의 각도
    (강체 : 물리학에서 형태가 고정되어 변하지 않는 물체를 가리킨다.)
    - 사용하는 이유 : 2차원에서는 회전의 자유도가 1개의 축뿐이지만, 3차원에서는 자유도가 1보다 클 수 있기때문에, 회전하는 순서에 따라 강체의 자세가 달라지게 된다.

    [그림2와 그림3 모두 각축으로 회전한 양은 90도로 같지만, 회전축의 순서에 따라 좌표축이 가리키는 방향이 다른 것을 확인할 수 있다.]
    - 오일러 각을 이용하여 좌표를 나타내는 방법 : 임의의 벡터 X(x, y, z)를 회전 후의 벡터 X'''(x''', y''', z''')라 하자. 벡터 X와 X'''를 오일러321좌표의 관계로 표현하면
    X = AzAyAxX'''
    로 나타낼 수 있다.
    - Critical angle(gimbal lock case) : 오일러 각을 이용하여 계산 시 주의하여하 할 사항이 있다. 바로 두번째 회전 각도로 인하여 두개의 축이 나란히 되어 자세가 구분이 되지 않는 상황인 '짐벌락'현상 때문이다.
    [영상 참고]
    https://m.blog.naver.com/PostView.naverisHttpsRedirect=true&blogId=jsjhahi&logNo=205951840
  • Quaternion(쿼터니언)
    q = (w + xi + yj + zk)
    - 정의 : 사원수, 기존 벡터 V(x, y, z)에서 스칼라부라는 원소하나를 더 도입한 개념
    1. w 는 스칼라 부, i, j, k는 벡터 부
    2. x = y = z = 0 일때, q는 실수
    3. w = 0 일때, 순허수
    • 사용하는 이유
      1. 오일러 각 사용 시 발생하는 '짐벌락'현상을 없애기 위함
      2. 3D모델 자체에서도 대량의 회전이 필요한데 회전별로 각각 생성한 회전 행렬자체의 부담을 줄여줌.(행렬보다 점유 메모리 영역이 작고 계산 부하가 낮다.)
      3. 축이 다른 회전 행렬이 있을때, 한 쪽회전에서 다른 쪽 회전으로 매끄럽게 이동해가는 보간은 회전행렬로 표현할 수 없다.

2. Unity에서의 Quaternion함수

  • Quaternion.Euler
transform.rotaion = Quaternion.Euler(new Vector3(120, 60, 100));
: 유니티에서는 Quaternion.Euler함수를 통해서 오일러각을 쿼터니언으로 변경시켜 사용한다.
  • Quternion.LookRotation
Vector3 dir = (target.position - this.transform.position).normalized;
Quaternion lookRotation = Quaternion.LookRotation(dir);
this.transform.rotation = lookRotation;
: Quaternion.LookRotation(Vectort3 dir)에서 dir에 방향벡터를 입력하면, 자기 위치 기준에서의 해당 방향 벡터를 바라보게 된다.
  • Quaternion.Slerp
tarnsform.rotation = Quaternion.Slerp(A.transform.rotation, B.transform.rotation, Time.deltaTime);
: A에서 B의 방향으로 구면선형보간법을 이용하여 부드럽게 회전한다.
  • Quternion.FromToRotation
transform.rotation = Quaternion.FromToRotation(Vector3.up, Vector3.right);
: 첫번째 인자의 방향 벡터를 두번째 인자의 방향벡터로 회전한 쿼터니언을 반환한다.
profile
항상 발전하는 개발자!!

0개의 댓글