【问题标题】:Unwanted artefacts in SceneKit nodes with subdivisionLevel > 0细分级别 > 0 的 SceneKit 节点中的不需要的伪影
【发布时间】:2018-04-06 10:28:08
【问题描述】:

好的,这个代码很长很复杂,所以我必须仔细描述这个问题。

假设您正在通过围绕轴车削一组点来创建 3D 对象。您现在要为这些点生成球形纹理贴图。现在有一个困难的二分法:

如果您创建一个完全循环的网格,其中最后一个点连接到第一个点,并且没有两个多边形面不共享的边,那么您无法创建真正的球面贴图。这是因为顶点与纹理点是 1:1 映射的。第一个面的最左边的顶点需要映射到 U 值 0;最后一个面的最右边的顶点将映射到 1 - 但它们是相同的顶点!结果是网格的一部分被纹理化,大部分纹理贴图从右到左,而所有其他部分从左到右正确映射。

理论上你可以通过复制第一组顶点来解决这个问题,这样它们就可以根据它们所涉及的多边形具有不同的纹理坐标,但这会带来另一个问题。如果我这样做并将细分级别应用于生成的几何图形,则会出现难看的折痕,并且纹理似乎严重扭曲。在静止图像上不是很明显,但请查看图像的右下角。

理想情况下,我希望能够将纹理贴图和细分应用到同一个网格,而不会遇到这些丑陋的效果。有人有什么想法吗?

【问题讨论】:

    标签: ios macos 3d scenekit


    【解决方案1】:

    细分模型中的折痕是复制这些顶点后的标准细分行为。事实上,这是我和许多其他 3D 建模师创建折痕的方法(与甚至 scenekit 支持的边缘和顶点折痕选项相反)。因此,即使它们是您“不想要的”,也是预期的行为。

    假设您正在通过围绕轴车削一组点来创建 3D 对象。您现在想要为这些点生成一个球形纹理贴图。

    我很难想象为什么要为环面生成球面图。球面映射专门用于反射。

    无论如何,问题不在于细分或地图,而在于您使用共享顶点这一事实。

    但这些是同一个顶点!

    没错。您需要向 SCNGeometry 提供独特的顶点,而不是在纹理基本重复的点处添加额外的顶点。这样细分将起作用,您可以按预期对其进行映射。

    【讨论】:

    • 其实这不是标准行为; SceneKit 使用折痕几何元素来生成锐利的边缘,并使用顶点法线在面之间放置可见的锐利线。问题实际上是我试图车削的轮廓中有一些多余的顶点,这混淆了细分算法
    • 其实是标准的catmull clark细分行为。 Scenekit 不使用折痕几何元素,除非您使用它们。它专门用于替换使用额外的几何图形来创建折痕。 3DS Max 和其他软件包在多年前就开始支持相同的功能,但部分原因是缺乏对文件格式的支持,这些文件格式使用依赖于该标准行为的其他几何图形更为常见。
    • 我认为我们在这里谈论的是交叉目的;我的意思是在共享相同顶点位置但不同顶点索引的线之间放置折痕不是标准行为。细分时,除非使用折痕,否则共享相同 x/y/z 值的两个顶点将被视为相同顶点。我的对象目前没有折痕,看起来仍然无缝。
    • 啊,是的,只要这些额外的顶点不会导致基础模型中的额外面。使用折痕时,它们仍将被视为相同的顶点,这就是折痕特征的目的:添加折痕而不添加额外的几何图形。 SceneKit 中的细分是 Catmull-Clark 细分,由细分和平滑两个主要阶段组成。折痕选项允许您在边缘和顶点上设置权重以限制它们被平滑的程度,它不会影响边缘/线的数量。无论如何,很高兴听到您已经解决了您的特定问题。
    • 是的,这只是一个好的 ol' GIGO 案例。现在我需要改进我的纹理展开过程,以便它可以在需要时复制顶点。这对于多纹理对象来说会很有趣:D
    【解决方案2】:

    原来我的问题实际上是我试图旋转的轮廓中有一些多余的顶点,这对于细分来说太多了。删除这些后,细分看起来就好了 - 因此,在细分打包之前,您可以在模型上拥有的原始边缘的复杂程度可能只是一个限制。

    【讨论】:

      猜你喜欢
      • 2018-07-06
      • 1970-01-01
      • 1970-01-01
      • 2016-08-19
      • 1970-01-01
      • 2011-05-15
      • 1970-01-01
      • 2020-07-30
      • 1970-01-01
      相关资源
      最近更新 更多