頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


OpenGLで描画する時に平行移動と回転の順を変えたい

OpenGLに限らず3D CG描画全般の話だと思うんだけどさ。
処理の流れではオブジェクトの各頂点に対して平行移動と回転させるためにmodelViewMatrixをかけるじゃない。
このmodelViewMatrixの中身にはいろんな意味合いがあると思うんだけど、基本は平行移動と回転だよね。

ところでこの平行移動と回転の順序はどうしたらいいんだろう?
もちろん、順番で描かれる内容は変わるんだわ。

実のところ順番に関するセオリーみたいなのは聞いたことがなくてよくわからない。どっちでも設計者の好きにすればいいんだと思う。

俺は惰性で最初にみたチュートリアルの通りにやってきたんだけど、先日ちょっと具合が悪いことがあってさ。

あるシーン1を描画、連続する次のシーン2では順序を逆にしたい!
という状況になってね。
状況を考えにくいだろうから細かく書くとシーン1ではカメラが回転しながら動いてるんだ。
その移動が終わってカメラ固定の場面がシーン2なのよ。
カメラを回転させながら移動させるのにはどうしても平行移動させてから回転させた方が簡単なのよ。
シーン1と同じ順序のままだとシーン2でドラッグによる回転をさせた時にしっくりこないんだわ。

それでどうしたものかなあ?と悩んだんだけどさ、、、

一つのシーンを描くのにその座標を示すベクトルと姿勢(回転)を示すクォータニオンがあるとして、それらを意味するマトリックスを
matTrans(平行移動)
matRot(回転)
とでもするよ。modelViewMatrixを作る時に
シーン1の終わりでは matRot1 x matTrans1
シーン2では matTrans2 x matRot2
で描画したいわけ。
具体的には
{
    GLKMatrix4 modelViewMatrix = GLKMatrix4Multiply(matRot1 , matTrans1);
}
みたいに書けるよね。

切り替える瞬間にmatRot1 x matTrans1とmatTrans2 x matRot2が同じマトリックスでないとダメだから
matRot1 x matTrans1 = matTrans2 x matRot2
ってことだわ。

切り替え時にmodelViewMatrixが上のようになるようなmatRot1 と matTrans1の組み合わせを探せばいいわけでしょ。あら?もしかしていくらでもある?
それじゃあ回転についてはmatRot2と同じにしてみる。

matRot2 x matTrans1 = matTrans2 x matRot2

こういうのを満たすmatTrans1はあるのか?って話になる。

両辺にmatRot2の逆行列(invMatRot2とするよ)を左からかけると、、、
matTrans1 = invMatRot2 x matTrans2 x matRot2
ってなるからmatRot2に逆行列がちゃんと存在してれば問題解決だよね。

GLKitではこんな感じで逆行列を得ることができる。
{
    bool isInvertible = nil;
    GLKMatrix4 invMatRot2 = GLKMatrix4Invert(matRot2 , &isInvertible);
    if(!isInvertible) {
        NSLog(@"matRot2 is not invertible!”);
    }
}
これで無事意図通りカメラを動かすことができたよ。

<< りんご飴の美味しい食べ方  TopPage  glReadPixelsでシェーダの出力をCPU側で得る >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/925-15fdf4b3




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad