3

我在 Reality Composer 中构建了一个场景,其中有一个球,该球开始漂浮在空中的场景。我试图在旋转的同时以编程方式扔球。

我试图通过 Reality Composer 中的行为来做到这一点,但不能让这两种行为同时工作,而且,一旦我开始动画,球就会立即落到地上。

我的第二次尝试是放弃行为路线,我尝试以编程方式执行此操作,但我无法添加力,因为加载的球是实体而不是 ModelEntity。我究竟做错了什么?

我想同时旋转球,施加力并启用重力。

4

2 回答 2

3

使用以下代码创建一个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)
    }
}

在此处输入图像描述


另外,查看这篇文章以了解如何在没有自定义Physics类的情况下实现物理。


在此处输入图像描述

于 2020-04-17T16:44:24.087 回答
2

要添加力,您需要实体符合 HasPhysicsMotion。要查看从 RC 导入的实体是否可以对其施加力,请检查 (myEntity as?HasPhysics) 是否返回 nil 或值。

如果返回 nil,则创建您自己的具有 HasPhysics 协议的实体子类,并将您的实体设置为它的子实体。如果您希望它与场景中的其他事物发生碰撞,那么您还需要 HasCollision 协议。

您提到的所有事情都可以从这一点实现!

于 2020-04-12T19:58:38.510 回答