Визуализация разборки 3D модели в SceneKit - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь создать иллюзию разборки 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
        }

У меня проблемы с выбором правильных значений силы, направления и массы.Пока что придание каждой части огромной массы (и одинаковой массы для всех) и применение очень маленькой силы, кажется, работает лучше, но я не уверен, что я на правильном пути.

Является ли использование жестко заданных предварительно определенных значений для каждой рассматриваемой модели правильным способом для этого?Любые советы будут с благодарностью!

1 Ответ

0 голосов
/ 04 февраля 2019

Вместо использования физического движка я бы сортировал и выравнивал узлы на основе их ограничивающих рамок и их начальных положений.Было бы легко поместить их все подряд в направлении x и установить расстояние между ними в соответствии с размером x ограничительной рамки.Если вы хотите анимировать, вы можете использовать действия перемещения.

...