- 締切済み
openGLの回転の仕組みが分からなくて、困っています
openGL初心者です。描画関数で以下のような書き方でx軸、y軸、z軸それぞれに角度を与えてオブジェクトを描画しているのですが、意図した角度に回転してくれません。 一応自分の認識では、openGLでは以下のような書き方をすると、まずオブジェクトの描画がされて、次にz軸の回転→y軸の回転→x軸の回転と、処理の順番とは逆に計算が行われると知ったのですが、まずその認識は正しいでしょうか? そこで、実際にx、y、z軸にそれぞれ角度を与えてオブジェクトを回転させてみるのですが、どうも意図した回転にならないのです。 例えばz軸に90度の値を与えて、オブジェクトを横に倒したとします。 まず、その状態でローカル座標系のx軸とy軸がz軸を中心に90度回っていると思っています。 その後、y軸に90度の値を与えても、ローカル座標系のy軸を中心に回らず、まるでワールド座標系のy軸を中心に90度回りまわっているように見えます。また、x軸も同様にワールド座標系のx軸を中心に90度回ります。 そこで、ワールド座標系で回るのかと思い、今度は、ニュートラルの状態から、y軸を90度回します。ローカル座標ではx軸、z軸がy軸を中心に90度回ると思います。次にx軸に対して、角度を与えてやると今度はローカル座標系のx軸を中心にまわるのです。 何故このような回転をするのかイメージできません。。どなたか回答いただけませんでしょうか? それと本当にやりたいことは、オブジェクトがどのような姿勢で回転していても(ローカル座標系がどうであれ)ワールド座標系のx、y、z軸を中心に回転させたいのですが、宜しければその辺も合わせて教えて頂けたら幸いです。 (数学の知識も乏しいので、数式がちゃんとあるのなら、その名前を教えていただければ直幸いです。) 乱文失礼します。 public void display(GLAutoDrawable drawable) { gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); gl.glMatrixMode(GL.GL_MODELVIEW); gl.glLoadIdentity(); gluLookAt((double) 0.0f, (double) 0.0f, (double) 5.5f, (double) 0.0f, (double) 0.0f, (double) 0.0f, (double) 0.0f, (double) 1.0f, (double) 0.0f); gl.glEnableClientState(GL.GL_VERTEX_ARRAY); gl.glEnableClientState(GL.GL_COLOR_ARRAY); gl.glRotatef(AngleX, 1, 0, 0); gl.glRotatef(AngleY, 0, 1, 0); gl.glRotatef(AngleZ, 0, 0, 1); // オブジェクト描画 draw(gl); gl.glDisableClientState(GL.GL_COLOR_ARRAY); gl.glDisableClientState(GL.GL_VERTEX_ARRAY); }
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- noocyte
- ベストアンサー率58% (171/291)
回転の順序が逆だと思います. gl.glRotatef(AngleZ, 0, 0, 1); gl.glRotatef(AngleY, 0, 1, 0); gl.glRotatef(AngleX, 1, 0, 0); とすれば意図どおりになるでしょう. モデルの回転に注目するのか,座標系 (座標軸) の回転に注目するのか によって回転の順番と回転方向が逆になります.他人のプログラムなどの 座標変換の説明を読むときも,どちらの視点で書かれているのかに注意. (慣れてても時々間違えます.(苦笑)) コンピュータグラフィックス特論II http://www.cg.ces.kyutech.ac.jp/lecture/cg2/cg2-03_view_control.pdf ⇒ p.8,変換行列を直接更新する方法(2) モデルビュー変換 http://www.om.sist.chukyo-u.ac.jp/main/lecture/opengl/60.php オイラー角 http://ja.wikipedia.org/wiki/%E3%82%AA%E3%82%A4%E3%83%A9%E3%83%BC%E8%A7%92 座標変換 http://www.mech.tohoku-gakuin.ac.jp/rde/contents/course/robotics/coordtrans.html ⇒ オイラー角とロールピッチヨー