6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Rustでメディアアーティストに!!!おれはなるっ!!!

Posted at

Rust製のメディア・アート的なコードを書くためのnannouというフレームワークの使い方を簡単に紹介する記事です

メディア・アート関連の話

メディア・アート系のフレームワークだとProcessingやもっと低レイヤなものだとopenFrameworksが有名でしょう
Rustだとメモリ周りがC++よりもセキュアにかけるので個人的な見解ではopenFrameworksの代替として作られたのではないかと考えています
nannouの詳しい日本語の記事についてはこちら

さっそくどんなものか見ていきたいのですがsampleコードを見ると2つのテンプレートが存在しています

  • template_sketch.rs ... オブジェクトをいい感じに取り回すテンプレ
  • template_app.rs ... イベントハンドラをいい感じに取り回すテンプレ

これらを自由自在に扱えるとメディアアーティストになれるのかもしれない
最初の実行については本家の説明を見ればできそうなので割愛しておきます

オブジェクトをいい感じに取り回すテンプレを使う

もともとのテンプレのコードがこんな感じになります。

template_sketch.rs
use nannou::prelude::*;

fn main() {
    nannou::sketch(view);
}

fn view(app: &App, frame: &Frame) {
    // Prepare to draw.
    let draw = app.draw();

    // Clear the background to purple.
    draw.background().color(PLUM);

    // Draw a blue ellipse with default size and position.
    draw.ellipse().color(STEELBLUE);

    // Write to the window frame.
    draw.to_frame(app, &frame).unwrap();
}

サンプルを少し見ればわかるのですが、viewメソッドの引数になっているAppクラスが肝でこちらに必要な情報が入ってきます。時計のような動きをするサンプルを書いてみました。キーを押下すると白黒が逆転します。

sample.mov.gif

like_a_watch.rs
use nannou::prelude::*;

fn main() {
    nannou::sketch(view);
}

fn view(app: &App, frame: &Frame) {
    let draw = app.draw();
    let win = app.window_rect();
    let t = app.time; // 起動してからの経過時間(秒)
    let o = Vector2{ x : 0.0, y : 0.0 };
    let exists = app.keys.down.len() > 0; // app.keys.downで押下しているキー情報が取れる
    let (_1, _2) = if exists { (WHITE, BLACK) } else { (BLACK, WHITE) };
    draw.background().color(_1);

    draw.ellipse()
        .color(_2)
        .radius(win.top());

    // 長針
    let l = Vector2{ x : win.top() * t.sin(), y: win.top() * t.cos()};
    draw.line()
        .color(_1)
        .points(o, l);

    // 短針
    let s = Vector2{ x : win.top() / 2.0 * (t / 12.0).sin(), y: win.top() / 2.0 * (t / 12.0).cos()};
    draw.line()
        .color(_1)
        .points(o, s);

    draw.to_frame(app, &frame).unwrap();
}

書いていて気づいたのですがf32型にcosやsin関数が定義されているので数値から直接呼び出せます。
メディア・アート系のコーディングでは割と使う関数なので、結構使い勝手がいいのかな、という印象です。
Rustで書くのは全然ありな気がしてきましたね!

このテンプレの書き方だと押下しているキー情報しか取れなかったりそこまで融通が効かないので、細かいことをしたいとなるとイベントハンドラを取り回した方が良さそうです。しかし、そこまで凝ったことをしなければ強力な数値計算系の関数を使ってかっこいいアニメーションは組めそうです。

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?