在SceneKit中可视化3D模型拆卸

时间:2019-01-30 10:04:22

标签: ios swift scenekit arkit

我正在尝试创建一种使用SceneKit拆卸3D模型的幻觉。它应该看起来像like this

假设模型是由许多小零件组成的机器,我想对模型的零件进行“拉开”动画,类似于下面演示中的 Disassemble All 按钮:

https://camentos.github.io/dtool

在我看来,我似乎需要以某种方式从物体的中心创建“爆炸”,以便零件从中心移开,但是我不知道应朝哪个方向施加力。模型的所有部分的力值,方向和质量值是否应该不同?

到目前为止,我要做的是遍历模型的所有子级,将类型为 .dynamic 的物理物体附加到它们上,为其赋予质量,并对所有子级逐一施加力。为了使零件在拆解后冻结在空气中,使人产生错觉,我使用计时器在几毫秒后清除作用在零件上的所有力,以阻止它们完全飞走。

有人提出了类似的解决方案作为答案:

Animate 3D object disassembly in Unity3D

我尝试使用重力将 F = ma 用作所有零件的力,并为每个零件分配随机质量,但是当模型很大时,零件的运动会非常抖动/缓慢方式,如果模型较小,它们就会完全飞走。

        let physicsBody = SCNPhysicsBody(type: .dynamic, shape: nil)
        node.physicsBody = physicsBody
        let randomMass = Float.random(in: 1..<10)
        node.physicsBody?.mass = CGFloat(randomMass)
        let force = Double(randomMass)*(9.8)
        let direction = SCNVector3(0, force, 0)
        node.physicsBody?.applyForce(direction, asImpulse: true)
        node.physicsBody?.isAffectedByGravity = false



        DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(500)) {
            node.physicsBody?.clearAllForces()
            node.physicsBody?.isAffectedByGravity = false
        }

我在提出正确的力,方向和质量值方面遇到麻烦。到目前为止,给每个零件一个巨大的质量(对于所有零件都是相同的质量)并施加很小的力似乎效果更好,但是我不确定我走的路是否正确。

是否根据每个模型使用硬编码的预定值来处理此问题?任何提示将不胜感激!

1 个答案:

答案 0 :(得分:0)

我将不使用物理引擎,而是根据其边界框和其初始位置对节点进行排序和对齐。将它们全部沿x方向排成一行并根据边界框的x大小设置它们之间的距离将很容易。如果希望将其设置为动画,则可以使用移动动作。