nannou experiment no2 - perlin noise
I made a new nannou experiment - this time using 3D perlin noise to color, displace and resize some circles on a grid. It would propably make more sense to implement this using shaders - but I didn't start looking into the wgpu yet.
If you want to play with it yourself here is the rust code I used to create the animation
use nannou::noise::NoiseFn;
use nannou::prelude::*;
fn main() {
nannou::app(model)
.update(update)
.run();
}
struct Model {
points: Vec<Vector3>,
noise: nannou::noise::Perlin,
}
fn model(app: &App) -> Model {
app.new_window().size(600,600).view(view).build().unwrap();
let mut p = vec![];
for x in -15..15 {
for y in -15..15 {
p.push(vec3(x as f32, y as f32, 0.0));
}
}
let noise = nannou::noise::Perlin::new();
Model { points: p, noise: noise, }
}
fn update(app: &App, model: &mut Model, _update: Update) {
let t = (app.elapsed_frames() as f32) * 0.03;
let mut pn = vec![];
for p in &model.points {
let r = model.noise.get([p.x as f64/10.0, p.y as f64/10.0, t as f64]);
pn.push(vec3(p.x,p.y,r as f32));
}
model.points = pn;
}
fn view(app: &App, model: &Model, frame: Frame) {
frame.clear(BLACK);
let draw = app.draw();
for point in &model.points {
let d = vec2(point.x, point.y).normalize();
let r = point.z * 6.0 + 6.0;
let p = vec2(point.x, point.y)*15.0 + d * point.z * 15.0;
draw.ellipse()
.x_y(p.x, p.y)
.w_h(r,r)
.color(BLACK)
.stroke(hsla(1.0 - point.z as f32/2.0+0.5,1.0,0.5,1.0))
.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
nannou experiment - particles
nannou experiment