SceneKit-将图像添加为法线贴图

时间:2018-10-10 10:39:37

标签: swift scenekit collada

到目前为止,我已经能够下载Collada文件(dae)并将其显示在屏幕上。 现在,我试图以编程方式将图像放置在Normal属性中,这样前部纹理将获得不同的效果。

根据文件检查器,“常规”选项位于 材料->正常。

Screenshow

我试图通过材料更改“法线贴图”的内容,但没有成功。 这是我的代码不起作用。

/// Creating the Node
    let node = SCNNode()
    /// The dae file
    let scene = SCNScene(named: "bluebag.dae")
    let arryNode = scene?.rootNode.childNodes
    /// Override the assets
    for childNode in arryNode! {
        if let geo = childNode.geometry {
            for geoItem in geo.materials {
                geoItem.normal.contents = UIImage(named:"fabric.jpg") /// This is not working
            }
        }
        node.addChildNode(childNode)
    }

我还尝试创建一个内部带有材质和法线贴图图像的新节点,并将其添加到前部纹理中,但是再次失败。 能否请任何人指出我如何向纹理添加法线贴图?我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

查看您的代码:

/// Creating the Node
let node = SCNNode()
/// The dae file
let scene = SCNScene(named: "bluebag.dae")
let arryNode = scene?.rootNode.childNodes                         // See Note 1
/// Override the assets
for childNode in arryNode! {
    if let geo = childNode.geometry {
        for geoItem in geo.materials {
            geoItem.normal.contents = UIImage(named:"fabric.jpg") // See Note 2
        }
    }
    node.addChildNode(childNode)
}

注释1 :您确定所有子节点都位于rootNode的第一级吗?

注意2::如果Assets.xcassets中包含fabric.jpg,则使用UIImage(named:"fabric")

尝试以下方法遍历节点层次结构:

scene.rootNode.enumerateChildNodes { (node, stop) in
    if let geo = node.geometry {
        for material in geo.materials {
            material.normal.contents = UIImage(named: "fabric")
        }
    }
    scnView.scene?.rootNode.addChildNode(node) // or something like this
}