【问题标题】:SceneKit - Loading a DAE into a SCNNode (unwrap error)SceneKit - 将 DAE 加载到 SCNNode(展开错误)
【发布时间】:2015-06-10 03:41:09
【问题描述】:

我目前正在尝试将 dae 文件导入 SCNNode,然后将其添加到场景中。我在这里找到了一些很棒的东西,但我碰壁了。

在这里找到了我一直在尝试实施的答案 - Stackoverflow: load a collada (dae) file into SCNNode (Swift - SceneKit)

我已尝试实施最佳解决方案,但我收到一条错误消息:

"可选类型 'SCNNode?' 的值没有打开;你是不是要使用“!”或“?”

可能是我忽略了一些非常基本的东西,我是个新手。

我将在下面包含我的 ViewController viewDidload 代码,如果有人能对此有所了解,我将不胜感激!

let scnView = self.view as SCNView
let scene = MasterScene()
scnView.scene = scene
scnView.backgroundColor = UIColor.grayColor()

// enable default lighting
scnView.autoenablesDefaultLighting = true
// enable default camera
scnView.allowsCameraControl = true

var node = SCNNode()
let assetScene = SCNScene(named: "s185.dae")
scene.rootNode.addChildNode(assetScene?.rootNode.childNodeWithName("s185", recursively: true))
// Last line produces error

【问题讨论】:

  • 哪一行产生错误?
  • 抱歉,最后一行代码,scene.rootNode...等

标签: ios swift scenekit


【解决方案1】:

您的assetScene 是可选的。您似乎已经掌握了那部分,因为您使用可选链接来访问其rootNode

但是,使用可选链接的表达式产生的任何结果本身都是可选的——你不知道assetScene 存在,所以你也不知道你试图从中得到的任何东西是否存在。

但是addChildNode 接受一个非可选的SCNNode——你不能传递一个可选的给它。您需要先打开该选项。即使你用if let 解开assetScene,你仍然会得到一个可选的,因为你不知道childNodeWithName 是否找到了一个节点。

试试这样的:

 if let assetScene = SCNScene(named: "s185.dae") {
      if let node = assetScene.rootNode.childNodeWithName("s185", recursively: true) {
           scene.rootNode.addChildNode(node)
      }
 }

【讨论】:

  • 我明白了,谢谢你的解释,加深了我的理解。我不再收到错误消息。出于某种原因,虽然我的资产没有加载,但我看到的只是我的灰色背景。令人费解的是,当我将它作为一个场景运行时,我设法让它显示出来。感谢您到目前为止的帮助!绝对解决了我当时遇到的问题。
  • 刚刚想通了,我的问题是我用来搜索的节点名称。我最终使用 println 获取了子节点名称。
猜你喜欢
  • 2014-10-12
  • 2017-05-16
  • 2014-10-10
  • 2017-12-17
  • 2018-03-12
  • 2015-01-12
  • 2018-03-28
  • 2014-12-05
  • 2015-10-20
相关资源
最近更新 更多