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

时间:2017-11-29 18:50:12

标签: ios swift xcode scenekit arkit

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

例如,我使用大致规模的沙发3DModel(80英寸宽x 36英寸高x 36英寸深)。我将使用尺寸为290 x 290像素的色板布料图像纹理覆盖网格。

我看到的结果如下:

enter image description here

在我的代码中:

        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并让它重复并覆盖网格而没有它现在正在做的奇怪的方形图案?

1 个答案:

答案 0 :(得分:3)

在这种情况下,你的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 documentation包含一个显示每种模式效果的图形,包括一个看起来接近您当前观察的模式。