๐Ÿ”ฎ :: White Fireworks

BamgasiJMยท2025๋…„ 9์›” 20์ผ

Nannou <Generative Art>

๋ชฉ๋ก ๋ณด๊ธฐ
5/55
post-thumbnail

๐Ÿ“ Rust Code

use nannou::prelude::*;

struct Particle {
    pos: Point2,
    vel: Vec2,
    radius: f32,
    life: f32,
}

struct Model {
    particles: Vec<Particle>,
}

fn main() {
    nannou::app(model).update(update).run();
}

fn model(app: &App) -> Model {
    app.new_window().size(1080, 1080).view(view).mouse_pressed(mouse_pressed).build().unwrap();
    Model { particles: Vec::new() }
}

fn mouse_pressed(app: &App, model: &mut Model, _btn: MouseButton) {
    let mouse_pos = app.mouse.position();

    for _ in 0..30 {
        let vel = vec2(random_range(-3.0, 3.0), random_range(3.0, -3.0));
        let radius = random_range(2.0, 5.0);
        model.particles.push(Particle {
            pos: mouse_pos,
            vel,
            radius,
            life: random_range(1.0, 3.0), // 1~3์ดˆ ์‚ฌ์ด
        });
    }
}

fn update(_app: &App, model: &mut Model, update: Update) {
    let dt = update.since_last.as_secs_f32();
    for p in &mut model.particles {
        p.pos += p.vel; // ์†๋„๋ฅผ ์ง์ ‘ ๋”ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ๋” ์ž์—ฐ์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
        p.life -= dt;
    }
    model.particles.retain(|p| p.life > 0.0);
}

fn view(app: &App, model: &Model, frame: Frame) {
    frame.clear(BLACK);
    let draw = app.draw();
    for p in &model.particles {
        draw.ellipse()
            .xy(p.pos)
            .radius(p.radius)
            .color(rgba(1.0, 1.0, 1.0, p.life / 2.0)); // ์ ์  ํˆฌ๋ช…ํ•ด์ง
    }
    draw.to_frame(app, &frame).unwrap();
}

profile
Coding Art with Blender / oF / Processing / p5.js / nannou

0๊ฐœ์˜ ๋Œ“๊ธ€