Axis-angle rotation, 혹은 Rodrigues formula란,
축과 각이 주어졌을 때 어떤 벡터를 해당 축에 대해 해당 각만큼 회전시킨 벡터를 구하는 과정이다.
v를 n을 기준축으로 시계 방향으로 세타만큼 회전시킨 v'을 구하는 과정을 살펴보자.
(축 n은 단위벡터라고 가정한다. 단위벡터가 아닐 경우 그냥 단위벡터로 만들어주면 된다)
v를 n에 정사영 내려 p를 구할 수 있고,
v - p = e이므로 e도 구할 수 있다.
v' = p + e'인데,
e'은 f와 e를 축으로 하는 평면에 대해 e를 세타만큼 반시계 방향으로 회전시킨 벡터이다.
이는 우리가 구할 수 있는 값이다.
f를 y축, e를 x로 두고 생각하자. 위 그림에선 세타가 둔각이지만 이해를 돕기위해 세타가 예각이라고 해보자.
그랬을 때 우리는 e'의 x축, y축 좌표를 구할 수 있다. (정확히는 e와 f와 같은 방향인 벡터 두개로 나타냈을 때 각 벡터의 길이)
|e'| cos세타 = x좌표 = e 방향 벡터 A의 크기
|e'| sin세타 = y좌표 = f 방향 벡터 B의 크기
이때 A벡터와 B벡터의 합은 e'이므로 이렇게 얻은 길이에 e방향 단위벡터, 그리고 f방향 단위벡터를 곱해주면 A벡터와 B벡터를 구할 수 있다.
따라서
A = |e'| cos세타 * (단위벡터)
= |e'| cos세타 * (e / |e|)
이때 |e'| = |e|이므로
A = e cos 세타
마찬가지로 B = f sin 세타
고로 e' = A + b = e cos 세타 + f sin 세타
라는 식을 구할 수 있다.
이제 e'을 처음 우리가 알던 두 벡터인 v, n과 세타로만 나타내보자.
e = v - p = v - (v*n)n 이고
f = v x n (이전 글 참고) 이므로
식을 정리하면 최종적으로
e' = v cos 세타 + (v*n)n (1 - cos 세타) + (n x v)sin 세타
라는 일반식을 도출할 수 있다.
참고:
'mathematics > game mathematics' 카테고리의 다른 글
[Mathematics] 19. Quaternion Multiplication (0) | 2022.04.24 |
---|---|
[Mathematics] 18. Quaternion (0) | 2022.04.24 |
[Mathematics] 16. Plane Intersection & Frustum Culling (0) | 2022.04.03 |
[Mathematics] 15. 3차원 Line-AABB Intersection (0) | 2022.04.03 |
[Mathematics] 14. Line-Plane Intersection (0) | 2022.04.03 |