OpenGLでのglPushMatrix、glPopMatrixについて

670 views
Skip to first unread message

杉田臣輔

unread,
May 10, 2011, 1:33:57 PM5/10/11
to android-g...@googlegroups.com
shinriyoと申します。

AndroidのOpenGLを用いて、あるキャラクターの描画に困っています。

以下の、(1)と(2)の方法では同じ効果を発するはずですが、
結果が異なります。なぜでしょうか?
Xの処理を「頭部分」と「体部分」の描画にそれぞれ掛けるか、
両方の部分に一度に掛けるかで、結果は同じになると想定してます
数学でいうとx(a+b) = xa+xb
みたいな感じで同じになるはずなのに、異なります。

X----------------------------------------------------------------------
gl.glTranslatef(x, y, z);
gl.glRotatef(angle_x, 1.0f, 0.0f, 0.0f);
gl.glRotatef(angle_y, 0.0f, 1.0f, 0.0f);
gl.glRotatef(angle_z, 0.0f, 0.0f, 1.0f);
----------------------------------------------------------------------

(1)------------------------------------------------

gl.glPushMatrix();{

// 頭部分
gl.glPushMatrix(); {
gl.glTranslatef(x, y, z);
gl.glRotatef(angle_x, 1.0f, 0.0f, 0.0f);
gl.glRotatef(angle_y, 0.0f, 1.0f, 0.0f);
gl.glRotatef(angle_z, 0.0f, 0.0f, 1.0f);
gl.glTranslatef(0.0f , 0.0f, 0.0f);
[頭部分描画処理]
} gl.glPopMatrix();


// 体部分
gl.glPushMatrix(); {
gl.glTranslatef(x, y, z);
gl.glRotatef(angle_x, 1.0f, 0.0f, 0.0f);
gl.glRotatef(angle_y, 0.0f, 1.0f, 0.0f);
gl.glRotatef(angle_z, 0.0f, 0.0f, 1.0f);
gl.glTranslatef(0.0f, -4.2f, 0.0f);
[体部分描画処理]
} gl.glPopMatrix();

} gl.glPopMatrix();

------------------------------------------------


(2)------------------------------------------------

gl.glPushMatrix();{
gl.glTranslatef(x, y, z);
gl.glRotatef(angle_x, 1.0f, 0.0f, 0.0f);
gl.glRotatef(angle_y, 0.0f, 1.0f, 0.0f);
gl.glRotatef(angle_z, 0.0f, 0.0f, 1.0f);

// 頭部分
gl.glPushMatrix(); {
gl.glTranslatef(0.0f, 0.0f, 0.0f);
[頭部分描画処理]
} gl.glPopMatrix();


// 体部分
gl.glPushMatrix(); {
gl.glTranslatef(0.0f, -4.2f, 0.0f);
[体部分描画処理]
} gl.glPopMatrix();

} gl.glPopMatrix();

------------------------------------------------

nobuyasu

unread,
May 16, 2011, 1:07:49 AM5/16/11
to 日本Androidの会
はじめまして、nobuyasuと申します。


もう解決しているかも分かりませんが、個人的に気になったので書いてみます。

OPENGLマトリクス変換には、特に問題はなさそうに見えます。
描画処理部分が悪さをしているのでは?
と私は考えていますが・・・

ksz

unread,
May 16, 2011, 5:34:33 AM5/16/11
to 日本Androidの会
はじめまして、kszと申します。
ざっと見た感じだと特に問題が見当たりません。

なので、ここからは勘なのですが、gl.glPushMatrix(); と gl.glPopMatrix(); の前に
gl.glMatrixMode(GL10.GL_MODELVIEW); を入れてはどうでしょう?

もしや、描画処理内でgl.glMatrixMode(GL10.GL_MODELVIEW); 以外を処理してるんじゃないかと・・・。

Reply all
Reply to author
Forward
0 new messages