模型矩阵转换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 片段着色器速度慢且质量低
缩放、旋转、平移 w。 openGl ES 2.0 中的矩阵