卵が先か鶏が先か――クォータニオンの有用性

姿勢を示すのに、何度かクォータニオンが有効だと主張してきましたが、果たして実際はどうなのでしょうか?先日書いたRPY表現法は、通称オイラー角と呼ばれており、制限が大きいことから今の力学計算では地雷とも言えます。では、元々計算に使う姿勢行列自体を姿勢表現として使えばいいのでは、というと実はそれで良かったりします。が、ある姿勢行列から回転を行って次の姿勢行列に変換するという計算を重ねていくと、誤差の重なりにより行列の正規性・直行性が壊れてゆがみが生じます。
これをジオメトリ崩壊と呼びますが、これを防ぐには何度か変換をした後に、正規化の計算を入れて誤差の蓄積を止める必要があります。とはいえ、実はこれは大変でもなんでもなく、


・X軸の回転変換を行う→Y軸の回転変換を行う→Z軸の回転変換を行う


というもともとの計算から、


・X軸の回転変換を行う→Y軸の回転変換を行う→XとYの外積でZ軸を計算→ZとXの外積でY軸を計算


と、一つ外積を増やすだけで済んでしまったりします。外積一回分の計算コスト程度なら、毎フレームでも全然問題なさそうですね。問題は、姿勢行列の持つXYZ3軸を任意の軸で回転させる計算です。任意軸をX軸として、適当にY軸、Z軸を直交させて作ってやり、回転軸行列というのをでっち上げて、その行列上に各軸を変換させた上でX軸周りの回転操作を行えばいい、と言うことになります。ここでの問題は、Y軸、Z軸を生成したり、回転軸行列上への変換コストが馬鹿にならないと言うことです。


この変換コストを削減してくれるのがクォータニオンと言うことになりますが、クォータニオンを最終的に座標変換行列に戻すコストとどっちが大きいのでしょうか?あ、あとクォータニオンを余計に実装する分、コーディングのコストは増えますね(^^;;; どっちにしても、行列だけでも片付けられる問題なので、欲張らずにまずはこちらで頑張って見ようかと。ザウルスにまで移植して、重すぎる様であれば改善手段として引っ張り出すことにします。


#ちなみに、現在は試験的に手抜きで軽い回転変換方法をとっています。時分割が無限大に小さい時は大丈夫ですが、大きくなると一気に崩壊しそうな危ういやり方です(^^;;