3个版本
0.1.2 | 2022年4月28日 |
---|---|
0.1.1 | 2022年4月25日 |
0.1.0 | 2022年4月25日 |
#175 在 模拟
27KB
563 行
Miniverse
使用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