我在使用glRotateF时遇到了一些问题。问题如下:
我绘制了3条代表笛卡尔坐标系的线,它们代表了相机的视角。
此相机可以旋转其视角。当它旋转时,它会发送一条消息,其中包含角度和已旋转的轴。
我的应用获取此消息并将其发送到方法,此方法获取已旋转的轴及其角度并将其发送到此方法:
到目前为止一切正常,问题在此之后开始。
如果我发送消息以在任何角度上旋转任何角度和角度Z的角度X,它只是旋转z轴。
在调试中我注意到它首先在给定的角度旋转了X角,但是当它以角度旋转Z时,它会回到原始位置然后旋转Z,失去X的旋转。 像这个例子:
初始职位:
在90º上旋转X:
将Z旋转90º(应该是什么):
将Z旋转90º(实际发生的事情):
我想要的是旋转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;
}
如果有人帮助我,我会很感激。
答案 0 :(得分:0)
您的旋转方法明确地破坏了"其他"设置的全局eixo*
变量。旋转方法,你的绘制方法是通过glLoadIdentity
重置渲染状态矩阵,这就是你只能进行一次旋转的原因。
一般情况下,您无法在身份矩阵之上执行您尝试使用三个简单变量和单次调用glRotatef
的操作;旋转并不能整齐地连接,除非你的旋转是微不足道的,因为你需要正确地对它们进行排序(在世界空间X周围应用两次旋转,然后Y与世界空间Y周围的两次旋转不同,然后是X - 排序事项)。在通常希望从任意起始旋转开始的帧中尤其如此。通常,您希望在现有矩阵之上应用一系列glRotatef
调用以逐步生成旋转。
稍微偏离主题 - 如果你在这里有任何选择我真的建议切换到使用OpenGL ES 2.x并在你的应用程序中本地维护完整的翻译矩阵。 OpenGL ES 1.1 API陈旧且效率相对较低,它的推/弹矩阵堆栈采用了一种非常具体的方式来编写场景图渲染引擎; OpenGL ES 2.x和着色器是所有现代设备的前沿和可用方式。