我有一个正交透视图,我初始化如下:
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值处开始它,它仍将向下移动,但做一个奇怪的螺旋运动而不是再次旋转其中心。
答案 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;