如何将 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 位置?的主要内容,如果未能解决你的问题,请参考以下文章
unity 3d发布的exe程序可以从外部(比如同文件夹下的一个fbx文件)读取模型到场景中吗?
第一步是 THREE.js:尝试将搅拌机模型添加到场景中的问题