오일러 각의 회전에 문제가 있음 => 짐벌락 현상
유니티 엔진에서는 z축, x축, y축 순으로 회전을 계산함
z축의 회전에 따라 x,y 축이 영향을 받고 x축에 따라 y축이 영향을 받음
문제는 2번째 계산되는 축이 회전했을 때 1, 3번째 축이 겹치면서 발생
=>
2개의 회전축이 같아지면서 축이 하나 소실되어 회전이 자유롭게 되지 못함
복소수
z = a + bi
a: 실수부
bi: 허수부
i: 허수 단위
이미지 출처
∣z∣=∣a+bi∣=a2+b2
켤레 복소수 z∗=a−bi
z×z∗=a2+b2=∣z∣2
복소 평면
x축에는 실수부를 표현, y축은 허수부를 표현
이미지 출처
Z1=r1(cosθ1+isinθ1)
Z2=r2(cosθ2+isinθ2)
Z1×Z2=r1r2((cosθ1cosθ2−sinθ1sinθ2)+i(sinθ1cosθ2+cosθ1sinθ2))
=r1r2(cos(θ1+θ2)+isin(θ1+θ2))
Z1을 벡터라고 생각하고 Z2의 크기가 1인 경우 단위 복소수일 경우
Z1을 회전시키는데 사용할 수 있음
복소수의 행렬 표현
a+bi=[ab−ba]
실수부 단위 행렬 E=[1001]
허수부 단위 행렬 I=[01−10]
I2=−E
r(cosθ+isinθ)=r[cosθsinθ−sinθcosθ]
= 2차원 회전 행렬
Vec4 (x,y,z,w)
q = xi + yj + zk + w = (v,s)
xi + yj + zk: 벡터부
w: 스칼라부 실수부
i2=j2=k2=−1
i−>j−>k
ij=k,ji=−kjk=i,kj=−iki=j,ik=−j
q∗=(−v,s)
∣q∣=qq2=∣v∣2+s2=x2+y2+z2+w2
q−1=q1⋅q∗q∗=∣v∣2+s2−v+s
∣q∣=1이라면 q−1=q∗
(q1q2)∗=q2∗q1∗
q1q2=(v1×v2+s1v2+s2v1, s1s2−v1⋅v2)=(v,s)
실수부가 0인 쿼터니언: pure quaternion
v를 a 방향으로 θ만큼 회전 시킨 벡터
q=(sin2θa,cos2θ), ∣q∣=1
V′=qvq∗
연속 회전 q1회전 후 q1회전
q2(q1vq1∗)q2∗=(q2q1)v(q1∗q2∗)=(q2q1)v(q2q1)∗
연속 회전 시 q2q1과 (q2q1)∗을 미리 구해놓을 수 있음
쿼터니언을 행렬로 변환
이미지 출처
q일때와 -q일때가 동일
행렬을 쿼터니언으로 변환
qr이 0이거나 매우 작아질수록 오차가 매우 커짐
qi,qj,qk 중에 가장 큰 값을 찾아 해당 값을 나누는 공식으로 사용하게 됨
위 공식은 qi가 가장 큰 값인 경우
이미지들 출처