【问题标题】:Vertex normals for a cube立方体的顶点法线
【发布时间】:2011-06-30 02:46:01
【问题描述】:

一个立方体有 8 个不同的顶点。这 8 个顶点法线(单位向量)中的每一个都与共享该顶点的每个边成 135 度角,这是真的吗?顶点法线指向立方体外/外?您的答案在技术上应该是正确的。或者它取决于立方体是如何定义(绘制)的,例如使用三角形条带或为立方体的每一侧定义 2 个三角形的索引?顶点法线的目的是在 OpenGL ES 应用程序中平滑着色和照明。

【问题讨论】:

    标签: opengl-es


    【解决方案1】:

    如果立方体由 8 个独特的顶点定义,那么法线可能会与每条边成 135 度角,正如您所提到的。

    但是,正是出于这个原因,一个立方体通常使用 24 个顶点来定义。这允许您通过在每个角处“复制”顶点来获得垂直于每个面的顶点法线。以这种方式定义立方体实际上只是定义了 6 个单独的面,每个面都适当地指向外面。

    【讨论】:

      【解决方案2】:

      平滑具有 8 个顶点的立方体以使其看起来像一个球体没有点。这样你会得到一个非常丑陋的球体。绘制立方体的唯一合理方法是使用 24 个唯一顶点。

      【讨论】:

        【解决方案3】:

        立方体的八个角顶点的中心法线实际上将形成一个 125 度的角度,每个连接边 16 分钟。

        There's a good discussion of this topic elsewhere on SO.

        【讨论】:

          【解决方案4】:

          135 度可以通过每个顶点的法向量指向外来直观地解释,并且必须与顶点所属的每条边共享相同的角度。因为内角是 90 度,所以 270 度在这个角的外面。因此 270 度 /2 = 135 度。

          每个顶点的法向量用于计算三角形的法向量。对于您的 3d 模型是平面三角形的集合,只有一个法线来计算照明会导致平面阴影(如果对象真的那么前卫,那么您在物理上是正确的)。使用顶点法线为三角形的每个点插入“法线”,可以提供重新组装平滑表面的平滑照明。

          这种方法的问题是每个顶点只使用一个法线导致立方体具有像球体一样的阴影,同时仍然是立方体。

          这基本上就是为什么要定义一个具有 24 (= 6x4) 个顶点而不是 6 个顶点的立方体的原因。这样一来,人们就可以拥有一个具有所有面(因此它的每个三角形的两个)的立方体具有正确(平坦) 法线。

          拥有 24 个顶点和因此 24 条法线提供了为每个三角形/面仅定义前向法线的可能性,以便法线始终指向远离三角形/面的 90 度角,因此在每个三角形中提供平坦的阴影/face 更适合立方体,因为它的表面非常平坦。

          通常人们不希望以平滑连续的方式遮蔽像 90 (270) 度这样的陡峭角度。法线插值仅用于模拟“有机”/“平滑”表面。由于这些有机/光滑表面是常态(想想茶壶或 3d 图形),因此决定将顶点法线与位置和 UV 坐标一起存储,因为它是大多数“连续”3d 表面中的常态.通常,您可以添加更多三角形来表示模型中的平滑拓扑。因此,拥有顶点法线是为了最小化平均模型的信息量而做出的权衡。

          因此,具有所有平面三角形的立方体模型是最坏的情况。这就是为什么立方体的每个角都需要三个顶点法线,每个面对应一个顶点法线。

          PS:如今,这些“光滑”表面是通过使用从更高分辨率模型烘焙而来的法线贴图来进一步定义的。使用法线贴图,人脸中的每个点都有自己的法线向量(或者每个点的法线向量可以从映射的法线贴图提供的法线向量样本中插值)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-12-06
            • 2013-07-01
            • 2017-02-05
            相关资源
            最近更新 更多