Ranim
是一个使用 Rust 编写的程序化动画引擎,
受 3b1b/manim 和 jkjkil4/JAnim 启发
- 矢量图形基于二阶贝塞尔曲线表示,使用 SDF 渲染
- 使用 wgpu,兼容多种后端图形 API
- 可编译到 wasm 支持 Web 平台
Preview
App
use std::f64::consts::PI;
use log::LevelFilter;
use ranim::{
animation::{creation::WritingAnim, fading::FadingAnim, transform::TransformAnim},
color::palettes::manim,
glam::DVec3,
items::vitem::{
VItem,
geometry::{Circle, Square},
},
prelude::*,
};
#[scene]
struct HelloRanimScene;
impl SceneConstructor for HelloRanimScene {
fn construct(self, r: &mut RanimScene, _r_cam: ItemId<CameraFrame>) {
let square = Square::new(2.0).with(|square| {
square.set_color(manim::BLUE_C);
});
let r_square = r.insert(square);
{
let timeline = r.timeline_mut(&r_square);
timeline.play_with(|square| square.fade_in());
};
let circle = Circle::new(2.0).with(|circle| {
circle
.set_color(manim::RED_C)
.rotate(PI / 4.0 + PI, DVec3::Z);
});
let r_vitem = r.map(r_square, VItem::from);
{
let timeline = r.timeline_mut(&r_vitem);
timeline.play_with(|state| state.transform_to(circle));
timeline.forward(1.0);
let circle = timeline.state().clone();
timeline.play_with(|circle| circle.unwrite());
timeline.play(circle.write());
timeline.play_with(|circle| circle.fade_out());
};
}
}
fn main() {
#[cfg(not(target_arch = "wasm32"))]
{
#[cfg(debug_assertions)]
pretty_env_logger::formatted_timed_builder()
.filter(Some("ranim"), LevelFilter::Trace)
.init();
#[cfg(not(debug_assertions))]
pretty_env_logger::formatted_timed_builder()
.filter(Some("ranim"), LevelFilter::Info)
.init();
}
#[cfg(feature = "app")]
run_scene_app(HelloRanimScene);
#[cfg(not(feature = "app"))]
{
render_scene(HelloRanimScene, &AppOptions::default());
render_scene_at_sec(HelloRanimScene, 0.0, "preview.png", &AppOptions::default());
}
}