我无法理解如何将.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"。此方法不允许您加载root" SketchUp"。 (我收到运行时错误。)
答案 0 :(得分:11)
通常的模式是使用
加载场景并使用其名称检索您感兴趣的节点[scene.rootNode childNodeWithName:aName recursively:YES];
然后,您可以将此节点重新显示为主场景。
答案 1 :(得分:10)
我有一个类似的问题,我有一个.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文件并复制其中的所有节点。最后,对于阵列中的每个节点,我将其添加到节点。
答案 2 :(得分:7)
感谢您的帮助!
这是一个简单的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
}
答案 3 :(得分:3)
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()
}
}
答案 4 :(得分:3)
以下答案对我不起作用。
以下是我在Xcode 7.0 beta 5,iOS 9.0 beta / Swift 2.0中的作用:
3D模型类型:Collada 3D模型名称:" model.dae"
加载场景:
let lampScene = SCNScene(named: "art.scnassets/model.dae")
访问SCNScene中的子SCNode:
let lampRootNode = lampScene?.rootNode.childNodes[0]
将灯泡节点从加载的场景添加到当前加载和查看的场景中:
self.scene.rootNode.addChildNode(lampRootNode!)
注意: self.scene
由于以下原因而存在:
private var scene:SCNScene!
在将对象添加到场景之前,我根据场景工具包示例进行了一些场景设置。如果您需要代码,请在评论中提及。
希望它有所帮助。
答案 5 :(得分:1)
guard let shipScene = SCNScene(named: "ship.dae") else { return }
let shipNode = SCNNode()
let shipSceneChildNodes = shipScene.rootNode.childNodes
for childNode in shipSceneChildNodes {
shipNode.addChildNode(childNode)
}