如何在场景中添加3D模型,以使它们具有某些XYZ位置



我曾经写过一个函数,其中我在场景中添加了几何锥。看起来像这样:

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。

最新更新