【问题标题】:OpenGL ES20 - Light a cube, how to get normals?OpenGL ES20 - 点亮一个立方体,如何获得法线?
【发布时间】: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


【解决方案1】:

您面临的问题是您在立方体面之间共享顶点。法线是一个与曲面平面正交的向量。

以顶/右/前顶点为例(您与前、右和顶面共享)。

在正面使用时,法线需要以 0、0、1 指向您 用在右脸时,法线需要指向右边为1,0,0 在顶面使用时,法线需要向上指向为 0, 1, 0

那么如何调和呢? 您可以将顶点的法线设置为从拐角处指出,例如为 0.707、0.707、0.707。这很可能会在拐角处为您提供有趣的照明效果,但可能不是您想要的。

另一种解决方案是不重复使用面之间的顶点。因此,您将需要 24 个(每边 4 个)而不是 8 个。然后您将拥有每个顶点的 3 个版本,但现在每个版本都只属于一个面,因此您可以将法线向量设置为垂直于该面。您还可以只为该面设置颜色,因为您将不再与其他面共享顶点。

【讨论】:

  • 感谢您的解释。认为会有一个方便的解决方案,使用索引而不是经常重写顶点,但我现在已经切换到更频繁地使用相同的顶点,现在我终于可以看到一些曙光了。
猜你喜欢
  • 2020-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-19
  • 1970-01-01
  • 2011-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多