0

私は次のように初期化する直交する視点を持っています:

gl.glViewport(0, 0, Constants.SCREEN_WIDTH, Constants.SCREEN_HEIGHT);   
gl.glMatrixMode(GL10.GL_PROJECTION);    
gl.glLoadIdentity();                    
gl.glOrthof(0,Constants.GAME_AREA_WIDTH, Constants.GAME_AREA_HEIGHT, 0, 1, 10);
gl.glMatrixMode(GL10.GL_MODELVIEW);     
gl.glLoadIdentity();

ここでやりたいのは、画面の上部から正方形を開始することです((x、-100、z)のように、その正方形は(yで)下降し、同時に(zで)回転します。

正方形の左上は、正方形の位置の参照として使用するものです。

さて、今、私はそれを自分の周りで回転させる方法を理解していると思います。モノを(-squareSize / 2、-squareSize / 2、z)に変換し、zに沿って回転させてから、逆に変換します。実際、この回転のみをテストすれば、問題なく機能します。

    gl.glLoadIdentity();
    angle = angle + 3;
    if(angle>360) {
        angle = angle - 360;
    }
    gl.glTranslatef(xCurrent+size/2, yCurrent+size/2,0);
    gl.glRotatef(angle, 0, 0, 1);
    gl.glTranslatef(-(xCurrent+size/2), -(yCurrent+size/2),0);
//omitted: enable client state, draw elements, disable client state.

これだけで、正方形をどこに配置しても(xとyの小さな負の値でさえ、画面に部分的にしか表示されません)、その中心を中心に回転します。

しかし、yに下向きの翻訳を追加する方法がわかりません。私がこのようなことをした場合:

    angle = angle + 3;
    if(angle>360) {
        angle = angle - 360;
    }
    gl.glTranslatef(xCurrent+size/2, yCurrent+size/2,0);
    gl.glRotatef(angle, 0, 0, 1);
    gl.glTranslatef(-(xCurrent+size/2), -(yCurrent+size/2),0);

    yCurrent = yCurrent + realSpeed;
    if(yCurrent>Constants.GAME_AREA_HEIGHT+size) {
        yCurrent=-size;
    }
    gl.glTranslatef(0f, yCurrent,0f);

正方形が(0,0、z)から始まる場合にのみ問題なく機能します。その場合、正方形は下に移動し、中心を中心に回転します。

ただし、xまたはyのいずれかに対して0以外の正または負の値で開始した場合でも、下に移動しますが、中心に対して回転する代わりに、奇妙なスパイラルモーションを実行します。

4

2 に答える 2

1

OpenGLマトリックススタックポストは乗算されます。これは事実上、最後に最もローカルな変換を行う必要があることを意味します。

したがって、おそらく実行したいのはglTranslatef、タイルの現在の位置に対してを実行してから、変換/回転/非変換のシーケンスを実行して回転を実行することです。

于 2012-02-22T20:59:18.803 に答える
0

編集者注:この回答は質問編集から移動されたもので、元のポスターによって書かれています。

まず、以下の答えでトミーが言っていることは正しいです。最初に翻訳を新しい位置にコーディングしてから、翻訳/回転/翻訳を行うコード行を追加する必要があります。

また、正方形の中心を座標(0,0、z)に変換するときに、xとyに割り当てる値は単純に間違っているため、計算を間違えました。ここでの基本的な考え方はこれです。正方形に次の頂点があるとしましょう。

private static float xLeft = -0.75f;
private static float xRight = +0.25f;
private static float yTop = 2f;
private static float yBottom = 1f;
protected static float vertices[] = { 
        //x      y        z
        xLeft,  yTop,    -5f,   //Top left      triangle1-1     triangle2-1
        xRight, yTop,    -5f,   //Top right     triangle1-2
        xLeft,  yBottom, -5f,   //Bottom left                   triangle2-3
        xRight, yBottom, -5f    //Bottom right  triangle1-3     triangle2-2
}; 

この場合、この正方形の中心を(0,0、z)に配置するために必要な移動量は次のとおりです。

private float xCenterTranslation = (xRight+xLeft)/2f;
private float yCenterTranslation = (yTop+yBottom)/2f;

正方形をy軸上で平行移動すると同時に、その中心に沿って回転させるためのコードは次のとおりです。

gl.glTranslatef(0, translationAmountLinearY, 0); //translate on y
//decrement Y translation for next rendering
translationAmountLinearY+=translationDeltaLinearY;

gl.glTranslatef(xCenterTranslation, yCenterTranslation, 0);//translate BACK from center
gl.glRotatef(rotationAmountZDegrees, 0, 0, 1);//rotate
gl.glTranslatef(-xCenterTranslation, -yCenterTranslation, 0);//translate to center
//increment z rotation for next rendering: 
rotationAmountZDegrees+=0.04f;
于 2015-08-05T04:49:27.923 に答える