arkit - 我试图给modelEntity一个physicsBodyComponet,它只是掉进了深处
问题描述
在现实工具包上,我尝试将物理体组件赋予模型实体。
但是当我把modelEntity放到现实世界中时,它就倒下了。
有没有什么办法解决这一问题?
解决方案
您需要使用以下内容创建地板网格PhysicsBodyComponent
:
let floor = ModelEntity(mesh: .generateBox(size: [1000, 0, 1000]), materials: [SimpleMaterial()])
floor.generateCollisionShapes(recursive: true)
if let collisionComponent = floor.components[CollisionComponent] as? CollisionComponent {
floor.components[PhysicsBodyComponent] = PhysicsBodyComponent(shapes: collisionComponent.shapes, mass: 0, material: nil, mode: .static)
floor.components[ModelComponent] = nil // make the floor invisible
}
scene?.addChild(floor)
然后,当你加载你的实体时,你也给他们一个PhysicsBodyComponent
(他们需要一个非零mass
,否则他们无论如何都会失败,这是我很长时间以来一直没有解决的问题):
var loadModelCancellable: AnyCancellable? = nil
loadModelCancellable = Entity.loadModelAsync(named: modelUri)
.sink(receiveCompletion: { _ in
loadModelCancellable?.cancel()
}, receiveValue: { entity in
entity.generateCollisionShapes(recursive: true)
if let collisionComponent = entity.components[CollisionComponent] as? CollisionComponent {
entity.components[PhysicsBodyComponent] = PhysicsBodyComponent(shapes: collisionComponent.shapes, mass: 1, material: nil, mode: .dynamic)
}
scene.addChild(entity)
loadModelCancellable?.cancel()
})
最后,在我的项目中添加物理对我试图做的事情产生了太多意想不到的后果(只是防止模型重叠),比如模型相互推动,以及需要完全重做动作,......所以我没有不会比这更进一步,但至少这应该可以让您在模型中添加物理特性,而不会无限期地从重力下落。
推荐阅读
- javascript - 如何从 C# 重写为 Javascript?this._ Stamp = System.DateTime.Now.Subtract(start);
- javascript - 从 HTML 画布导出图像数据会导致“污染的画布”错误或白色图像
- prolog - 查找给定的员工姓名是否属于两个不同的员工 ID?
- c++ - 如何在模板中使用结构作为参数 c++
- c# - 使用 SqlConnection 实例的“工作单元”和“存储库”设计模式的依赖注入管理
- asp.net-core - msal 在客户端拦截重定向
- pine-script - 请帮助:样式菜单中的非功能性颜色设置
- dataset - 在 Tableau 中显示每个位置最常见的值
- python-3.x - 如何让机器人响应正确的用户 ID?
- javascript - JS 为单例声明类和实例化