Android 如何平移顶点坐标

Android 如何平移顶点坐标,android,opengl-es,Android,Opengl Es,我有一个顶点数组,用以下xyzw坐标定义一个正方形: -0.5, 0.0, 0.0, 0.0, -0.5, -1.0, 0.0, 0.0, 0.5, -1.0, 0.0, 0.0, 0.5, 0.0, 0.0, 0.0 我想将其向右平移两个单位,以便生成的数组变成: 1.5, 0.0, 0.0, 0.0, 1.5, -1.0, 0.0, 0.0, 2.5, -1.0, 0.0, 0.0,

我有一个顶点数组,用以下xyzw坐标定义一个正方形:

      -0.5,  0.0, 0.0, 0.0,
      -0.5, -1.0, 0.0, 0.0,
       0.5, -1.0, 0.0, 0.0,
       0.5,  0.0, 0.0, 0.0
我想将其向右平移两个单位,以便生成的数组变成:

      1.5,  0.0, 0.0, 0.0,
      1.5, -1.0, 0.0, 0.0,
      2.5, -1.0, 0.0, 0.0,
      2.5,  0.0, 0.0, 0.0,

我知道我可以通过简单地在x坐标上加一个来实现这一点,但我试着用矩阵来实现这一点。我读了很多关于这个主题的教程和文章,但我找不到任何确切的例子。我想使用OpenGL ES和Java(android)来实现这一点。我还想在将阵列发送到GPU之前应用它。我尝试使用Matrix.translateM和multiplyMM,但没有成功。

在评论之后,我意识到我的想法是错误的,我需要在每个顶点上应用矩阵,如下所示:

transformationMatrix = doTransformations(4f, 2f, 4f, 4f, -60);
float[] result = new float[4];
for (int j = 0; j < 12; j += 3) {
    float[] data = new float[]{
            vertexData[j + 0],
            vertexData[j + 1],
            vertexData[j + 2],
            1};
    Matrix.multiplyMV(result, 0, transformationMatrix, 0, data, 0);
    vertexData[j + 0] = result[0];
    vertexData[j + 1] = result[1];
    vertexData[j + 2] = result[2];
}
这是我在矩阵变换之前尝试变换的图像:

及之后:

顶点数组与其说是矩阵,不如说是向量列表。你需要对每个向量分别进行矩阵运算。这个页面可能会对@Craig有所帮助,我知道它不是一个矩阵,但它被视为一个矩阵。只要看看Matrix.multiplyM签名。它接受两个浮点数组作为参数,并将其视为矩阵,int,float[],int,float[],int)不,不是。将4个任意向量放入4x4矩阵中。如果是三角形呢?3x4?有1000个顶点的复杂角色模型怎么样。“你不能用一个矩阵乘法来变换它们。@克雷格:是的,你的回答让我思考了一下,我意识到我必须迭代每个向量。所以我需要的是multiplyMV,它成功了!非常感谢。
public static float[] doTransformations(float x, float y, float scaleX, float scaleY, float angle){
    float[] scratch = new float[16];
    float[] transformation = new float[16];
    float[] mRotationMatrix = new float[16];
    Matrix.setIdentityM(transformation,0);

    Matrix.translateM(transformation, 0, x, y ,0);
    Matrix.scaleM(transformation, 0, scaleX, scaleY, 1);
    Matrix.setRotateM(mRotationMatrix, 0, angle, 0, 0, -1.0f);

    Matrix.multiplyMM(scratch, 0,transformation,0,mRotationMatrix,0);
    return scratch;
}