【问题标题】:How to improve RealityKit physics simulation accuracy?如何提高 RealityKit 物理模拟精度?
【发布时间】:2022-01-25 23:01:03
【问题描述】:

我一直在尝试基于 RealityKit 构建台球游戏,但是物理模拟不够准确。当参数太小时,RealityKit 似乎会产生粗略的计算。

下面的代码展示了我到目前为止所做的事情。有没有办法配置 RealityKit 并提高物理精度?

import RealityKit
import ARKit

let ballMaterial = PhysicsMaterialResource.generate(friction: 0.055, restitution: 0.95)

game.allBalls.forEach { entity in
    guard let physicsEntity = entity as? HasPhysics else { return }
    
    physicsEntity.physicsBody?.massProperties.mass = 0.17
    physicsEntity.physicsBody?.material = ballMaterial
}

let wallMaterial = PhysicsMaterialResource.generate(friction: 0.005, restitution: 0.5)

game.wallEntities.forEach { entity in
    guard let physicsEntity = entity as? HasPhysics else { return }
    
    physicsEntity.physicsBody?.material = wallMaterial
}

let tableSurfaceMatrial = PhysicsMaterialResource.generate(staticFriction: 0.001, dynamicFriction: 0.2, restitution: 0.25)

game.tableSurfaceEntities.forEach { entity in
    guard let physicsEntity = entity as? HasPhysics else { return }
    
    physicsEntity.physicsBody?.material = tableSurfaceMatrial
}

添加一个力来移动白球:

// ballWhite as? Entity & HasPhysics
game.ballWhite.physicsBody?.mode = .dynamic
game.ballWhite.addForce(rayForce, relativeTo: nil)

ModelEntity: render physics entity

HasPhysics: physics protocol

Falling ball

【问题讨论】:

    标签: swift augmented-reality arkit realitykit physics-engine


    【解决方案1】:

    如果您将restitution 参数设置为大于1 的值,RealityKit 物理引擎会开始生成更逼真的弹跳模拟,但在动态效果衰减时仍然不够逼真——Apple 工程师必须更加努力地实现鲁棒性RealityKit 3.0 中的物理模拟。

    我使用了一个简单的 Reality Composer 场景,其中包含一个半径为 0.1 m 的球。

    import AppKit
    import RealityKit
    
    class GameViewController: NSViewController {
        
        @IBOutlet var arView: ARView!
        
        override func awakeFromNib() {
    
            arView.environment.background = .color(.black)
            
            let ballScene = try! Experience.loadBall()
    
            let ball = ballScene.sphere!.children[0] as! ModelEntity
            
            ball.components[CollisionComponent.self] = 
                            CollisionComponent(shapes: [.generateSphere(radius: 0.1)], 
                                                 mode: .default, 
                                               filter: .sensor)
    
            ball.components[PhysicsBodyComponent.self] = 
                            PhysicsBodyComponent(shapes: [.generateSphere(radius: 0.1)], 
                                                   mass: 0.05, 
                                               material: .generate(friction: 0.9, 
                                                                restitution: 1.35))
            
            arView.scene.anchors.append(ballScene)
        }
    }
    

    【讨论】:

    • Apple 文档很棒,但有时它也为您提供了一些“空间”进行实验......
    • 模拟一个落球是一回事,也许我们可以只为球设置特殊参数。但是这样,我觉得模拟整个台球比赛太难了。有没有第三方物理引擎我们可以使用 ARKit。
    • 我喜欢Newton Game Dynamics第三方引擎。它是用 C++ 编写的,并且支持 iOS。您可以在 10 Pin Shuffle Bowlingapps.apple.com/app/10-pin-shuffle-bowling/id341894188 中查看它是如何工作的。该引擎具有出色的模拟精度。
    • 你也应该看看我最喜欢的 iOS 3D-Pool-Gameapps.apple.com/app/3d-pool-game/id1175740795。物理引擎在这里很精确。可能,它基于 Unity 引擎...
    • 我找到了github.com/AdamEisfeld/PhyKit,也许它对我来说已经足够简单了
    猜你喜欢
    • 2023-03-11
    • 2012-10-20
    • 1970-01-01
    • 2014-03-21
    • 2020-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    相关资源
    最近更新 更多