安卓OpenGL ES 2.0 - rotateM解释

11

我开始学习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
1个回答

11

xyz值代表旋转的轴。例如,围绕y轴的旋转将被指定为(m,0,angle,0,1,0)。您指定的(1,1,1)表示您将绕所有三个轴旋转,这不是典型用法。


这似乎是有道理的,但我想知道为什么它需要使用浮点参数来表达xyz轴?看起来你只需要指定0或1来表示绕某个轴旋转。 - Gio
3
我的意思是:想象一个从原点(0,0,0)指向你所指定的点xyz(x,y,z)的向量。物体将围绕该轴旋转。 - Prabindh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接