컴퓨터/수학 하다보면, 회전을 다루는 방법중 Matrix와 Quaternion2개가 있는데, Quaternion 이 좋다고 한다. 사실 심심해서 프로그램 하나 만들고 있는데, 위키로 검색해 보니, Mat3 (이하 3x3행렬)과 비교한 값은 있어도 위치값까지 섞어서 Mat4 (이하 4x4 행렬)와 비교한 내용은 없길래 조사한 것이다. (위키 참고)


대충 만들려는 프로그램이 Blender의 Armature기능 같은 걸로, 쉽게 말해 게임이나 3D Animation에서 모델을 적절히 움직여주는 뼈대(BoneSystem)기능이다. 모델의 각 포인트(Vertex) 마다 기본 위치정보를 가지며, 와 뼈마디 정보를 가지며. 다음과 같은 계산이 이루어진다.


1. 뼈대의 각 뼈마디의 현재 위치정보 계산 (Mat4 혹은 Quaternion(회전) + Vec4(위치 + Scale))
2. 뼈대의 각 뼈마디마다, 좌표변화값 (기본 위치정보 -> 현재 위치정보) 계산
3. 컴퓨터가 Model Render 시 각 뼈마디의 좌표변화값 참고.


  
[ 캡쳐 프로그램은 MIT License 이며 영상녹화도 되는 Captura 를 사용 ]
[ Blender 에서 캡쳐 ]


설명
계산과정
계산량
[Mat4] Bone 좌표정보로 Vec4 위치 계산, Cal ( Mat4 * Vec4 )28
[Mat4] Bone 좌표정보를 부모 Bone을 통해 계산
Cal ( Mat4 * Mat4 )112
[Quat] Bone 위치값을 부모 Bone을 통해 계산 
== [Quat] Bone 좌표정보로 Vec4 위치 계산
Cal ( Quat * Vec4 * Quat )
30
[Quat] Bone 회전값을 부모 Bone을 통해 계산
Cal ( Quat * Quat )
28
[Quat] Bone 좌표정보를 부모 Bone을 통해 계산Cal ( Quat * Vec4 * Quat) + Cal ( Quat * Quat )
58


BoneSystem의 Bone수가 n일때 Quaternion을 사용하면


Cal ( 1. 뼈대의 각 뼈마디의 현재 위치정보 계산 ) = n * 58

Cal ( 2. 뼈대의 각 뼈마디마다, 좌표변화값 )          = n * 30

Cal ( 3. 컴퓨터가 Model Render 시 각 뼈마디의 좌표변화값 참고. )

     = 어차피 이쪽은 GPU 에서 하므로 상관없음.



이득이다.