2011年11月30日

クォータニオンによるボーンの回転

クォータニオンとボーンについての解説は省きます。

クォータニオンを使って回転を合成し、ボーン1にはボーン1の回転が、ボーン2にはボーン1とボーン2の回転、ボーン3にはボーン1とボーン2とボーン3の回転を与えます。
これにより、人間の関節やロボットアームのような複雑な動きを表現する事が可能になります。

クォータニオンによる回転の合成は、クォータニオンの積の計算によって求まります。 ただしOpenGL ESの場合、クォータニオンのままでは座標変換が行えないため、クォータニオンを座標変換行列に変換する必要があります。
※動画キャプチャの都合上、端末(SC-01C)で遅回しして編集で早回し




全てのボーンが同じ原点を共有して回転してしまっています。
パタパタママのようでもありますが、表現したい事はこれではありません。



関節のように数珠つなぎにするには、ボーン2の原点はボーン1の先端、ボーン3の原点はボーン2の先端でなければなりません。そうするには、回転だけでなく平行移動もさせる必要があります。

クォータニオンの合成では平行移動を合成する事ができませんが、クォータニオンを使って座標変換を行う事はできます。

ボーン2の原点がボーン1の座標P(ボーン1の先端)にあるとします。
ボーン1の回転がクォータニオンQで与えられた場合、回転によってPはP’へ移動しますが、このP’は次の式で計算できます。

P' = QPQ-1

上の式で、P及びP'は座標をクォータニオンで表したものです。
つまり、座標変換もクォータニオンの積によって求める事ができるのです。

このようにして求めた座標P'の分だけボーン2を平行移動させてやれば、ボーン2はボーン1の先端を原点として回転するようになります。ボーン3についても同様です。


※ボーン3はY軸回転を与えているためドリル状に回転


しかし座標変換をクォータニオンの積によって求めた場合、積の演算で16回の乗算が必要なため、結局32回の乗算が必要になります。(0乗算も含まれるため、実際の乗算回数はこれより少なくなります)

冒頭でも述べましたが、OpenGL ESではクォータニオンから座標変換行列への変換が必要です。つまり、ボーン1の座標変換行列が既に求められているのですから、それを使って座標変換を行った方が乗算回数は少なくなります。
座標変換行列による座標変換の乗算回数は9なので、クォータニオンによる座標変換の乗算コストよりもずっと少なくて済みます。

※そもそもOpenGL ESで座標変換行列が必須という訳ではなく、全ての座標変換をクォータニオンで行う事も可能です。しかしクォータニオンだけで大量の座標変換を行うと乗算コストがかさむため、 座標変換行列を求めて座標変換を行った方が全体の計算量は少なくなるはずです。



0 件のコメント :