Я пытаюсь создать иллюзию разборки 3D-модели с помощью SceneKit.Это должно выглядеть примерно так: * :
Предполагая, что модель представляет собой часть оборудования, состоящую из множества мелких деталей, я хотел бы анимировать части модели, которые "раздвигаются", каккнопка Disassemble All в демоверсии ниже:
https://camentos.github.io/dtool
Мне кажется, мне нужно как-то создать «взрыв» из центра объекта так,детали отойдут от центра, но я не знаю, в каком направлении следует применять силу для этого. Должны ли значения силы, направления и массы быть разными для всех частей модели?
До сих пор я пересекаю всех детей модели, прикрепляю к ним физическое тело типа .dynamic , даю им массу и применяю силу ко всем детям по одному. Чтобы создать иллюзиюдеталей, застывших в воздухе после разборки, я использую таймер, чтобы через несколько миллисекунд сбросить все силы на детали, чтобы не дать им полностью улететь.
Aподобное решение было предложено в качестве ответа здесь:
Анимированная разборка 3D-объектов в 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
}
У меня проблемы с выбором правильных значений силы, направления и массы.Пока что придание каждой части огромной массы (и одинаковой массы для всех) и применение очень маленькой силы, кажется, работает лучше, но я не уверен, что я на правильном пути.
Является ли использование жестко заданных предварительно определенных значений для каждой рассматриваемой модели правильным способом для этого?Любые советы будут с благодарностью!