2017-05-09 143 views
-1

我有一个顶点数组定义带有以下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没有成功。

+0

顶点数组并不是一个矩阵,而是一个向量列表。你需要对每个矢量单独做矩阵运算。这页可能有助于https://en.wikipedia.org/wiki/Translation_(几何) –

+0

@Craig我知道它不是一个矩阵,但它被视为一个。只要看看Matrix.multiplyM签名。它接受两个浮点数组作为被视为矩阵的参数。 https://developer.android.com/reference/android/opengl/Matrix.html#multiplyMM(float [],int,float [],int,float [],int) –

+0

不是。它是放入4x4矩阵中的4个任意向量。如果是三角形呢? 3x4的?怎么样一个复杂的角色模型有1000个顶点。你不能用一个矩阵乘法来转换它们。 –

回答

1

的意见后,我意识到,我想错了,我需要应用矩阵上的每一个顶点,像这样:

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]; 
} 

和穿越 - 方法:

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; 
} 

这是我在矩阵转换之前尝试转换的图像: image before transformation

和之后: image after transformation