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

How to add texture (image) to SceneKit model so that it covers the model (mesh) uniformly?

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

例如,我使用的沙发 3D 模型大致按比例(80 英寸宽 x 36 英寸高 x 36 英寸深)。我将用尺寸为 290 x 290 像素的样本织物图像纹理覆盖网格。

我看到的结果如下:

在我的代码中:

        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,这意味着它采用纹理边缘的像素值并将其用于 'fill in' 模型的其余部分(具有 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 documentation 包含一张显示每种模式效果的图表,包括看起来接近您当前观察到的效果的图表。