我曾经写过一个函数,其中我在场景中添加了几何锥。看起来像这样:
func addZombies(i:Int, x: Float, y: Float, z: Float)
{
let node = SCNNode()
node.geometry = SCNCone(topRadius: 0.0, bottomRadius: 1, height: 2)
node.position = SCNVector3(x, y, z)
sceneView.scene.rootNode.addChildNode(node)
nodes.append(node)
}
节点是存储scnnodes的数组。一切都很好。如果我搬家,圆锥体将具有确切的位置,即真实的"现实"。
但是,我购买了一个不错的僵尸3D型号,并试图将锥体更改为型号。我找到了某种解决方案,并试图自己实施。这就是我想到的:
func addZombies(i:Int, x: Float, y: Float, z: Float)
{
guard let zombieScene = SCNScene(named: "art.scnassets/StrongZombie.DAE") else { return }
let zombieNode = SCNNode()
let zombieSceneChildNodes = zombieScene.rootNode.childNodes
for childNode in zombieSceneChildNodes
{
zombieNode.addChildNode(childNode)
}
zombieNode.position = SCNVector3(x, y, z)
zombieNode.scale = SCNVector3(0.5, 0.5, 0.5)
//zombieNode.look(at: (sceneView.pointOfView?.position)!)
sceneView.scene.rootNode.addChildNode(zombieNode)
nodes.append(zombieNode)
}
不幸的是,即使它在特定位置创建僵尸,如果我移动,僵尸也会与我同在。它们与移动的相机有关,这对我来说是不可取的。谁能帮我吗?我希望他们像锥一样。提前THX
仅看到有限的代码片段....
我认为这可能与原始DAE文件近似的默认物理体有关系。形状有时可能过于复杂,并导致跟踪问题。
尝试将僵尸物理体设置为标准盒形状
let box = SCNBox(width:0.01, height: 0.01, length: 0.05, chamferRadius: 0.001)
zombieNode.physicsBody = SCNPhysicsBody(type: .dynamic, shape: SCNPhysicsShape(geometry:box))
如果您尚未做到这一点,还设置了调试以显示物理形状。这也将有助于调试也需要发生碰撞。
sceneView.debugOptions = .showPhysicsShapes
,而不是每次添加僵尸时加载dae文件并通过儿童节点循环循环,而是将僵尸节点存储在属性/变量较早的属性/变量中,例如在ViewDidload中。然后,每次添加僵尸时,使用该僵尸节点的.clone属性,然后将其添加到rootnode childnodes中。
如果DAE文件中只有一个对象,则您不必循环遍历其儿童词,只需使用childnodes.firstobject。