【发布时间】:2014-02-06 12:55:29
【问题描述】:
要为我的 OpenGL ES20 立方体添加一些闪电,我需要计算每个平面的法线。我找到了关于闪电的“教程”,但他们只是将法线硬编码到立方体中,在我看来这不是最佳选择,因为它似乎有限?
所以我对立方体的处理方法如下:
private float[] mVertices = {
-1, -1, -1, // bottom left
1, -1, -1, // bottom right back
1, 1, -1, // top right
-1, 1, -1, // top left
-1, -1, 1, // bottom left
1, -1, 1, // bottom right front
1, 1, 1, // top right
-1, 1, 1 // top left
};
private float[] mColors = {
0.6f, 0f, 0.6f,
0.6f, 0f, 0.6f,
0.6f, 0f, 0.6f,
0.6f, 0f, 0.6f,
0.8f, 0f, 0.6f,
0.8f, 0f, 0.6f,
0.8f, 0f, 0.6f,
0.8f, 0f, 0.6f
};
private float[] mNormal = new float[?]; ?
private short[] mIndices = {
0, 4, 5,
0, 5, 1,
1, 5, 6,
1, 6, 2,
2, 6, 7,
2, 7, 3,
3, 7, 4,
3, 4, 0,
4, 7, 6,
4, 6, 5,
3, 0, 1,
3, 1, 2
};
即我已经定义了所有 8 个顶点以及索引,关于如何将它们组合成三角形。 为了得到正常的矩阵,我读到我应该反转矩阵,然后转置它。所以我试过这个:
float[] mTempMatrix = new float[mVertices.length];
Matrix.invertM(mTempMatrix, 0, mVertices, 0);
Matrix.transposeM(mNormal, 0, mTempMatrix, 0);
但这总是用零填充,我的立方体保持黑色。我应该如何计算正常矩阵?它应该与模型矩阵有关吗?如果是,我应该在哪里执行此操作,因为它们真正组合的唯一位置是在着色器中?还有其他更合适的方法吗?
【问题讨论】:
-
您的顶点是硬编码的,因此对法线进行硬编码也很有意义(它们不会像顶点一样改变)。您认为这以何种方式呈现出某种限制?
-
嗯,是的,这是真的,我在想另一种方式,因为我正在更改构造函数中的顶点 - 但我只是根据立方体的宽度、高度和深度来移动它们。我更多地考虑“未来”,更多细节和复杂的对象,如多边形等。此外,我有点困惑如何以现在的方式添加硬编码的法线,尤其是索引,我有多少将需要以及它们应该基于哪里?编辑:在我见过的例子中,他们定义了更多的顶点,没有索引,这就是为什么我不能真正看到我应该如何调整那部分。
-
好的,我一直在尝试一些东西。我认为要“硬编码”其中的法线,我必须改变立方体的绘制方式。我已经更改了颜色,以确定哪个索引是立方体的哪一侧,但是将所有颜色更改为白色,除了一个导致彩色角,顶点被多次使用。所以我真的不知道我应该如何在我的立方体的实现中添加一个平面法线。
标签: android matrix 3d opengl-es-2.0 normals