无法使用 ARKit 和 SceneKit 更改 scn 文件 (materials / diffuse.contens) 的颜色

Can't change the color of scn file (materials / diffuse.contens) , using ARKit and SceneKit

我刚刚制作了项目:Xcode:文件 > 新建 > 项目 > 增强现实应用程序。

我想将 ship.scn 的颜色更改为黄色,但没有任何反应。如何更改 ship.scn 的颜色 ??

override func viewDidLoad() {
    super.viewDidLoad()
    sceneView.delegate = self
    sceneView.showsStatistics = true
    let scene = SCNScene(named: "art.scnassets/ship.scn")!

    // here, trying to change the color of the ship.scn
    scene.rootNode.geometry?.materials.first?.diffuse.contents = UIColor.yellow
    sceneView.scene = scene
}

我尝试了断点和 po 命令来查看 rootNode 包含的内容。

(lldb) po scene.rootNode.childNodes
▿ 1 element
  - 0 : <SCNNode: 0x1c01f8d00 'ship' | 1 child>

(lldb) po scene.rootNode.childNodes.first?.name
▿ Optional<String>
  - some : "ship"

(lldb) po scene.rootNode.childNodes.first?.geometry
nil

为什么几何是零??我能看到彩色船。

欢迎来到 Stack Overflow!时间 Swift 101... 这一行包含 optional chaining:

scene.rootNode.geometry?.materials.first?.diffuse.contents = UIColor.yellow

任何时候你看到一连串 属性 涉及 问号 的访问/方法调用,结果是...... 有问题。在这种情况下,如果 rootNode.geometry 为零,则在它发生后调用 none。

那么,如何解决这个问题?通常,在 运行 时间检查您的场景,以确保您认为拥有的节点层次结构是您实际得到的。使用调试器或一些打印语句找出 rootNode 实际包含什么,它的子节点是什么,这些节点包含什么等等。或者查看您在 Xcode 场景编辑器中拥有的资产,以及交叉引用以找出 search for by name.

的节点

在您使用的 Xcode 项目模板中,船舶几何图形不在场景的根节点上...在您到达它之前有几层节点层次结构。找到正确的节点后,在其第一个 material 上设置 diffuse.contents 将用您的颜色替换纹理贴图。