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);
}
お礼
ありがとうございました。 ご指摘のとおりやってみましたら、望みどおり出来ました。