M-V*_*M-V 20 collada ios scenekit swift
我无法理解.dae
文件中的几何应该如何加载到iOS SceneKit场景图中.
我知道你可以.dae
直接将文件加载到SCNScene中:
// create a new scene
let scene = SCNScene("test.scnassets/test.dae")
Run Code Online (Sandbox Code Playgroud)
我也知道你可以创建一个空的SCNScene并将内置的3D对象作为子节点添加到其中:
let scene = SCNScene()
var sphereNode = SCNNode()
sphereNode.geometry = SCNSphere(radius: 1.0)
scene.rootNode.addChildNode(sphereNode)
Run Code Online (Sandbox Code Playgroud)
在第二种情况下,您可以将.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))
Run Code Online (Sandbox Code Playgroud)
但也许有更好的方法?以上涉及从.dae树手动加载每个标识符.在我的文件中,有一个节点"SketchUp",子标识符为"ID2"和"ID10".此方法不允许您加载根"SketchUp".(我收到运行时错误.)
Toy*_*yos 11
通常的模式是加载场景并使用其名称检索您感兴趣的节点
[scene.rootNode childNodeWithName:aName recursively:YES];
Run Code Online (Sandbox Code Playgroud)
然后,您可以将此节点重新显示到主场景.
小智 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)
}
Run Code Online (Sandbox Code Playgroud)
首先,我设置了一个节点,它将所有节点保持在一起,因此它看起来像在原始文件中.接下来,我们导入我们想要的.dae文件并复制其中的所有节点.最后,对于阵列中的每个节点,我将其添加到节点.
小智 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
}
Run Code Online (Sandbox Code Playgroud)