クォータニオンってなに?
クォータニオンでボーン処理、その1:クォータニオンってなに?
クォータニオンの前知識なしでクォータニオンを使ったスキニングアニメーションのコードを理解するのは厳しいので、今回から数回に分けてクォータニオンを説明していきます。
クォータニオン(Quaterinon)は日本語で四元数(しげんすう)と言い、定義的には3つの虚数単位を持つ超複素数系のひとつです。
………
と、いってもなんのことかさっぱり解らなくても大丈夫です(たぶん)。本来であれば数学的な説明も入れるべきですが、今回はスキンアニメーションでの使われ方の説明なので、そういった部分は割愛します。より詳しく数学的な意味が知りたい人は「超複素数入門」、どの様に回転を表すかを知るためには英語ですが「Quaternions and Rotation Sequences」が良書ですし、日本語でも「実例で学ぶゲーム3D数学」が参考になると思います。
クォータニオンを簡単に説明すると、回転行列の変わりに使える便利な道具です。
行列の中で回転を表す部分は以下のようにRの部分、つまり3x3、9個の数値であらわします。XNAフレームワークの中では9個のfloatになります。
これがクォータニオンでは4個の数値、XNAフレームワーク内では4個のfloatで同じ回転を表すことができます。つまり、回転を表すのに必要なメモリが半分以下になる訳です。メモリ消費量だけで比べるのならx,y,z軸の回転角度を持つほうがより少ない消費量になりますが、オイラー角を使った場合、線形補間ができなかったり、行列への変換に三角関数を使う必要があったり、なにより面倒なジンバルロックの問題があったりと実際のゲーム開発では回転する範囲が制限されている場合以外ではオイラー角による回転が使われることは少なく、クォータニオンが使われるケースがほとんどです。
クォータニオンの利点をまとめると
- メモリ使用量が少ない、回転行列の半分、4x4の行列の1/4
- 行列と同じように線形補間(Learp)、または球面線形補間(Slerp)ができる
- 行列への変換がオイラー角を使うのに比べて高速
- ジンバルロックに悩まされない
- 正規化が簡単
と、いった感じになりますが、弱点としては
- オイラー角で回転をもつよりメモリ使用量が少し増える
- オイラー角と違って直感的に解りづらい
があります。
次回はXNAフレームワーク内でどのようにクォータニオンを使うのかを説明します。
Comments
- Anonymous
April 28, 2009
PingBack from http://microsoft-sharepoint.simplynetdev.com/%e3%82%af%e3%82%a9%e3%83%bc%e3%82%bf%e3%83%8b%e3%82%aa%e3%83%b3%e3%81%a3%e3%81%a6%e3%81%aa%e3%81%ab%ef%bc%9f/