ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • GGP 9. Euler transforms and quaternions
    게임그래픽프로그래밍 2024. 6. 7. 19:11

    Euler Transforms

    오브젝트의 방향을 결정하는 방법을 Euler Transform이라고 하고, 회전각 ( Θ1, Θ2, Θ3) 을 Euler angles라고 한다. 세 개의 회전 축(X, Y, Z)을 따라 순차적으로 회전하는 각도로, 보통 Roll, Pitch, Yaw라고 불린다. 

    회전하는 순서에 따라 최종 방향이 달라진다.

     

     

    Euler Angles의 문제점

    euler angles은 직관적이고 사용하기 쉽지만, 치명적인 문제점이 있다.

    1.두 개의 keyframe사이의 euler rotations을 잘 interpolation하지 못한다.

    이때 keyframe이란, 1초에 몇십개의 frame들을 다 그리지 못하므로, 주요 frame몇개만 정의되는데, 이것을 keyframe이라고 한다. keyframe 몇개 만 그리고, 프레임 사이의 in-between frame을 interpolation하여 채우는 것이다. 아래 그림을 보면  center position인 p와 방향각도인 Θ가 interpolation된 것을 확인할 수 있다.

    더 부드러운 애니메이션은 higher-order interpolation을 사용해 얻을 수 있다.

     

    2. 축이 오염되어 회전이 깔끔하게 되지 않는다.

    euler angle은 물체를 축을 따라서만 회전시킨다. 예를들어 (60,30,45)의 회전각을 갖고 y축으로 회전한다고 해보자. 이전의 회전이 회전축을 왜곡시키기에, y축 회전은 하나의 축만 회전시켜 이룰 수 없다. 즉, 두개나 세개의 축이 함께 돌아가야지만 y축 회전을 할 수 있고, 결론적으로는 똑바로 회전되는 것이 아니라 세 개의 축이 함께 돌아가기에 돌아가면서 회전되는 진동이 발생한다.

     

    * Gimbal lock

    euler rotation의 대표적인 문제이다. 짐벌 락 현상은, 세 개의 축이 서로 종속되어있기에 발생하는 문제이다. 두 번째 고리가 돌면, 첫 번째 고리는 가만히 있지만 세 번째 고리는 같이 회전하기에, 첫 번째 고리와 세 번째 고리가 겹칠 수 있다. 이렇게 겹쳐진 두 고리는 분리되지 않아, 하나의 축에 대한 자유도를 잃어버린다. 그래서 예전에는 일부로 90도를 피하기도..

     

     

    Quaternion

    이런 Euler angle의 한계를 해결하기 위한 방법은 quaternion은, 세 축을 동시에 회전시켜 짐벌락에 걸리지 않도록 하는 3차원 회전을 표현하는 방법이다. 쿼터니언은 더 복잡하고 이해하기 어려워보이지만, 사용하면 더 효율적이고, 컴팩트하고, 안정적이고, 직관적이고, 연속적인 회전이 가능하며 순서와 상관없이 표현할 수 있다. 쿼터니언은 복소수의 확장으로, 하나의 실수 부분과 세 개의 허수 부분으로 구성된 4차원 복소수이다.  unit axis인 e = (x,y,z)축을 기준으로  Θ 라디안 만큼 회전을 하는 쿼터니언은 다음과 같이 표현한다.  

    쿼터니언은 sin/cos으로 표현되기에, 2 π 만큼의 주기를 가진다. 따라서 radians각도는 [0, 2 π]범위로 제한된다.

     

     

    q는 이렇게 표현되는데, 여기서 (i,j,k)는 세 축을 가리키는 unit-vectors을 가리키고, (qx,qy,qz,qw)는 실수이다. 따라서 q = (qv,qw)로 벡터 부분과 스칼라 부분(qw)으로 표현할 수 있다. 1, i , j, k간의 곱은 다음과 같다.

    • 해밀턴 곱은 두 쿼터니언을 곱하는 방법으로, 분배법칙과 위 표의 허수의 곱셈규칙을 이용하여 새로운 쿼터니언을 만드는 방법이다.
    • Conjugate of the q: q* = (-qv, qw). 켤레복소수 느낌. (q*)* = q, (pq)* = q*p*. scalar 부분: 1/2 * (p + p*), vector 부분: 1/2 * (q + q*)
    • unit quaternion: p의 크기는 아래 식으로 구할 수 있다. 쿼터니언 중 크기가 1인 쿼터니언 이다.

     

    2D rotation through complex numbers

    예전 포스팅에서 2D rotation을 다루었는데, 이것을 쿼터니언으로 나타내면, p를 x+yi, q= cos Θ + sin Θi 로 정의할 수 있다. 놀랍게도, pq를 계산하면 앞서 다루었던 식과 같게 나온다.

    2024.04.13 - [게임그래픽프로그래밍] - GGP 2. Spaces and Transforms

     

    GGP 2. Spaces and Transforms

    물체의 크기를 조절하거나, 회전하거나, 이동시키는 방법에 대한 내용이다. 먼저 2D를 보자. 1. Scaling 물체의 크기를 바꾸는 방법이다. x축으로 Sx배, y축으로 Sy배 하고 싶을때, 2x2 행렬을 곱해주어

    chaengdiary.tistory.com

     

     

    3D rotation through complex numbers

    3D 회전에서도 쿼터니언이 쓰일 수 있다.

     

    위 사진과 같이 고정된 o에서 u벡터를 기준으로 p에서 p'으로  Θ만큼 회전하는 경우를 생각해보자. p = (x,y,z)이고 p의 스칼라값  pw = 0이라 하자. 그러면 p = (p,0)으로 나타낼 수 있다. unit quaternion인 q는 unit vector인 u를 기준으로 Θ만큼 회전하는 경우이므로, 앞의 공식에 대입하면 q = (qv,qw) = (sin Θ/2 u, cos Θ/2)이다. 우리가 최종적으로 계산해야 하는 결과는 qpq*이다.

    직접 계산을 해보면 pqp* 식은 다음과 같다. 

     

    이것을 기하학적으로 증명을 해보면, 아래 사진과 같다. p' = 초록벡터 + (파란벡터 + 빨간벡터 = 갈색벡터) 로 나타낼 수 있다. 초록벡터는, pv에서 u에 projection을 한 벡터고, 빨간 벡터는 pv - 초록벡터이고, 파란벡터는 빨간벡터와 초록벡터의 외적이다.

     

     

    multiple quaternions

    • 만약 p'을 또다른 쿼터니언인 r로 회전시킨다고 하면, rp'r* = r(qpq*)r* = (rq)p(q*r*) = (rq)p(rq)*로 나타낼 수 있다. 
    • rotation about u by Θ = rotation about -u by - Θ

    '게임그래픽프로그래밍' 카테고리의 다른 글

    GGP 11. Normal Mapping and Tessellation  (0) 2024.06.09
    GGP 10. Screen-space Object Manipulation  (0) 2024.06.08
    GGP 8. Output-Merging  (0) 2024.06.07
    GGP 7. Lighting  (0) 2024.06.06
    GGP 6. Image Texturing  (2) 2024.06.01
Designed by Tistory.