Rotation

From WhiteWing
Jump to: navigation, search

Contents

Quaternion

\(Q_{v,\theta} = [ \vec{v} \sin(\frac{\theta}{2}), \cos(\frac{\theta}{2}) ]\)

Interpolation

  • LERP : Linear Interpolation LERP(p, q, t) := (1-t)p + tq;
  • SLERP : Spherical LERP SLERP(p, q, t) := p pow( inv(p) q, t );
  • NLERP : normalized quaternion SLERP NLERP(p, q, t) := p pow( inv(p) q, t );

Quaternion Double-cover and Rest Pose Neighborhood

  • http://mollyrocket.com/837
  • 사원수의 정의를 보면 \theta가 720도까지 정의되어 있음을 알 수 있다. 360를 돌리면 Q' = -Q이다. 보통 사원수에 -1을 곱하면 동일한 회전을 갖는다고 알고 있다. 그렇기 때문에 우리는 일반적으로 블렌딩을 할 때 두 사원수의 곱이 음수면 블렌딩 전에 사원수를 적당히 뒤집는다.

\(Q = w_1 Q_1 + w_2 Q_2\) \(\textrm{If } Q_1^T Q_2 < 0 \textrm{ then } w_2 = -w_2\)

  • No slerp, but lerp.
  • 애니메이션의 경우 기존 포즈에서 반대로 360도 돌아간 자세를 지나가면서 블렌딩 되는 것을 막을 수 있다. 숨겨져 있는 360도가 있기 때문에.
  • Neighborhood, Invert, Direct 세 가지 모드가 있지만 대부분 Neighborhood 모드만 사용하면 된다. 만일 그렇지 않다면 아티스트가 override 하도록 한다. Neighborhood mode는 블렌딩하려는 애니메이션의 처음과 끝이 다른, 다른 말로는 360도 돌아가 있는 상황이다. 물론 360도 이상 돌아가 있는 상황에서는 문제가 생길 것이다.
if (Q_key[0] * Q_key[n] < 0) { // neighborhood mode
 w_key = Sign(Q_key * Q_rest) * w_key
} else if (Q_key[0] * Q_rest < 0) { // invert mode
 w_key = -w_key
}
Q_accum += w_key * Q_key

Conversion

Conversion Between Left-handed System and Right-handed System

Rotation Matrix \(R\)이 있다고 하자. 한 쪽 시스템의 임의의 점 \(a\)를 \(R\)이란 회전을 통하여 \(b\)로 옮겨 준다. \(Ra = b\)

반대쪽 시스템의 a'는 z값이 flip 되어 있다. \(T = \begin{bmatrix} 1 & 0 & 0\\ 0 & 1 & 0\\ 0 & 0 & -1 \end{bmatrix}.\) \(a' = Ta, b' = Tb.\)

그러므로 반대쪽 시스템의 R'는 다음과 같다. \(\therefore R'a' = b'\) \(\Leftrightarrow R' Ta = Tb\) \(\Leftrightarrow R'Ta = TRa\)

\(R = \begin{bmatrix} a & b & c \\ d & e & f\\ g & h & i \end{bmatrix}, R' = \begin{bmatrix} a & b & -c \\ d & e & -f\\ -g & -h & i \end{bmatrix}.\)

Quaternion의 경우는 다음과 같다. (Reference) \(q = (x, y, z, w), q' = (-x, -y, z, w).\)

Euler의 경우는 다음과 같다. (Reference) \(e = (h, a, b), e' = (-h, a, -b).\) , while h, a and b represents heading, attitude and bank.

이 방법은 다른 방식으로 설명할 수도 있다. Axis-Angle Rotation 시스템으로 생각해 볼 때, 회전 축의 z값은 flip 되고, 회전 방향도 반대로 돌아간다.

q = (axis.x * s, axis.y * s, axis.z * s, cos(angle/2)); // while s = sin(angle/2).

그러므로 다음 식에 따라 Quaternion Rotation의 x, y 값이 뒤집어짐을 알 수 있다.

Personal tools