繁体   English   中英

在 iOS SceneKit 中如何将 a.dae 文件加载到 SCNNode 中?

[英]How do you load a .dae file into an SCNNode in iOS SceneKit?

我无法理解如何将.dae文件中的几何图形加载到 iOS SceneKit 场景图中。

我知道您可以将.dae文件直接加载到 SCNScene 中:

// create a new scene
let scene = SCNScene("test.scnassets/test.dae")

我还知道您可以创建一个空的 SCNScene 并将内置的 3D 对象作为子节点添加到其中:

let scene = SCNScene()
var sphereNode = SCNNode()
sphereNode.geometry = SCNSphere(radius: 1.0)
scene.rootNode.addChildNode(sphereNode)

在第二种情况下,您可以将.dae文件加载到 SCNNode 而不是使用内置对象吗? 或者是否需要先将所有.dae文件加载到 SCNScene 中?

如果是后者,那么如何将 SCNNode 对象放置到 SCNScene 下场景图层次结构中的正确位置?

编辑#1:

这现在对我有用,它是@FlippinFun 建议的修改版本。

let url = NSBundle.mainBundle().URLForResource("test.scnassets/test", withExtension: "dae")
let source = SCNSceneSource(URL: url, options: nil)
let block = source.entryWithIdentifier("ID10", withClass: SCNGeometry.self) as SCNGeometry
scene.rootNode.addChildNode(SCNNode(geometry: block))

但也许有更好的方法? 上面涉及从 .dae 树手动加载每个标识符。 在我的文件中,有一个节点“SketchUp”,其子标识符为“ID2”和“ID10”。 此方法不会让您加载根“SketchUp”。 (我收到运行时错误。)

通常的模式是加载您的场景并使用名称检索您感兴趣的节点

[scene.rootNode childNodeWithName:aName recursively:YES];

然后您可以将此节点重新设置为您的主场景。

我有一个类似的问题,我有一个 .dae 文件,我想将多个节点从该文件加载到一个节点中。 这对我有用:

var node = SCNNode()
let scene = SCNScene(named: "helloScene.dae")
var nodeArray = scene.rootNode.childNodes

for childNode in nodeArray {
  node.addChildNode(childNode as SCNNode)
}

首先,我设置了一个节点,将所有内容放在一起,使其看起来就像在原始文件中一样。 接下来我们导入我们想要的 .dae 文件并复制其中的所有节点。 最后,对于数组中的每个节点,我将其添加到节点中。

谢谢你的帮助!

这是一个简单的 collada2Node 类。

//collada2SCNNode
class func collada2SCNNode(filepath:String) -> SCNNode {
    var node = SCNNode()
    let scene = SCNScene(named: filepath)
    var nodeArray = scene!.rootNode.childNodes

    for childNode in nodeArray {
        node.addChildNode(childNode as SCNNode)
    }
    return node
}
func nodeWithFile(path: String) -> SCNNode {

    if let scene = SCNScene(named: path) {

        let node = scene.rootNode.childNodes[0] as SCNNode
        return node

    } else {
        println("Invalid path supplied")
        return SCNNode()
    }

}

以下答案对我不起作用。

以下是在 Xcode 7.0 beta 5 、iOS 9.0 beta / Swift 2.0 中对我有用的内容:

3D 模型类型:Collada 3D 模型名称:“model.dae”

  1. 加载场景:

     let lampScene = SCNScene(named: "art.scnassets/model.dae")
  2. 访问 SCNScene 中的子 SCNode:

     let lampRootNode = lampScene?.rootNode.childNodes[0]
  3. 将加载场景中的灯节点添加到当前加载和查看的场景中:

     self.scene.rootNode.addChildNode(lampRootNode!)

注意: self.scene存在的原因是:

private var scene:SCNScene!

在将对象添加到场景之前,我根据场景套件示例进行了一些场景设置。 如果您需要代码,请在评论中提及。

希望能帮助到你。

guard let shipScene = SCNScene(named: "ship.dae") else { return }
let shipNode = SCNNode()
let shipSceneChildNodes = shipScene.rootNode.childNodes
for childNode in shipSceneChildNodes {
    shipNode.addChildNode(childNode)
}

我们找到的唯一可行的方法是:2023 年。

(1) 使用普通的真实文本编辑器(例如 VSCode)非常简单地打开 YourFileName.dae 文件。

在此处输入图像描述

请注意,该文件包含材质、效果等内容。

只需滚动到library_geometries ,您就会立即看到 id,

在本例中为“geometry316”。

(请注意, library_geometries几乎总是文件的最后一行,很容易找到。)

非常简单,id(例如,“geometry316”)未显示在 XCODE 中,这只是一个 Xcode 错误,他们可能很快就会修复。

(2) 然后获取并显示节点:

var kingDragon: SCNNode!
...


let p = Bundle.main.url(forResource: "Badass Dragon", withExtension: "dae")!
let source = SCNSceneSource(url: p, options: nil)!
let g = source.entryWithIdentifier("geometry316",
              withClass: SCNGeometry.self)! as SCNGeometry
kingDragon = SCNNode(geometry: g)
castleWall.addChildNode(kingDragon)

就是这样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM