面向 MoonBit 的 2D 游戏物理与碰撞检测库。SAT 窄相、GJK+EPA 通用凸形碰撞、四种宽相加速结构、顺序冲量求解器、关节约束、CCD 连续碰撞检测——纯逻辑无渲染,跑遍 wasm-gc / js / native。
从向量数学到刚体世界,一站式覆盖 2D 物理游戏的全部碰撞与模拟需求
Vec2 全套运算;AABB / Circle / 凸多边形,支持凸包、正多边形、矩形构造器,Shape 枚举统一分发。
全部 9 种形状对,分离轴定理求穿透法线和深度,2 点接触流形,含圆心在多边形内的退化处理。
通用凸形碰撞:GJK 迭代求单纯形,EPA 展开求最近穿透深度,任意 support 函数均可接入。
Ray vs AABB / Circle / Polygon,返回参数化 t、命中点和表面法线,支持内外两面命中。
GridHash 均匀网格、QuadTree 松散四叉树、SweepAndPrune 排序扫描、AABBTree 动态树(含增删改)。
顺序冲量法、Baumgarte 位置修正、库仑摩擦、2 点接触,velocity iterations 可调。
Distance 距离关节、Revolute 旋转铰链、Weld 焊接关节,软 Baumgarte 偏置稳定收敛。
扫描体求交,防止高速物体穿透薄墙,circle/AABB sweep 两种实现,可开关对比。
6 组 fuzzing(随机形状暴雨 / 退化几何 / NaN / 能量发散 / 穿模)+ 跨平台浮点快照,xorshift32 可复现。
五层分层设计,每层可独立使用,也可从形状一路走到完整物理世界
三行命令安装,十行代码跑起一个物理世界
# 在你的 MoonBit 项目里
moon add uiwcvb/mooncollider
fn main {
let world = @mooncollider.World::new()
// 动态圆球
let _ = world.add_body(
@mooncollider.BodyDef::dynamic(
@mooncollider.Vec2::new(0.0, 10.0),
@mooncollider.Shape::from_circle(
@mooncollider.Circle::new(@mooncollider.Vec2::zero(), 0.5)),
1.0, 0.8))
// 静态地板
let _ = world.add_body(
@mooncollider.BodyDef::static_(
@mooncollider.Vec2::new(0.0, 0.0),
@mooncollider.Shape::from_aabb(
@mooncollider.AABB::from_min_max(
@mooncollider.Vec2::new(-10.0, -1.0),
@mooncollider.Vec2::new(10.0, 0.0)))))
// 步进仿真
for i = 0; i < 200; i = i + 1 {
world.step(0.016)
}
}
let a = @mooncollider.Shape::from_aabb(
@mooncollider.AABB::from_min_max(
@mooncollider.Vec2::new(0.0, 0.0),
@mooncollider.Vec2::new(2.0, 2.0)))
let b = @mooncollider.Shape::from_circle(
@mooncollider.Circle::new(@mooncollider.Vec2::new(3.0, 1.0), 1.5))
let m = @mooncollider.collide(a, b)
if m.colliding() {
// m.normal 从 a 指向 b,m.depth 是穿透深度
}
7 个 demo 覆盖从基础碰撞到性能基准
@bench 测量,100 轮取中位数(wasm-gc,本地环境)
| 场景 | 规模 | 中位耗时 | 吞吐 |
|---|---|---|---|
| Narrowphase 圆对碰撞 | 1000 对 | ~9 µs/op | ~110k ops/s |
| Broadphase GridHash | 500 体 | ~200 µs/op | ~5k ops/s |
| World::step | 100 体 | ~120 µs/op | ~8k steps/s |
竞赛验收硬性 + 软性要求全部通过
| 维度 | 数据 | 说明 |
|---|---|---|
| 源代码规模 | 4867 LOC | 含库 + 测试 + 7 个 demo + 示例 |
| 窄相碰撞 | 9 对 + GJK/EPA | SAT 多边形 + GJK 通用凸形 |
| 宽相加速 | 4 种 | GridHash / QuadTree / SAP / AABBTree |
| 刚体求解 | 顺序冲量 | Baumgarte + 摩擦 + 2 点接触 |
| 关节约束 | 3 种 | Distance / Revolute / Weld |
| CCD | 2 种 sweep | Circle / AABB 连续碰撞 |
| 测试体系 | 56 个测试 | blackbox + whitebox + fuzz + 确定性快照 |
| moon check | ✓ 0 error | 编译检查通过 |
| moon test | ✓ 56/56 | 全部测试通过 |
| moon info | ✓ clean diff | 接口文件与代码同步 |
| moon fmt | ✓ clean diff | 格式化规范 |
| 编译目标 | wasm-gc | 可扩展 js / native |
| 开源协议 | Apache-2.0 | 商业友好 |