例如说我有一个名为Matrix4x4的类,并且该类具有以下功能:

public float[] MultiplyVec(float[] vec){
    float[] newV = new float[4];

    for(int i = 0; i < 4; i++){
        int value = 0;
        for(int j = 0; j < 4; j++){
            value += matrix[i][j] * vec[j];
        }
        newV[i] = value;
    }

    return newV;
}


在另一个类中,我有一个对象名称modelMatrix,它是Matrix4x4的实例,该实例通过以下方式初始化:

public Matrix4x4 modelMatrix = Matrix4x4.IdentityM();


IdentityM()函数包含以下内容:

public static Matrix4x4 IdentityM(){
        return new Matrix4x4(new float[][]{
                {1f, 0f, 0f, 0f},
                {0f, 1f, 0f, 0f},
                {0f, 0f, 1f, 0f},
                {0f, 0f, 0f, 1f}
        });
}


现在我有一个小问题,我无法解决。
举例来说,我有一个x,y,宽度和高度的矩形。
现在,例如,我这样做:

modelMatrix.translate(0.002f, 0.002f, 0);


函数翻译的位置包含:

public void translate(float x, float y, float z){
        matrix[0][3] += x;
        matrix[1][3] += y;
        matrix[2][3] += z;
}


将modelMatrix发送到着色器时,使用OpenGL ES,对象可以正确移动,但是当我使用modelMatrix计算顶点时,它们保持不变且不变,计算顶点的函数为:

public float[] getVertices(){
        // Vertices in object space:
        float[] vector1 = {x, y, 0f, 1f};
        float[] vector2 = {x + width, y, 0f, 1f};
        float[] vector3 = {x + width, y + height, 0f, 1f};
        float[] vector4 = {x, y, 0f, 1f};

        // Calculate the vertices in world space:
        float[] vector1r = modelMatrix.MultiplyVec(vector1);
        float[] vector2r = modelMatrix.MultiplyVec(vector2);
        float[] vector3r = modelMatrix.MultiplyVec(vector3);
        float[] vector4r = modelMatrix.MultiplyVec(vector4);

        if(LoggerConfig.ON) Log.d("Middle Vertex", vector1r[2] + ", "
                                                 + vector1r[3]);

        return new float[] {
                vector1r[0], vector1r[1],
                vector2r[0], vector2r[1],
                vector3r[0], vector3r[1],
                vector4r[0], vector4r[1]
        };
    }


即使我移动对象并且该对象在OpenGL中移动,日志中的结果也保持不变,这是我正在进行的计算的问题吗?我该如何纠正?

最佳答案

MultiplyVec()方法中,将所有中间值四舍五入为整数:

for(int i = 0; i < 4; i++){
    int value = 0;
    for(int j = 0; j < 4; j++){
        value += matrix[i][j] * vec[j];
    }
    newV[i] = value;
}


由于value是类型int的变量,因此所有部分和都将四舍五入为整数。您需要使用float变量作为中间值:

for(int i = 0; i < 4; i++){
    float value = 0f;
    ...

10-06 13:31