1

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

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

其中nodes是一个存储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)
} 

不幸的是,即使它在特定位置创建僵尸,如果我移动,僵尸也会跟着我“移动”。它们与移动的相机相关,这对我来说是不受欢迎的。谁能帮我吗?我希望它们像锥体一样。提前谢谢

4

2 回答 2

0

只看到有限的代码片段......

我认为这可能与原始 DAE 文件近似的默认 physicShape 有关。形状有时可能过于复杂并导致跟踪问题。

尝试将zombieNode physicBody 设置为标准的盒子形状

let box = SCNBox(width:0.01, height: 0.01, length: 0.05, chamferRadius: 0.001)

zombieNode.physicsBody = SCNPhysicsBody(type: .dynamic, shape: SCNPhysicsShape(geometry:box))

如果您还没有这样做,还可以设置 debugOptions 以显示物理形状。这也将有助于调试发生碰撞的需要。

sceneView.debugOptions = .showPhysicsShapes
于 2017-12-22T05:10:13.313 回答
0

每次添加僵尸时,不要加载 dae 文件并循环遍历子节点,而是将僵尸节点存储在之前的属性/变量中,例如在 viewdidload 中。然后每次添加僵尸时,使用该僵尸节点的 .clone 属性并将其添加到 rootnode 子节点。

如果 dae 文件中只有一个对象,则不必遍历其子节点,只需使用 childnodes.firstObject。

于 2017-12-22T19:52:43.757 回答