【问题标题】:How to add texture (image) to SceneKit model so that it covers the model (mesh) uniformly?如何将纹理(图像)添加到 SceneKit 模型,使其均匀覆盖模型(网格)?
【发布时间】:2018-05-13 13:44:06
【问题描述】:

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

例如,我使用的沙发 3DModel 大致按比例(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 并让它重复并覆盖网格而没有它现在正在做的奇怪的方形图案?

【问题讨论】:

    标签: ios swift xcode scenekit arkit


    【解决方案1】:

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

    更改 wrapT 和 wrapS 属性应该可以解决此问题。

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

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

    【讨论】:

    猜你喜欢
    • 2023-03-27
    • 2020-08-01
    • 2021-06-10
    • 2019-02-13
    • 2012-08-31
    • 2019-12-24
    • 2019-09-19
    • 2018-07-31
    • 2018-01-31
    相关资源
    最近更新 更多