MATLAB Flipbook Mini Hack に参加して ~ 2000文字でアニメーション
まえがき
MATLAB Flipbook Mini Hack とは、2000文字以内の MATLAB コードで見た目綺麗なアニメーションを作りましょうというコンテストです。
応募期間は 11/6~12/3 の 4週間。
一旦提出すると、削除以外の編集はできません。
変更したい場合は、新たに Remix として出します。
他の人の Remix も OK です。
提出一件につき、一つのお気に入りに投票ができます。
最終的な Top10 に $50 のアマゾンギフトカード、MathWorks が選ぶ3人に $300~$100 が与えられるとのこと。
去年もやっていたようですが知りませんでした。
”こんなのどうやって描いてるの!?”って感じのも多く、最初は参加を躊躇したのですが、今まで note 記事にいくつかアニメーション載せてたりしたので、そういうのをそのまま、あるいはそれを元に手を加えたりして、"参加することに意義がある" 精神でいくつか出してみました。
2000文字以外のレギュレーションは、24フレーム/s × 2秒=48フレームということです。
2000文字って結構なことができるので、むしろこちらの方が工夫が必要かもしれません。
最初のフレーム画像がサムネイルとして表示されます。
提出画面のサムネイルは drawframe(1); の数値を変えれば好きなフレームを表示させられるのですが、Gallery 画面では強制的に drawframe(1); になってしまいます。
これは、好きなフレームをサムネイルにできるようにして欲しいですね。
お気に入り
ではまずはいくつか気になったのをご紹介。
最初に驚いたのがコレ。
・Rolling fog
「画像読み込んでる?」
とか思いました。
気になった人が多かったのか会期中にこれ系の特集ブログが上がり、終了後にすぐ日本語版も出ました。
・slandarer / particle Heart 2
美しい!
この Remix もさらに。
・Mixing colorful dots
旧 Twitter をやられている方なら皆さんご存じかと思いますが、michio inoue さんの投稿。
コードの最初に書かれているように、旧 Twitter に流れてきたヤツが元ネタのようですが、追加した白丸がセンスの良さを感じさせます。(-_☆)
MathWorks で働きたい人生でした。(u_u)
・Lanterns
ボケが美しいです。
自投稿
続いて自分の投稿をご紹介。
1.Christmas Tree Illusion
元ネタはこの記事です。
見方によって回転方向が左右変わったり左右入り乱れたりする錯視です。
この時は一色の方が錯視が起こりやすいかなと思いましたが、今回は色を付けてみました。
2.Bouncing Ball Illusion
これはこの記事のを48フレーム版にしただけです。
3.Bouncing Ball Illusion (simplified)
こちらは上の Remix です。
シンプルにしてみました。こっちの方が見やすいかもしれませんね。
4.Hyperboloid_3D
投稿順としては5.と逆ですが、こちらが元です。
元ネタはこちら。
直線をねじると双曲面が現れるってヤツですね。
この「直線をねじる」をちょっと回してみました。
5.Hyperboloid_2D
4.を2Dとして表示してちょっといじったのがこれです。
6.Hyperboloid Shower
これも、多少モディファイはしてありますが、上記記事中にある、スクリュー付きシャワーの水の軌跡が双曲面になるシミュレーションのヤツです。
7.Hyperboloid Shower Lesage
これも記事中にありますが、6.の振幅や色を変えたものです。
リサージュ(Lissajous)図形というのがあります。
2つの(一般的には異なる)信号を直交する軸に入れて描かれる図形のことです。
これも、最初はリサージュを使おうかと思っていたのですが、色々試した結果 1:1(1:1 もLissajous に含まれはしますが)が良かったので、Lissajous をもじって、シャネル等のオートクチュールに刺繍を施している刺繍学校 Lesage の綴りにしてみました。
(まあ、一時期本当に綴り間違えてたんですが(^^;)
8.Lesage Flower
もうちょっと変えて、花が開いてる風に Remix。
あまり plot 本数が多いと表示されなかったので、外側は本数を減らして太くしてます。苦肉の策です。
9.Lesage Flower (a little modified)
さらに透明度とかも変えて、ラップされた花束風に。
10.Lesage Flower (additional)
これは位相比率を(連続的に、回転も交え)変えてみたものです。
これが、私が Up した中では一番投票数が多かったです。(¬_¬)
11.Wagon Wheel Illusion (Folding Noise)
この折り返し雑音の記事で、TVや映画などで車自体のスピードは段々上がっているにもかかわらず、ホイールの回転がゆっくりになったり、止まったり、逆回転しているように見えるいわゆる "Wagon Wheel Illusion" について書いています。記事中では画像や Simulink を使っているのですが、それを MATLAB コードだけで書いてみました。
シャフトのラインは一本一本引いてるのではなく、alphaShape を利用しています。
トリッキーな使い方で応用は効かないと思いますが、以下のスクリプトで描けます。
dth = pi/4;
th = (0:dth:2*pi-dth)';
x = [reshape(cos(th)*(1:2), numel(cos(th)*(1:2)),1); 0];
y = [reshape(sin(th)*(1:2), numel(sin(th)*(1:2)),1); 0];
shp = alphaShape(x,y,0.75);
p = plot(shp);
12.Wagon Wheels Illusion (Folding Noise)
alphaShape を使うと図形をコピーして描くのも簡単なので2輪バージョンも。
以下のように変更すると2つ同時に描けます。
x2 = [x; x+5];
y2 = [y; y];
shp = alphaShape(x2,y2,0.75);
p = plot(shp);
13.Sangu poo-Clitoria Ternatea (let it bloom)
他の方の投稿の Remix です。
とても綺麗だったのですが、アニメーションコンテストなのに動いてなかったので、ちょっと動かしてみました。w
14.Christmas Tree Illusion (modified)
最初の Christmas Tree Illusion、私は慣れているせいか余裕で錯視が起こるのですが、「起こりにくい」という方も。
「青のラインが邪魔してるのでは?」というサジェスチョンをいただいたので、青のラインを薄くして、チャームのサイズも少し小さくしてみました。
どうですかね? f(^^;)
15.Sangu poo-Clitoria Ternatea (let it bloom2)
13.の投稿後、急にそれの Remix が増え、元ネタのご本人も元のを消してUpし直してました。w
なので私も追加。
この方、最終ユーザー投票でぶっちぎりのトップだったはずなのですが、なぜかどんどん自投稿を消してしまって・・。(・・;)
アニメーション GIF
MATLAB でのアニメーション GIF 作成方法については、上に上げた元ネタ記事で何度か書いています。以下、簡単にまとめておきます。
処理の流れとしては以下の通りです。
-getframe() でムービーフレームとしてキャプチャー
-frame2im() でトゥルーカラーイメージに変換
-rgb2ind() でインデックスカラーに変換
-imwrite() で フレーム毎にGIFファイルとして保存
先頭フレーム以外は append モードで追加していきます。
st = tru; % 先頭フレームフラグ
fps = 15; % 1秒間のフレーム数
for j = 1:frames % frames:総フレーム数
frame = getframe(gcf); % ボーダーも含めてキャプチャー
% frame = getframe(gca); % ボーダーを除いた座標軸をキャプチャー
gr = frame2im(frame);
[bA,map] = rgb2ind(gr,256);
if (st)
imwrite(bA,map,filename,'gif','LoopCount',Inf,'DelayTime',1/fps);
st = false;
else
imwrite(bA,map,filename,'gif','WriteMode','append','DelayTime',1/fps);
end
end
Simulink には GIF 書き込みブロックはありません(よね?)が、MATLAB Function 内に書けば同様にできます。
アニメーションファイルは MATLAB Flipbook Mini Hack サイトからもダウンロードできますが解像度が300x300と低く設定されているので、自作アニメを SNS にアップする場合等は自分で作成した方が良いでしょう。
Flipbook Mini Hack での設定は以下の通りです。
fig = gcf();
fig.Units = 'pixels';
fig.Position(3:4) = [300,300];
Position(3:4) = のところを変えれば好きなサイズにできますし、何も指定しなければもう少し高い解像度で保存されるはずです。
Grand Prize Winners
最終結果はこちら。
やはりというか、最初にピックアップした Rolling fog が Grand Prize に選ばれていました。
最初見たときに既に他の参加者の投稿の質が高くて Prize に関しては考えていなかったのですが、会期途中 inoueさんに、「Week2 winners に選ばれてますよ!」と教えていただきました。
見に行ったら、Week1、Week2 で選ばれてました! o(^o^)o
基準はよく分かりませんが、Grand Prize とかとは別に、週毎に10名程度選ばれて景品が頂けるようです。
"Each of you won your choice of a T-shirt, a hat, or a coffee mug."
まさか選んでいただけるとは・・。
シンプル目のもイケるようですね。( ̄ー ̄)
あとがき
ネタさえあれば(他の人のを Remix もOK)気軽に参加できます。
投稿されたコードを見るだけでも、
「これだけでこんなのが描けるのか!?」
と驚くのがいくつもあって勉強にもなります。
コードを見ただけでは何でこれでこれが描けるのか理解できないのも多いですが、そこは MATLAB 、自分ですぐ試せます。
無料アカウントでもかなり使えます!
日本人の参加がかなり少ないようなので、来年はみなさんもいかがでしょう?
私はネタがなくなりました。(^_^;)
タイトル画像モデル:高杉レナ(クレアトゥール)