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

Download history 20/week @ 2024-03-11 18/week @ 2024-03-18 26/week @ 2024-03-25 31/week @ 2024-04-01 13/week @ 2024-04-08 16/week @ 2024-04-15 22/week @ 2024-04-22 13/week @ 2024-04-29 14/week @ 2024-05-06 19/week @ 2024-05-13 21/week @ 2024-05-20 16/week @ 2024-05-27 19/week @ 2024-06-03 16/week @ 2024-06-10 13/week @ 2024-06-17 17/week @ 2024-06-24

每月下载量 67
用于 amethyst_nphysics

MIT 许可证

99KB
1.5K SLoC

Amethyst Physics

Build Status License Line of code

变更日志

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 的同步机制,删除 RigidBodyShape 也只是移除组件的问题。


抽象层优势

将游戏引擎限制在特定的物理引擎上从来不是一个好主意,因为你所工作的项目可能需要特定的物理引擎。为了能够使用所有Amethyst功能(如3D音频空间化、相机弹簧、物理粒子效果等),以及拥有任何你需要的物理引擎的资产管道,都是一个巨大的加分项!

此外,社区成员可以开发一个模块(例如,能够爬楼梯、墙壁、栅栏等运动的运动控制器)。如果引擎允许使用此模块与多个物理引擎一起工作,市场将更广阔,对开发者来说也将更加方便。

可能的情况是,你需要使用的物理引擎已经集成;如果没有,那么实现上述接口并保留所有Amethyst功能将更加方便,并且需要的努力更少。

在开发过程中,可能会发现所使用的物理引擎在某种特定方面受到限制,这种限制是不明显的(在达到那个开发点之前无法得知)、不常见的(其他人不感兴趣修复它,或者不理解问题),以及非常复杂,甚至对于当前使用的后端来说是不可能修复的。

如果你有一个抽象层,你有以下选择:

  • 更改后端
  • 添加不同的物理引擎以满足特定的交互需求,并在需要时并行运行。这个额外的物理引擎可能是你自己为这种交互开发的,也可能是第三方物理引擎。

如果你没有抽象层,你有以下选择:

  • 更改游戏的整体架构,或者至少重写游戏的一部分。有一点运气的话,一部分可以自动重构,但可能不会超过50%。

如果你要做一些高级的事情,这在很大程度上很常见,你可以跨多个物理后端来完成。


接口

接口分为服务器(可用服务器),每个服务器都提供对引擎特定部分的访问。

每个物理引擎都提供其特定的功能,而amethyst_physics允许在(显然的原因)它们不适用于提供的API时使用它们。实际上,可以将amethyst_physics服务器指针向下转换为暴露某些特定功能的特定后端服务器。

后端

  • NPhysics
  • 打开一个问题来通知后端。

享受!进行物理运算

依赖项

~13MB
~263K SLoC