ゲームとかの姿勢制御のやり方を日本語で説明する

こんにちは。ヤマヤタケシです。
クォータニオンに興味があるというとある学生さんに向けて書きなぐりました。
理解が深まれば幸いです。

この記事の用語集

4元数=クォータニオン。4個の数字。(x,y,z,w)。最強の姿勢表現。

オイラー角。3つの数字(x,y,z)。便利で簡単だけど、限界もある姿勢表現。

3行3列行列。33マトリクス。サンサンマトリクス。9個の数字。姿勢を表現している。具体的にはx,y,z軸の方向を表現している。

角度と姿勢

2Dだと角度は1つだけです。P(x,y)への角度は、atan2( y, x );で求められます。
3Dだと角度はややこしい話になります。2Dと区別するために姿勢と呼びます。
姿勢の表現方法は、知ってる限り3種類あります。

  1. オイラー角
  2. クォータニオン
  3. サンサンマトリクス

それぞれにメリットとデメリットがあるので、ゲームなどで制御するときは、組み合わせて渡り歩く必要があります。

ゴールはヨンヨンマトリクス

ヨンヨンマトリクスかヨンサンマトリクスをライブラリに渡せばその場所、その姿勢で表示してくれます。
3Dゲームプログラマの仕事はヨンヨンマトリクスを作ることです。

Unity だと、Transformです。マトリクス自体を触らなくても操作できるようになっています。
素晴らしい!

オイラー角は簡単!だけど・・・

x軸の回転、y軸の回転、z軸の回転を組み合わせます。
一番わかりやすく、不完全ですが制御が楽です。
ほとんどのゲームはY軸回転+モーションデータで作っているから、オイラー角の知識だけでも十分ゲームは作れます。
ヤマヤ流は、y軸回転, x軸回転, z軸回転の順番です。
地面を走るキャラクターを動かすときなど、行きたい方向を決めてY軸を回して、その後地形に合わせてX, Zを調整します。

オイラー角のハマリポイントは、回転の順番が人やアプリによって違うことです。
順番によって結果も違うので、それを確認しないとものすごいハマリます。

クォータニオンは強力!

クォータニオンはものすごい強力な味方です。オイラー角でできないことができます。
それは、球面補間です。
サンサンマトリクスは9個の数字を使い、クォータニオンは4個なので負荷が軽いこともメリットですが、それはハードの進化でなんとかなります。

球面補間はクォータニオンでしかできません!(知ってる限り)
クォータニオンで調べると、足し算、引き算、掛け算などなど数式の嵐の最後の最後に出てくる球面補間。
しかし、球面補間以外は使ったことはない!
とにかく、球面補間だけ美味しくいただきましょう。

球面補間とは、2つの姿勢の補間方法です。
2つの姿勢を補間するときに、オイラー角でも1軸だとは問題ないのですが、2軸,3軸に数字が使っていると気持ちわるい補間になります。
クォータニオンは、あなたが期待する補間をするでしょう!

クォータニオンは数学的には難しい

クォータニオンは数学的には難しいです。が、ライブラリがあれば使うのは簡単です。
どれぐらい難しいかというと、高校で習う虚数(x + iy)でも難しいのに、クォータニオンは(ix+jy+kz+w)で、さらに2次元ほど難しいです。
数学的、学術的な知識は数学の「開発」に必要だけど、ゲームやCGは数学を「利用」するだけだからライブラリの関数を呼べば良いので良い時代になりました。
とはいえ、デバッグするときにイメージは必要です。

イメージは、軸と、その軸の回転角度です。

x,y,zが軸の方向です。伸び縮みします。
wは軸の回転角度のcosです。

例)
回転がないとき    (x=0,y=0,z=0,w=1)
X軸に90度回転する  (x=1,y=0,z=0,w=0)
Y軸に90度回転する  (x=0,y=1,z=0,w=0)

詳しくは参考URLで!

これだけ書くのも疲れたので、後は先人にバトンタッチ!

クォータニオン(UEI shi3zの日記)

クォータニオンの必要性についての参考記事を探していて見つけました。
クォータニオンに絡めたいい話です。
shi3zさんのI/Oっていう雑誌の連載を興味深く読んでいたし、川西さん監修のGame Programming Gemsなんかもいっぱい読みました。
そういう熱い先人たち同士の関係性というのは実に興味深いですね。

クォータニオンの使い方(ひにけにGD)

XNAでのクォータニオンの使い方。具体的でいい!

クォータニオン(四元数)(WebGL 開発支援サイト wgld.org )

今回の内容と近いです。使う人のためのクォータニオン。

ガチな数学はこの本で!

ライブラリがないときは、これをみて実装すれば良いと思います。

[CEDEC]射影を用いた関節角度制限方法 ~3次元ローテーションと特異点の不思議~
回転の角度を制限するエレガントな方法。すげーわー。プロだわー。
メアドの登録で資料がダウンロードできるのがステキ!