0

GLSurfaceView.Rendererでは、シーンを2つの部分に分けて描画しています。最初のグループはオフセットされて回転し、2番目のグループは「カメラ」に位置合わせされるため、glRotateとglTranslateを適用してから、正反対のglTranslateとglRotateを適用します。一部のデバイスでは、これは正常に機能しますが、他のデバイスでは、シーン全体がゆっくりと「中心」から回転します。

画像:開始時約5分後

onDraw()関数は次のとおりです。

@Override
public void onDrawFrame(GL10 gl) {
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

    // rotate card table
    gl.glRotatef(-20f, 1f, 0f, 0f);
    gl.glRotatef(  5f, 0f, 1f, 0f);
    gl.glRotatef(-10f, 0f, 0f, 1f);
    gl.glTranslatef( 1f, 3f, 0f);

    mDeck.draw(gl);

    // undo rotate for buttons/overlays
    gl.glTranslatef(-1f, -3f, 0f);
    gl.glRotatef( 10f, 0f, 0f, 1f);
    gl.glRotatef( -5f, 0f, 1f, 0f);
    gl.glRotatef( 20f, 1f, 0f, 0f);

    mOverlayBtns.draw(gl);
    mPass.draw(gl);
}

完全なソースは、GitHubのここにあります。

私が見逃している明らかなものはありますか?回転してから後ろに回転するのを処理するためのより良い方法はありますか?

これまでのところ、私はこの問題に気づきました:

  • ネクサス4
  • HTCセンセーション
  • 名前が思い出せない別のLG電話

これらのデバイスは問題を示していません:

  • ギャラクシーネクサス
  • ネクサス7
  • Xoom
4

2 に答える 2

1

コードはフレームごとに一連のアフィン変換を適用していましたが、問題は各変換が累積的であるため、変換を何度も適用していたことです。glLoadIdentity(http://www.khronos.org/opengles/sdk/1.1/docs/man/glLoadIdentity.xml)を使用して現在ロードされているMODELVIEWマトリックスをリセットするか、現在のマトリックスをプッシュして新しいマトリックスをロードし、描画して次に、マトリックスをポップバックします(修正応答で行っていたように)。

各フレーム描画の最初にglLoadIdentityを配置します。また、あなたの修正で、私もこれを行います:

gl.glPushMatrix();

gl.glLoadIdentity(); // Be sure we start clean

// rotate card table
gl.glRotatef(-20f, 1f, 0f, 0f);
gl.glRotatef(  5f, 0f, 1f, 0f);
gl.glRotatef(-10f, 0f, 0f, 1f);
gl.glTranslatef( 1f, 3f, 0f);

mDeck.draw(gl);

gl.glPopMatrix();

お役に立てば幸いです。

于 2012-12-28T09:54:36.960 に答える
0

私はこの問題の修正を見つけましたが、私はまだ誰かが私が上で見ている問題を説明できることを望んでいます。

シーンを回転してから後ろに回転する代わりに、glPushMatrixとglPopMatrixを使用して2つのグループを分離できます。そうすれば、シーンを戻すためのglTranslateとglRotateのグループは不要です。

@Override
public void onDrawFrame(GL10 gl) {
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);


    gl.glPushMatrix();

    // rotate card table
    gl.glRotatef(-20f, 1f, 0f, 0f);
    gl.glRotatef(  5f, 0f, 1f, 0f);
    gl.glRotatef(-10f, 0f, 0f, 1f);
    gl.glTranslatef( 1f, 3f, 0f);

    mDeck.draw(gl);

    gl.glPopMatrix();


    gl.glPushMatrix();
    // undo rotate for buttons/overlays
    // gl.glTranslatef(-1f, -3f, 0f);
    // gl.glRotatef( 10f, 0f, 0f, 1f);
    // gl.glRotatef( -5f, 0f, 1f, 0f);
    // gl.glRotatef( 20f, 1f, 0f, 0f);

    mOverlayBtns.draw(gl);
    mPass.draw(gl);

    gl.glPopMatrix();
}
于 2012-12-28T05:47:44.020 に答える