Как мне вращать и добавлять линейную силу к сущности, загруженной из реальности Composer? - PullRequest
0 голосов
/ 12 апреля 2020

Я построил сцену в реальности Composer, в которой есть шар, который начинает сцену, парящую в воздухе. Я пытаюсь программно бросить мяч, одновременно вращая его.

Я пытался сделать это с помощью поведения в Реальности Composer, но не могу заставить оба поведения работать одновременно, также шар сразу же падает на землю, как только я запускаю анимацию.

Моя вторая попытка была для go маршрута поведения, и я попытался сделать это программно, но я не могу добавить силу, потому что загруженный шар является Entity, а не ModelEntity. Что я делаю не так?

Я хочу раскрутить мяч, применить силу и одновременно включить гравитацию.

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Используйте следующий код для создания пользовательского класса Physics, который соответствует физическим протоколам RealityKit (для управления массой, скоростью и режимом кинематики / динамики).

Вот как выглядит соответствующая иерархия физических протоколов:

HasPhysics: HasPhysicsBody, HasPhysicsMotion
                   |
                   |- HasCollision: HasTransform

Вот код:

import ARKit
import RealityKit

class Physics: Entity, HasPhysicsBody, HasPhysicsMotion {

    required init() {
        super.init()

        self.physicsBody = PhysicsBodyComponent(massProperties: .default, 
                                                      material: nil, 
                                                          mode: .kinematic)

        self.physicsMotion = PhysicsMotionComponent(linearVelocity: [0.1, 0, 0], 
                                                   angularVelocity: [1, 3, 5])
    }
}

Затем создайте экземпляр этого класса в ViewController:

class ViewController: UIViewController {

    @IBOutlet var arView: ARView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let physics = Physics()
        arView.backgroundColor = .darkGray

        let boxAnchor = try! Experience.loadBox()
        boxAnchor.steelBox?.scale = [5, 5, 5]

        let boxEntity = boxAnchor.children[0].children[0].children[0]
        boxEntity.name = "CUBE"

        print(boxEntity)

        let kinematicComponent: PhysicsBodyComponent = physics.physicsBody!
        let motionComponent: PhysicsMotionComponent = physics.physicsMotion!

        boxEntity.components.set(kinematicComponent)
        boxEntity.components.set(motionComponent)

        arView.scene.anchors.append(boxAnchor)
    }
}

enter image description here


Кроме того, посмотрите ЭТО ПОЧТА , чтобы узнать, как реализовать физику без пользовательского Physics класса.


enter image description here

0 голосов
/ 12 апреля 2020

Чтобы добавить силу, вам нужно, чтобы сущность соответствовала HasPhysicsMotion. Чтобы проверить, могут ли к вашей сущности, импортированной из R C, быть применены силы, проверьте, возвращает ли (myEntity as? HasPhysics) ноль или значение.

Если это возвращает ноль, создайте свой собственный подкласс сущности, который имеет протокол HasPhysics, и установите вашу сущность как его потомок. Если вы хотите, чтобы он сталкивался с другими объектами вашей сцены, вам также понадобится протокол HasCollision.

Все, что вы упомянули, может быть достигнуто с этого момента!

...