【问题标题】:Can't change the color of scn file (materials / diffuse.contens) , using ARKit and SceneKit使用 ARKit 和 SceneKit 无法更改 scn 文件 (materials/diffuse.contens) 的颜色
【发布时间】:2017-12-15 14:25:16
【问题描述】:

我刚刚创建了项目: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

为什么几何是零?我可以看到彩色的船。

【问题讨论】:

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

标签: ios swift arkit


【解决方案1】:

欢迎来到堆栈溢出! Swift 101 的时间到了……这一行包含 optional chaining:

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

每当您看到涉及问号的一系列属性访问/方法调用时,结果都是……有问题的。在这种情况下,如果rootNode.geometry 为 nil,则不会发生之后的调用。

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

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

【讨论】:

  • “有几层节点层次结构” - 非常感谢您的指导!
猜你喜欢
  • 2017-05-12
  • 2018-06-29
  • 1970-01-01
  • 2018-05-06
  • 2021-03-25
  • 2017-06-23
  • 2017-03-12
  • 2011-02-01
  • 2012-03-25
相关资源
最近更新 更多