3个版本

0.1.2 2022年4月28日
0.1.1 2022年4月25日
0.1.0 2022年4月25日

#175模拟

MIT 许可证

27KB
563

Miniverse

Example

使用Rust编写,基于Bevy游戏引擎的n体引力相互作用模拟库。

该项目旨在提供易于使用的引力模拟。

入门指南

cargo new my_universe
cd my_universe

将 miniverse 添加到您的 cargo.toml 中的依赖项。

miniverse = "0.1.2"

在主文件中编写 银河 示例

extern crate miniverse;
use miniverse::{colors, Galaxy, Simulation, Vec3};

const TIME_STEP: f32 = 1.0 / 60.0;
const G: f32 = 10.0;
const PARTICLE_RADIUS: f32 = 0.05;

fn main() {
    let camera_pos: Vec3 = Vec3::new(0.0, 0.0, -75.0);

    let mut sim = Simulation::new(TIME_STEP, G, PARTICLE_RADIUS, camera_pos, colors::gray_dark);

    let systems = vec![Galaxy {
        amount: 5000,
        arms: 3,
        center_mass: 5.0,
        center_pos: Vec3::new(0.0, 0.0, 0.0),
        center_vel: Vec3::new(0.0, 0.0, 0.0),
        normal: Vec3::new(0.0, 0.0, 1.0),
        particle_color: colors::blue,
        center_color: colors::gray_light,
    }];
    sim.config(systems);
    sim.run();
}

构建和运行!最好以发布模式构建以获得更平滑的模拟。

cargo build --release
cargo run --release

相机

可以控制相机移动

  • w - 向内
  • a - 向左
  • s - 向右
  • d - 向外
  • space - 向上
  • shift - 向下

使用鼠标可以控制相机的旋转(俯仰和偏航)。

下一步

熟悉API :)

API

预定义的系统(称为预制件)只需插入到模拟中,然后一起运行。目前有4种系统类型

  • 粒子
  • 物体
  • 银河
  • 小行星带

如上例所示,在声明 systems 向量时,只需插入您的预制件

let systems = vec![
        Body {
            mass: 10.0,
            radius: 5.0,
            color: colors::yellow,
            initial_position: Vec3::new(0.0, 0.0, 0.0),
            initial_velocity: Vec3::new(0.0, 0.0, 0.0),
        },
        AsteroidBelt {
            amount: 700,
            radius: 85.0,
            center_mass: 10.0,
            center_pos: Vec3::new(0.0, 0.0, 0.0),
            center_vel: Vec3::new(0.0, 0.0, 0.0),
            normal: Vec3::new(0.0, 0.0, 1.0),
            particle_color: colors::gray_light,
        },
    ];

查看我们的 示例。也请查看文档。

关于代码的说明

粒子优化

由于粒子的值相对于较大的物体来说微不足道,因此将粒子视为无质量。这有助于使用Bevy的ECS进行引力相互作用计算来优化代码。

算法

将速度Verlet算法应用于引力微分方程。

最初使用的算法已经编码在Bevy的示例中。

银河生成

用于银河生成的代码(螺旋)是从 这个惊人的仓库 中使用的。

未来改进

  • 多线程计算
  • 积分方法
  • 更好的文档
  • 测试模块
  • 能量和动量分析
  • 特定粒子跟踪
  • 碰撞(非弹性碰撞和弹性碰撞)-->可能是一个弹性系数
  • 暂停

依赖关系

~28–43MB
~720K SLoC