我试图创建一个使用SceneKit拆解3D模型的错觉。它应该看上去像像这样
假设模型是由许多小部件组成的机械部件,我想将模型的部件“拆开”动画化,类似于下面演示中的“反汇编”按钮:
https://camentos.github.io/dtool
在我看来,我需要从物体的中心以某种方式制造一个“爆炸”,这样这些部分就会远离中心,但是我不知道在哪个方向上应该施加力。模型各部分的力值、方向值和质量值是否不同?
到目前为止,我所做的是遍历模型中的所有孩子,给他们附加一个.dynamic型的物理体,给他们一个质量,然后一个一个地给所有的孩子施加力量。为了制造零件在拆卸后冻结在空气中的错觉,我用计时器在几毫秒后清除部件上的所有力,以阻止它们完全飞走。
在此提出了一个类似的解决办法,作为一种回答:
我试着用重力将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
}我很难想出力、方向和质量的正确值。到目前为止,给每个部分一个巨大的质量(对所有人来说都是相同的质量)和施加一个非常小的力似乎更好,但我不确定我是否走上了正确的道路。
根据每个模型使用硬编码的预先确定的值是否是正确的处理方法?任何提示都将不胜感激!
发布于 2019-02-04 17:07:05
我不使用物理引擎,而是根据节点的边界框和初始位置对齐节点。很容易将它们都放在x方向上,并根据包围框的x大小来设置它们之间的距离。如果你想要动画,你可以使用移动动作。
https://stackoverflow.com/questions/54437899
复制相似问题