如何将纹理(图像)添加到SceneKit模型,使其统一覆盖模型(网格)?

刚开始玩SceneKit和ARKit。 我遇到的一个问题是用图像纹理覆盖3DModel。 发生的事情是在ARKit中渲染时3DModel的一部分正确使用纹理。 其他部分则不是。

例如,我正在使用大致规模的沙发3DModel(80英寸宽x 36英寸高x 36英寸深)。 我打算用一个尺寸为290 x 290像素的swatch fabric图像纹理来覆盖网格。

我看到的结果如下:

在此处输入图像描述

在我的代码中:

if let matts = child.geometry?.materials { var matIndex = 0 for mat in matts { let material = SCNMaterial() material.diffuse.contents = UIImage(named: "fabric-coral") material.isDoubleSided = true child.geometry?.replaceMaterial(at: matIndex, with: material) matIndex += 1 } } 

我的问题是如何使用UIImage并让它重复并覆盖网格而没有现在正在做的奇怪的方形图案?

在这种情况下,你的UV纹理坐标必须延伸到0.0 – 1.0范围之外,这很好,但它可以解释你所看到的。 SCNMaterialProperty的默认纹理包装行为是CLAMP ,这意味着它采用纹理边缘的像素值并使用它来“填充”模型的其余部分(UV坐标在0.0 – 1.0范围之外的部分)。

更改wrapTwrapS属性应该解决这个问题。

 . . . material.diffuse.contents = UIImage(named: "fabric-coral") material.diffuse.wrapT = SCNWrapMode.repeat material.diffuse.wrapS = SCNWrapMode.repeat material.isDoubleSided = true . . . 

SCNWrapMode文档包含一个显示每种模式效果的图形,包括一个看起来接近您当前观察的模式。