具有subdivisionLevel>的SceneKit节点中的不需要的伪像; 0

时间:2017-10-25 10:57:20

标签: ios macos 3d scenekit

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

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

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

Incorrectly mapped texture

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

Nasty 'pinching'

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

2 个答案:

答案 0 :(得分:0)

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

  

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

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

无论如何,问题不是细分或地图,而是你使用共享顶点的事实。

  

但这些是相同的顶点!

右。您需要将唯一顶点提供给SCNGeometry,而不是仅在纹理基本重复的点处添加额外顶点。这样细分就可以了,你可以按预期映射它。

答案 1 :(得分:0)

原来我的问题实际上是我试图旋转的配置文件中有一些冗余顶点,这对于细分处理来说太多了。删除它们之后,细分看起来很好 - 所以在细分包之前,模型的原始边缘可能只有一个限制。