【问题标题】:get outward facing normal from vertices从顶点向外法线
【发布时间】:2020-06-21 15:42:51
【问题描述】:

我正在 Optix 中开发一个热应用程序,我想导入一个 GLTF 文件,然后从每个基元开始射线。

我不完全理解为存储在 gltf 中的面孔重新分级“正面”和“背面”的文档。 有没有正确的方法来使用三角形的三个顶点并使用侧面的叉积来计算向外的法线?如果我的代码按预期工作,我有时会得到一个向内的,有时是一个向外的正常。还是顶点存储的顺序是任意的,因此方向可能会反转? 如果我理解正确的话,每张脸也存储了 3 个“法线”。如果我所有的脸都是平的/不弯曲的,我是否可以使用其中任何一个而无需计算任何东西?

提前感谢您的帮助!

【问题讨论】:

    标签: blender gltf optix


    【解决方案1】:

    在 glTF 中,法线是按顶点存储的。在大多数图形管道中,面的法线通常在光栅化(硬件)期间计算,作为该面的顶点法线之间的线性插值。

    不管怎样,glTF 确实在primitive.indices 中指定了逆时针旋转。但是,glTF 中的材质可以是双面的,Double Sided 的规范表明,在查看表面的背面时,必须先翻转法线才能评估光照。

    在实践中,有时创作工具会生成由内向外的多边形网格,甚至具有薄壁(非流形或非防水)几何形状。在这种情况下,很难说什么是“内部”与“外部”,因为它们看起来相同,并且缠绕顺序可能是任意的。 (在 Blender 编辑模式下,点击菜单 Mesh -> Normals -> Recalculate Outside 来解决这个问题)。

    对于单面材料,缠绕顺序不应随意,因为背面是隐藏的。使用这些材料时,人们会期望逆时针缠绕顺序三角形。在 Blender 中,这可以通过选择“Eevee”引擎、调出材质属性面板并勾选“Backface culling”来完成。确保这发生在材质设置中,而不是在视口设置中,否则 glTF 导出器将找不到它。使用“材料预览”查看结果。

    如果我所有的脸都是平的/不弯曲的,我是否可以使用其中任何一个而无需计算任何东西?

    是的,如果您有完全平坦的面,我希望每个面内的顶点法线相等,这样线性插值不会对法线向量产生任何变化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-20
      • 2013-08-14
      • 1970-01-01
      • 2013-02-15
      • 1970-01-01
      相关资源
      最近更新 更多