4 个版本 (2 个重大变更)
0.2.0 | 2020 年 5 月 8 日 |
---|---|
0.1.1 | 2019 年 10 月 23 日 |
0.1.0 | 2019 年 10 月 5 日 |
0.0.1 | 2019 年 9 月 26 日 |
在 模拟 中排名 392
每月下载量 67
用于 amethyst_nphysics
99KB
1.5K SLoC
Amethyst Physics
amethyst_physics
软件包是 Amethyst 物理抽象层,是一个物理引擎的接口。
它的首要目标是简单性。API 设计和实现都注重提高开发者体验。例如,只需一行代码就可以初始化任何实现了 amethyst_physics
接口的物理引擎。
use amethyst_physics::PhysicsBundle;
use amethyst::amethyst_nphysics::NPhysicsBackend;
let game_data = GameDataBuilder::default()
.with_bundle(PhysicsBundle::<f32, NPhysicsBackend>::new()).unwrap()
ECS 架构和工具
API 遵循 Amethyst 所使用的 ECS 架构模式,并提供了许多工具来加速常见操作的开发。
例如,你可以这样创建一个 RigidBody
组件
let rigid_body_component = {
// Describe the Rigid Body characteristics.
let rb_desc = RigidBodyDesc {
mode: BodyMode::Dynamic,
mass: 1.0,
bounciness: 0.0,
friction: 0.05,
};
// Get the Physics World.
let physics_world = world.fetch::<PhysicsWorld<f32>>();
// Create the actual `RigidBody` component.
physics_world.rigid_body_server().create(&rb_desc)
};
此时,唯一需要做的就是将 rigid_body_component
添加到 Entity
中;当你想要删除它时,只需简单地移除组件即可。
正如你可能已经注意到的,这个 RigidBody
没有任何形状;让我们添加它
let shape_component = {
// Descibe the shape.
let s_desc = ShapeDesc::Cube {
half_extents: Vector3::new(1.0, 1.0, 1.0),
};
// Take the Physics World.
let physics_world = world.fetch::<PhysicsWorld<f32>>();
// Create the actual `Shape` component.
physics_world.shape_server().create(&s_desc)
};
现在,只需将这个 shape_component
添加到 Entity
中,形状就会自动分配给 RigidBody
。 请注意,形状可以被许多物体共享。
// Create `Entity` with a `RigidBody` and a `Shape`.
world
.create_entity()
.with(rigid_body_component)
.with(shape_component)
.with(Transform::default())
.build();
我添加了 Transform
组件,正如你可能预期的,可以通过修改它来定位 RigidBody
。
所有操作都完全符合 ECS 风格,并且由于 amethyst_physics
的同步机制,删除 RigidBody
或 Shape
也只是移除组件的问题。
抽象层优势
将游戏引擎限制在特定的物理引擎上从来不是一个好主意,因为你所工作的项目可能需要特定的物理引擎。为了能够使用所有Amethyst功能(如3D音频空间化、相机弹簧、物理粒子效果等),以及拥有任何你需要的物理引擎的资产管道,都是一个巨大的加分项!
此外,社区成员可以开发一个模块(例如,能够爬楼梯、墙壁、栅栏等运动的运动控制器)。如果引擎允许使用此模块与多个物理引擎一起工作,市场将更广阔,对开发者来说也将更加方便。
可能的情况是,你需要使用的物理引擎已经集成;如果没有,那么实现上述接口并保留所有Amethyst功能将更加方便,并且需要的努力更少。
在开发过程中,可能会发现所使用的物理引擎在某种特定方面受到限制,这种限制是不明显的(在达到那个开发点之前无法得知)、不常见的(其他人不感兴趣修复它,或者不理解问题),以及非常复杂,甚至对于当前使用的后端来说是不可能修复的。
如果你有一个抽象层,你有以下选择:
- 更改后端
- 添加不同的物理引擎以满足特定的交互需求,并在需要时并行运行。这个额外的物理引擎可能是你自己为这种交互开发的,也可能是第三方物理引擎。
如果你没有抽象层,你有以下选择:
- 更改游戏的整体架构,或者至少重写游戏的一部分。有一点运气的话,一部分可以自动重构,但可能不会超过50%。
如果你要做一些高级的事情,这在很大程度上很常见,你可以跨多个物理后端来完成。
接口
接口分为服务器(可用服务器),每个服务器都提供对引擎特定部分的访问。
每个物理引擎都提供其特定的功能,而amethyst_physics
允许在(显然的原因)它们不适用于提供的API时使用它们。实际上,可以将amethyst_physics
服务器指针向下转换为暴露某些特定功能的特定后端服务器。
后端
- NPhysics
- 打开一个问题来通知后端。
享受!进行物理运算
依赖项
~13MB
~263K SLoC