glRotatef支持中心位置

时间:2016-06-20 17:57:29

标签: android opengl-es rotation

我在使用glRotateF时遇到了一些问题。问题如下:

我绘制了3条代表笛卡尔坐标系的线,它们代表了相机的视角。

此相机可以旋转其视角。当它旋转时,它会发送一条消息,其中包含角度和已旋转的轴。

我的应用获取此消息并将其发送到方法,此方法获取已旋转的轴及其角度并将其发送到此方法:

到目前为止一切正常,问题在此之后开始。

如果我发送消息以在任何角度上旋转任何角度和角度Z的角度X,它只是旋转z轴。

在调试中我注意到它首先在给定的角度旋转了X角,但是当它以角度旋转Z时,它会回到原始位置然后旋转Z,失去X的旋转。 像这个例子:

初始职位:

Normal Coordinate System

在90º上旋转X:

Rotate 90 on X

将Z旋转90º(应该是什么):

Rotate 90 on Z right

将Z旋转90º(实际发生的事情):

Wrong Z rotate

我想要的是旋转x然后z而不会失去x旋转。

这就是我调用旋转轴的方式:

openGl.rotateX((float) x);
openGl.rotateZ((float) z);

方法rotateX和rotateZ

public void rotateX(float grau) {
    mCubeRotation = grau;
    eixoX = 1.0f;
    eixoY = 0.0f;
    eixoZ = 0.0f;
    surfaceView.requestRender(); // line to call onDrawFrame
}

public void rotateZ(float grau) {
    mCubeRotation = grau;
    eixoX = 0.0f;
    eixoY = 0.0f;
    eixoZ = 1.0f;
    surfaceView.requestRender(); // line to call onDrawFrame
}

这是轮换代码:

@Override
public void onDrawFrame(GL10 gl) {

    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    gl.glLoadIdentity();

    gl.glTranslatef(0.0f, 0.0f, -8.0f);

    // When i rotate x eixoX equal 1 and the other axis is 0.
    // When i rotate z eixoZ equal 1 and the other axis is 0.
    gl.glRotatef(mCubeRotation, eixoX, eixoY, eixoZ);

    mCube.draw(gl);

    gl.glLoadIdentity();

    lock = false;
}

如果有人帮助我,我会很感激。

1 个答案:

答案 0 :(得分:0)

您的旋转方法明确地破坏了"其他"设置的全局eixo*变量。旋转方法,你的绘制方法是通过glLoadIdentity重置渲染状态矩阵,这就是你只能进行一次旋转的原因。

一般情况下,您无法在身份矩阵之上执行您尝试使用三个简单变量和单次调用glRotatef的操作;旋转并不能整齐地连接,除非你的旋转是微不足道的,因为你需要正确地对它们进行排序(在世界空间X周围应用两次旋转,然后Y与世界空间Y周围的两次旋转不同,然后是X - 排序事项)。在通常希望从任意起始旋转开始的帧中尤其如此。通常,您希望在现有矩阵之上应用一系列glRotatef调用以逐步生成旋转。

稍微偏离主题 - 如果你在这里有任何选择我真的建议切换到使用OpenGL ES 2.x并在你的应用程序中本地维护完整的翻译矩阵。 OpenGL ES 1.1 API陈旧且效率相对较低,它的推/弹矩阵堆栈采用了一种非常具体的方式来编写场景图渲染引擎; OpenGL ES 2.x和着色器是所有现代设备的前沿和可用方式。