到目前为止,我能够下载 Collada 文件 (dae) 并将其显示在屏幕上。 现在我尝试以编程方式将图像放置在 Normal 属性中,因此前面的纹理将获得不同的效果。
根据文件检查器,正常选项位于 Material -> 正常。
我尝试通过 Material 更改“法线贴图”内容,但没有成功。 这是我的代码,不起作用。
/// 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)
}
我还尝试创建一个新节点,其中包含 Material 和法线贴图图像,并将其添加到前面的纹理,但我再次没有成功。 有人可以告诉我如何将法线贴图添加到纹理吗?我错过了什么吗?
最佳答案
查看您的代码:
/// 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
}
关于swift - SceneKit - 添加图像作为法线贴图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52738340/