Android openGL ES 3, какова альтернатива классам Vector3f и Matrix4f? - PullRequest
1 голос
/ 16 марта 2020

В openGL

  • при использовании LWJGL вы сможете создать такую ​​матрицу преобразования:

    public static Matrix4f createTransformationMatrix(Vector3f translation,float rx,float ry,float rz,float scale ){
    
    Matrix4f matrix = new Matrix4f();
    matrix.setIdentity();
    //translate
    Matrix4f.translate(translation,matrix,matrix);
    
    //rotate
    Matrix4f.rotate((float)Math.toRadians(rx),new Vector3f(1,0,0) , matrix, matrix);
    Matrix4f.rotate((float)Math.toRadians(ry),new Vector3f(0,1,0) , matrix, matrix);
    Matrix4f.rotate((float)Math.toRadians(rz),new Vector3f(0,0,1) , matrix, matrix);
    
    //scale
    Matrix4f.scale(new Vector3f(scale,scale,scale),matrix,matrix);
    
    return matrix;
    
    }
    
  • после этого вы можете загрузить эту преобразованную матрицу в единую переменную, используя это:

    FloatBuffer matrixBuffer = FloatBuffer.allocate(16); //means 16 elements in matrix 4x4
    
    protected void loadMatrix(int location , Matrix4f matrix){
    
        matrix.store(matrixBuffer);
        matrixBuffer.flip();
        glUniformMatrix4f(location,false,matrixBuffer);
    }
    

Что такое Matrix4f и Vector3f:

  • Matrix4f: похоже, матрица 4x4, содержащая 16 элементов с плавающей точкой.

  • Vector3f: кажется трехмерным вектором, содержащим 3 числа с плавающей точкой.

И эти 2 класса, кажется, можно найти только в LWJGL.

Но я использую openGl ES 3 на android

Я не могу найти какие-либо классы в android, такие как Matrix4f и Vector3f.

Знаете ли вы, что я должен делать в android для реализации той же функциональности?

1 Ответ

0 голосов
/ 17 марта 2020

В OpenGL ES 2.0 / 3.0 для преобразования матрицы вы можете использовать функции stati c из класса Matrix:

import android.opengl.Matrix
...
protected val viewMatrix = FloatArray(16)
protected val projectionMatrix = FloatArray(16)
protected val modelMatrix = FloatArray(16)
protected val modelViewMatrix = FloatArray(16)
protected val mvpMatrix = FloatArray(16)
...
Matrix.setLookAtM(viewMatrix, 0, 0f, 0f, 4f,
        0f, 0f, 0f, 0f, 1.0f, 0.0f) // set camera position
...
Matrix.frustumM(projectionMatrix, 0, left, right, bottom, top, near, far)
...
// move object up/down and left/right
Matrix.translateM(modelMatrix, 0, x, y, z) 
// angle and direction of rotation
Matrix.rotateM(modelMatrix, 0, angle, 0.5f, 0.5f, 0.5f)
Matrix.scaleM(modelMatrix, 0, 4f, 4f, 4f) // scale object 
// matrix multiplication
Matrix.multiplyMM(modelViewMatrix, 0, viewMatrix, 0, modelMatrix, 0)
Matrix.multiplyMM(mvpMatrix, 0, projectionMatrix, 0, modelViewMatrix, 0)
...
// final mvp for shader
fun getMVPMatrixAsFloatBuffer(): FloatBuffer = Buffers.floatBuffer(mvpMatrix)
...