Rust製のメディア・アート的なコードを書くためのnannouというフレームワークの使い方を簡単に紹介する記事です
メディア・アート関連の話
メディア・アート系のフレームワークだとProcessingやもっと低レイヤなものだとopenFrameworksが有名でしょう
Rustだとメモリ周りがC++よりもセキュアにかけるので個人的な見解ではopenFrameworksの代替として作られたのではないかと考えています
nannouの詳しい日本語の記事についてはこちら
さっそくどんなものか見ていきたいのですがsampleコードを見ると2つのテンプレートが存在しています
- template_sketch.rs ... オブジェクトをいい感じに取り回すテンプレ
- template_app.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クラスが肝でこちらに必要な情報が入ってきます。時計のような動きをするサンプルを書いてみました。キーを押下すると白黒が逆転します。
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で書くのは全然ありな気がしてきましたね!
このテンプレの書き方だと押下しているキー情報しか取れなかったりそこまで融通が効かないので、細かいことをしたいとなるとイベントハンドラを取り回した方が良さそうです。しかし、そこまで凝ったことをしなければ強力な数値計算系の関数を使ってかっこいいアニメーションは組めそうです。