如何将 3D 模型添加到场景中以使它们具有特定的 XYZ 位置?

Posted

技术标签:

【中文标题】如何将 3D 模型添加到场景中以使它们具有特定的 XYZ 位置?【英文标题】:How to add 3D models to a scene so that they have certain XYZ position? 【发布时间】:2018-06-03 14:17:12 【问题描述】:

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

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)
 

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

【问题讨论】:

【参考方案1】:

只看到有限的代码sn-p....

我认为这可能与原始 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

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于如何将 3D 模型添加到场景中以使它们具有特定的 XYZ 位置?的主要内容,如果未能解决你的问题,请参考以下文章

在 Unity3d 中将游戏对象动态添加到场景中

unity 3d发布的exe程序可以从外部(比如同文件夹下的一个fbx文件)读取模型到场景中吗?

第一步是 THREE.js:尝试将搅拌机模型添加到场景中的问题

Sprite Kit - 使用 Switch Case 将随机 Sprite 节点添加到场景中

如何将图像后处理着色器的结果添加到场景中

三个JS:如何使用PNG纹理将Point Light添加到场景中?