moonim

    A mathematical animation engine kernel: bezier geometry, mobject scene graph, typed animation combinators and an SVG backend.

    animation
    geometry
    bezier
    math
    svg
    Download zip
    Author
    Version
    0.2.1
    License
    Apache-2.0
    Last updated
    2 months ago
    Downloads
    36

    No dependencies

    #moonim

    mooncakes CI License

    A mathematical animation engine kernel in pure MoonBit: cubic bezier geometry, a mobject scene graph, typed animation combinators, a MiniTex formula typesetting subset, and an SVG backend. Inspired by Manim, rewritten from scratch with a pure, seekable functional timeline (Scene::render_at(t)) and an in-browser playground that renders frames live via the JS backend.

    一个纯 MoonBit 实现的数学动画引擎内核(mathematical animation engine kernel): 贝塞尔几何、Mobject 场景图、类型化动画组合子与公式子集排版,输出 SVG 帧序列。 灵感来自 Manim,但架构上是独立重写(详见 docs/design.md)。

    当前版本 v0.2.1:69 个测试全过、全目标 check 零警告,示例与浏览器 playground 可运行。目标规模与边界见下文「功能边界」一节。

    #快速开始

    # 安装 MoonBit 工具链(https://www.moonbitlang.com/download) curl -fsSL https://cli.moonbitlang.com/install/unix.sh | bash moon check --target all # 检查(全目标) moon test # 运行测试(69 个用例) moon run examples/morph # 示例一:圆变方动画,输出 SVG 帧序列 moon run examples/formula # 示例二:排版 \frac{x^2}{2} 并输出 SVG moon run examples/texmorph # 示例三:公式 x^2 ↔ \frac{x^2}{2} 部件匹配变形

    示例将 SVG 文档打印到 stdout,重定向即可查看:

    moon run examples/morph > frames.txt

    #模块结构

    发布单位为整个 module(moon add Lmy271828/moonim),每个顶层目录是一个 独立的 mooncakes 包,消费者按包子路径单独导入、只取所需:

    包导入路径职责
    math/Lmy271828/moonim/mathVec2 / Mat3 仿射变换 / Color / BBox
    geom/Lmy271828/moonim/geom三次贝塞尔、路径、子路径拆分与点数对齐(Path::align)、弧长裁剪(Path::trim / point_at_proportion / to_dashed)、三角化(earcut 移植)、描边展开
    mobject/Lmy271828/moonim/mobject场景图 ADT:VMobject / Group / Tex(带符号标签),部件枚举与 same_shape,line / arrow 构造器
    anim/Lmy271828/moonim/animInterpolable trait、速率函数族(smooth/rush/wiggle/…)、Animation(transform_to / transform_matching / fade / grow / rotate / show_creation / unwrite / move_along_path / indicate 族 / add_lagged)、交互 Env、Scene 时间轴
    graph/Lmy271828/moonim/graph坐标系与函数图像:axes / number_line(刻度 + MiniTex 数字标签)、plot(函数采样成路径)、count(数字滚动)、map_point 数据→场景映射
    tex/Lmy271828/moonim/texFormulaRenderer trait(扩展点)+ MiniTex 子集排版器 + CachedRenderer 记忆化包装
    cache/Lmy271828/moonim/cache显式键控 LRU 记忆化(见 design.md「缓存层」)
    backend/svg/Lmy271828/moonim/backend/svgMobject 树 → SVG 文档序列化
    playground/—浏览器 playground(js 目标构建 + 静态页面,见下节)
    examples/—可执行示例(CI 中实际运行并校验输出)

    #浏览器 playground

    playground/ 是一个纯静态、无服务端的在线演示:MoonBit 编译到 js 目标, 浏览器直接调用渲染 API 逐帧生成 SVG 并播放,支持公式输入、seek、相机 pan/zoom(拖拽/滚轮/双击复位,纯 viewBox 变换)与 webm 录制 (MediaRecorder)。

    moon build --target js playground # 产出 _build/js/debug/build/playground/playground.js python3 -m http.server # 在仓库根目录启动静态服务 # 打开 http://localhost:8000/playground/

    页面通过 globalThis.moonim 与引擎交互:prepare(scene, a, b) 构建并 缓存场景(返回构建耗时 ms),frame(t) 渲染一帧,last_svg() / last_render_ms() / last_svg_ms() 读回结果与分段耗时;render(...) 与 duration(...) 为兼容封装。示例场景 id:morph / formula / texmorph / write(公式书写 + 沿路径运动)/ unwrite(书写后擦除)/ gallery(原语橱窗)/ graph(坐标系 + 函数图像)/ attention(注意力引导)/ pointer(指针跟随,交互 env 演示);性能套件 id:bench-light(2 层,图形 morph + 短公式 morph)/ bench-standard(5 层,公式 morph + 坐标轴 + 生长/旋转/ 摆动)/ bench-heavy(27 层,长公式 morph + 25 个错峰圆 + 持续旋转 外框)。性能套件忽略公式输入、完全确定,用于跨版本对比帧率(标准见 design.md「定位」一节);?bench=1 打开四段归因(场景构建 / render_at / 序列化 / DOM)的自动测量与结果表。main_*.mbt 按后端 拆分(moon.pkg 的 targets 声明),非 js 目标只编译空壳 main,不引入 js FFI。

    最小用法:

    let circle = @mobject.Mobject::vmobject(
    @geom.Path::circle(@math.Vec2::new(200.0, 100.0), 100.0),
    )
    let square = @mobject.Mobject::vmobject(
    @geom.Path::rect(@math.Vec2::new(100.0, 0.0), 200.0, 200.0),
    )
    let scene = @anim.Scene::new()
    scene.add_layer(
    @anim.Layer::new(circle, [
    @anim.Animation::transform_to(square, duration=2.0),
    ]),
    )
    let svg = @svg.render_svg(scene.render_at(1.0)) // t = 1.0s 处的一帧

    #功能边界

    本版本做:

    • 三次贝塞尔求值 / 分割 / 弧长近似,路径扁平化与仿射变换;
    • 简单多边形(单环、无洞)三角化与基础描边展开;
    • 场景图递归变换、边界框计算;
    • 纯函数式动画时间轴:render_at(t) 无内部状态,可任意 seek;
    • 结构化插值 morph:任意两条路径经 Path::align 点数对齐后点对点变形;
    • 坐标系与函数图像:axes / number_line(刻度 + MiniTex 数字标签)、 plot 函数采样成路径、line / arrow 构造器;
    • 注意力引导族:indicate(缩放+变色脉冲)/ circumscribe(圈注)/ flash(辐射闪光)/ focus_on(聚焦),以及 fade_in_and_shift / fade_out_and_shift / spin_in_from_nothing / add_lagged 错峰 / count 数字滚动;
    • 部件匹配变形 transform_matching:符号标签 / 形状自动配对 + 孤儿淡化, 支持公式 A → 公式 B 的灵活变换(见 design.md §3.1);
    • manimlib 速率函数族:smooth / rush_into / rush_from / slow_into / there_and_back(_with_pause) / wiggle / squish / lingering / exponential_decay;
    • 淡入淡出 / 生长 / 旋转原语:fade_in / fade_out / fade_in_from_point / fade_out_to_point / fade_to_color / grow_from_center / grow_from_point / shrink_to_center / scale_in_place / rotate;
    • 弧长创建族原语(Path::trim 按弧长裁剪为使能件):show_creation (Write:描边渐显,公式按字形顺序书写)/ unwrite(反向擦除)/ move_along_path(沿路径运动)/ Path::to_dashed(虚线化);
    • 公式子集排版:普通字符、{...} 分组、\frac、^、_、常用希腊字母命令; 字形为内嵌 Latin Modern 轮廓子集(82 字形,子集外字符回退占位盒);
    • SVG 后端:任意时刻场景 → 独立 SVG 文档。

    本版本明确不做(均为后续路线,见 docs/design.md):

    • OpenGL / 实时窗口预览;
    • 完整 LaTeX(计划经 MicroTeX FFI 接入 FormulaRenderer trait,上游零改动);
    • 完整字形覆盖(当前为内嵌 Latin Modern 子集,子集外字符回退占位盒; 扩充方式见 docs/porting.md);
    • 音频、3D、复杂文本 shaping、路径布尔运算;
    • 带洞多边形三角化、earcut 的 z-order 哈希优化(见 docs/porting.md)。

    #设计文档

    • docs/design.md — 架构决策:场景图 ADT、动画代数、缓存层、 公式渲染扩展点,以及各项"刻意推迟"的理由。
    • docs/porting.md — earcut 移植声明(原项目、许可证、范围与偏差)。

    #开发

    moon fmt # 格式化 moon check # 类型检查 moon test # 白盒测试(各包 *_wbtest.mbt) moon info # 生成 .mbti 公共接口文件

    CI(GitHub Actions,.github/workflows/ci.yml):安装工具链 → 全目标 check → test → build → 实际运行两个示例并校验输出含 <svg。

    #许可证

    Apache-2.0(见 LICENSE)。geom/earcut.mbt 包含移植自 mapbox/earcut(ISC 许可证)的代码, 保留原版权声明,详见 docs/porting.md。

    version

    fn version() -> String

    Source Files