OpenGL,向下平移y并在ELEMENT中心周围旋转(在Android上)

时间:2012-02-22 20:44:57

标签: android opengl-es rotation translate-animation

我有一个正交透视图,我初始化如下:

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上)同时在ro(在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值处开始它,它仍将向下移动,但做一个奇怪的螺旋运动而不是再次旋转其中心。

2 个答案:

答案 0 :(得分:1)

OpenGL矩阵堆栈后期相乘。这实际上意味着你应该最后进行最本地的转型。

所以您可能想要做的是对图块的当前位置执行glTranslatef,然后执行translate / rotate / untranslate序列以实现旋转。

答案 1 :(得分:0)

编辑注意:此答案已从问题编辑中移除,它由原始海报编写。

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

此外,当想要将正方形的中心平移到坐标(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;