swift 如何将.dae文件加载到iOS SceneKit中的SCNNode?

9ceoxa92  于 2023-01-12  发布在  Swift
关注(0)|答案(7)|浏览(153)

我很难理解如何将.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”,子标识符为“ID 2”和“ID 10”。这个方法不允许加载根“SketchUp”。(我得到一个运行时错误。)

qnakjoqk

qnakjoqk1#

通常的模式是加载场景,然后使用以下命令检索您感兴趣的节点及其名称

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

然后,可以将此节点重新设置为主场景的父对象。

wrrgggsh

wrrgggsh2#

我有一个类似的问题,我有一个.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文件,并复制其中的所有节点;最后,对于数组中的每个节点,我将其添加到该节点中。

gdrx4gfi

gdrx4gfi3#

谢谢你的帮忙!
下面是一个简单的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
}
drkbr07n

drkbr07n4#

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()
    }

}
ee7vknir

ee7vknir5#

下面的答案对我不起作用。
以下是我在Xcode 7.0 beta 5、iOS 9.0 beta/Swift 2.0中的工作原理:
3D模型类型:Collada 3D模型名称:"型号. dae"
1.加载场景:

let lampScene = SCNScene(named: "art.scnassets/model.dae")

1.访问SCNScene中的子SCNode:

let lampRootNode = lampScene?.rootNode.childNodes[0]

1.将灯节点从加载的场景添加到当前加载和查看的场景中:

self.scene.rootNode.addChildNode(lampRootNode!)
    • 注意:**self.scene存在的原因是:
private var scene:SCNScene!

在添加对象到场景之前,我已经根据场景工具包的例子做了一些场景设置。如果你需要代码,请在注解中提到它。
希望有帮助。

vuktfyat

vuktfyat6#

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

8xiog9wr7#

我们发现的唯一可行的方法是:2023.

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

请注意,该文件包含材质、效果等内容。
只需滚动到library_geometries,您将立即看到ID,
在本例中为“geometry316”。
(Note 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)

就是这样。

相关问题