我开始学习Android OpenGL ES 2.0,并尝试掌握其中的概念。我编写了下面的函数来旋转一个矩形。通过调整rotateM方法中的值,我成功地进行了一些旋转。但是,我无法使我的矩形进行一些具体的旋转,例如向右旋转45度。
基本上,我正在查看Android参考文档,其中提到以下内容:
rotateM(float[] m,int mOffset,float a,float x,float y,float z) 围绕轴(x、y、z)以角度a(以度为单位)旋转矩阵m。
现在我理解我们提供了模型矩阵,该矩阵中的偏移量以及旋转角度,但为什么我们必须提供xyz-轴分量,这些值真正起到了什么作用?
希望有人能够清楚地解释一下rotateM方法,谢谢!
private void positionRectangleInScene() {
setIdentityM(modelMatrix, 0);
rotateM(
modelMatrix, // m : source matrix
0, // mOffset : index into m where the matrix starts
0f, // a : angle ato rotate in degrees
1f, // x : x-axis component
1f, // y : y-axis component
1f); // z : z-axis component
multiplyMM(
modelViewProjectionMatrix, 0,
viewProjectionMatrix, 0,
modelMatrix, 0);
}
Matrix.rotateM()
和Matrix.invertM()
函数会进行额外的内存分配(在计算过程中存储一些过渡数据)。如果你每帧都调用它们(更新对象/相机位置),最好基于它们的源代码实现自己的函数,并预先分配临时变量。这将减少 GC 活动。在我的情况下,当我替换它们后,在onDrawFrame()
中就没有任何内存分配了,这使得帧率更加平滑。 - keaukraine