nannou experiment
I started playing with nannou - a rust based creative art framework.
this is the first animation I like so I exported it as single frames and turned it into a video.
The rust code looks like this - but be warned, I'm by no means a rust expert, this is my second ever rust program, so it might be a little wonky:
use nannou::prelude::*;
fn main() {
nannou::app(model).update(update).run()
}
struct Model {
p: Vector2,
s: Vector2
}
fn model(app: &App) -> Model {
app.new_window()
.size(600,600)
.view(view)
.build()
.unwrap();
Model {
p:vec2(0.0,0.0),
s:vec2(0.0,0.0)
}
}
fn update(app: &App, model: &mut Model, update: Update) {
let t = (app.elapsed_frames() as f32) * 0.03;
let w = (t * 0.832).sin() * 90.0 + 100.0;
let h = (t * 0.734).cos() * 90.0 + 100.0;
let x = (t * 0.132).cos() * 200.0;
let y = (t * 0.176).sin() * 200.0;
model.p = vec2(x,y);
model.s = vec2(w,h);
}
fn view(app: &App, model: &Model, frame: Frame) {
if frame.nth() == 0 {
frame.clear(BLACK);
}
let draw = app.draw();
draw.rect()
.x_y(0.0,0.0)
.w_h(600.0,600.0)
.color(hsla(0.0,0.0,0.0,0.005));
draw.ellipse()
.xy(model.p)
.wh(model.s)
.color(hsla(0.5,1.0,0.2,0.01))
.stroke(hsla(0.3,1.0,0.5,0.1))
.stroke_weight(1.0);
draw.to_frame(app, &frame).unwrap();
if ( frame.nth() < 2000) {
let file_path = captured_frame_path(app, &frame);
app.main_window().capture_frame(file_path);
}
}
fn captured_frame_path(app: &App, frame: &Frame) -> std::path::PathBuf {
app.project_path()
.expect("failed to locate `project_path`")
.join("frames")
.join(format!("{:04}", frame.nth()))
.with_extension("png")
}
See also:
nannou experiment - amplitude modulated rainbow sinewave
nannou experiment - particles
nannou experiment no2 - perlin noise
nannou experiment - particles
nannou experiment no2 - perlin noise