模型矩阵转换OpenGL ES 2.0

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模型矩阵转换OpenGL ES 2.0相关的知识,希望对你有一定的参考价值。

我在渲染器中的onDrawFrame中编写了这段代码:

[...]
setIdentityM(modelMatrix, 0);
translateM(modelMatrix, 0, 40f, 0f, 25f);
rotateM(modelMatrix, 0, 90f, 1f, 0f, 0f);
scaleM(modelMatrix, 0, 6f, 6f, 6f);

multiplyMM(MVPmatrix, 0, viewProjectionMatrix, 0, modelMatrix, 0);
myHouse1coords = myHouse1.getWorldCoords(modelMatrix); //myHouse1coords is an array
[...]

我使用这段代码来追踪我在“房子”上应用的转换:

[...]   
private final static float[] COORDINATES = { //x, y, z, r, g, b
        0f, 0f, 0f, 1f, 0f, 0f, //bottom
        2f, 0f, 0f, 0f, 1f, 0f, //dx
        0f, 1f, 0f, 0f, 0f, 1f, //sx
        2f, 1f, 0f, 1f, 1f, 1f //top
};
    public float[] getWorldCoords(float[] matrix)
{
    int i = 0;
    float[] coordinates1 = new float[4];
    float[] coordinates2 = new float[4];
    float[] coordinates3 = new float[4];
    float[] coordinates4 = new float[4];

    do {
        coordinates1[i] = COORDINATES[i];
        i++;
    } while (i < 3);
    i = 0;
    coordinates1[3] = 0f;

    do {
        coordinates2[i] = COORDINATES[i + 6];
        i++;
    } while (i < 3);
    i = 0;
    coordinates2[3] = 0f;

    do {
        coordinates3[i] = COORDINATES[i + 12];
        i++;
    } while (i < 3);
    i = 0;
    coordinates3[3] = 0f;

    do {
        coordinates4[i] = COORDINATES[i + 18];
        i++;
    } while (i < 3);
    coordinates4[3] = 0f;

    float[] finalCoordinates1 = new float[4];
    float[] finalCoordinates2 = new float[4];
    float[] finalCoordinates3 = new float[4];
    float[] finalCoordinates4 = new float[4];

    multiplyMV(finalCoordinates1, 0, matrix, 0, coordinates1, 0);
    multiplyMV(finalCoordinates2, 0, matrix, 0, coordinates2, 0);
    multiplyMV(finalCoordinates3, 0, matrix, 0, coordinates3, 0);
    multiplyMV(finalCoordinates4, 0, matrix, 0, coordinates4, 0);


    float[] coordinates = new float[16];
    i = 0;
    int j = 0;

    do {
        coordinates[i] = finalCoordinates1[j];
        i++;
        j++;
    } while (j < 4);
    j = 0;

    do {
        coordinates[i] = finalCoordinates2[j];
        i++;
        j++;
    } while (j < 4);
    j = 0;

    do {
        coordinates[i] = finalCoordinates3[j];
        i++;
        j++;
    } while (j < 4);
    j = 0;

    do {
        coordinates[i] = finalCoordinates4[j];
        i++;
        j++;
    } while (j < 4);

    Log.d("DRAGTESTRENDERER", "coords[4]" + coordinates[4]);
    return coordinates;
}

[...]

问题是,当我在logcat中运行此代码时,我得到12.0作为结果,好像我只在我的房子上应用了比例转换,我不明白为什么,因为我先前翻译并旋转它。

答案

问题是我将坐标向量的第4个元素(w分量)设置为0f而不是1f。

以上是关于模型矩阵转换OpenGL ES 2.0的主要内容,如果未能解决你的问题,请参考以下文章

如何在Android上将OpenGL ES 1.0代码转换为OpenGL Es 2.0?

当阴影相机移动时,Opengl es 2.0阴影会闪烁

用于模糊的 OpenGL ES 2.0 片段着色器速度慢且质量低

缩放、旋转、平移 w。 openGl ES 2.0 中的矩阵

OpenGL ES 2.0:投影矩阵和宽高比之间的联系是什么?

OpenGL ES 2.0中的剪切平面