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

The OpenGL matrix stack post multiplies. Which effectively means that you should do the most local transformation last.

So what you probably want to do is to perform a glTranslatef to the tile's current position, then do the translate/rotate/untranslate sequence to effect your rotation.

于 2012-02-22T20:59:18.803 回答
0

编者注:此答案是从问题编辑中移出的,由原始海报撰写。

首先,Tommy 在下面的答案中所说的是正确的,我应该首先将翻译编码到新位置,然后添加执行翻译/旋转/翻译的代码行。

此外,当我想将正方形的中心转换为坐标 (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 回答