Arc⁋
This example demonstrates Arc
.
https://github.com/user-attachments/assets/4f8c6f36-e6b7-429b-8d2a-91c21e17dec2
arc.mp4
1 | use env_logger::Env;
|
2 | use glam::dvec2;
|
3 | use itertools::Itertools;
|
4 | use ranim::animation::fading::FadingAnimSchedule;
|
5 | use ranim::color::HueDirection;
|
6 | use ranim::components::Anchor;
|
7 | use ranim::items::group::Group;
|
8 | use ranim::items::vitem::Arc;
|
9 | use ranim::prelude::*;
|
10 | use ranim::timeline::TimeMark;
|
11 |
|
12 | #[scene]
|
13 | struct ArcScene;
|
14 |
|
15 | impl TimelineConstructor for ArcScene {
|
16 | fn construct<'t: 'r, 'r>(
|
17 | self,
|
18 | timeline: &'t RanimTimeline,
|
19 | _camera: &'r mut Rabject<'t, CameraFrame>,
|
20 | ) {
|
21 | |
22 | let frame_size = dvec2(8.0 * 16.0 / 9.0, 8.0);
|
23 | let frame_start = dvec2(frame_size.x / -2.0, frame_size.y / -2.0);
|
24 |
|
25 | let start_color = color!("#FF8080FF");
|
26 | let end_color = color!("#58C4DDFF");
|
27 |
|
28 | let nrow = 10;
|
29 | let ncol = 10;
|
30 | let step_x = frame_size.x / ncol as f64;
|
31 | let step_y = frame_size.y / nrow as f64;
|
32 |
|
33 | let arcs = (0..nrow)
|
34 | .cartesian_product(0..ncol)
|
35 | .map(|(i, j)| {
|
36 | let (i, j) = (i as f64, j as f64);
|
37 |
|
38 | let angle = std::f64::consts::PI * (j + 1.0) / ncol as f64 * 360.0 / 180.0;
|
39 | let radius = step_y / 2.0 * 0.8;
|
40 | let color = start_color.lerp(
|
41 | end_color,
|
42 | i as f32 / (nrow - 1) as f32,
|
43 | HueDirection::Increasing,
|
44 | );
|
45 | let offset =
|
46 | frame_start + dvec2(j * step_x + step_x / 2.0, i * step_y + step_y / 2.0);
|
47 | let mut arc = Arc { angle, radius }.build();
|
48 | arc.set_stroke_width(6.0 * (j as f32 + 1.0) / ncol as f32)
|
49 | .set_stroke_color(color)
|
50 | .set_fill_color(color.with_alpha(0.0))
|
51 | .put_anchor_on(Anchor::center(), offset.extend(0.0));
|
52 | arc
|
53 | })
|
54 | .collect::<Group<_>>();
|
55 |
|
56 | let mut arcs = timeline.insert(arcs);
|
57 | let arcs_fade_in = arcs.lagged_anim(0.2, |item| item.fade_in());
|
58 | timeline.play(arcs_fade_in.with_total_duration(3.0)).sync();
|
59 |
|
60 | timeline.insert_time_mark(
|
61 | timeline.duration_secs(),
|
62 | TimeMark::Capture("preview.png".to_string()),
|
63 | );
|
64 | }
|
65 | }
|
66 |
|
67 | fn main() {
|
68 | #[cfg(debug_assertions)]
|
69 | env_logger::Builder::from_env(Env::default().default_filter_or("arc=trace")).init();
|
70 | #[cfg(not(debug_assertions))]
|
71 | env_logger::Builder::from_env(Env::default().default_filter_or("arc=info")).init();
|
72 |
|
73 | #[cfg(feature = "app")]
|
74 | run_scene_app(ArcScene);
|
75 | #[cfg(not(feature = "app"))]
|
76 | render_scene(ArcScene, &AppOptions::default());
|
77 | }
|
78 |
|