予想外で、本当に楽しいデキゴトでした。次回のデザインフェスタにも是非、参加しようと思っています。過去にprocessingで作成したものprocessingにハマっていた時になんとなく作ったもの。面白いのができるかも、という単純な理由で作りました。結果としてはなんだかわからないものが出来たけど、ちょっと面白いと思ったので公開してみました。こちらは自分で描いた軌跡をもう一度、追体験できる、というプログラム。動画の形で公開してみようと思いました。これについては別の形で誰でも体験できる状態で再公開したいと考えています。processing2014年3月14日金曜日デジタル・マーブリング本当はSICFというイベントで発表できたら、と考えていたのですが、あえなく落選してしまい、発表場所もなくなったのでブログに公開します。最初の構想の元になっていたのはマーブリングという水の上に絵の具を落としていく技法です。子供の頃に水の上の絵の具を流して遊んだことがある人は多いと思いますが、あれです。動画はトルコの職人さんによるもの。これをPC上で再現したら面白いんじゃないかと思い、まず考えたのが、水流を再現するにはどうしたら?ということでした。流体シミュレーションを開発・公開されている方がそれなりにいて、今回の制作には以下のライブラリを参考にしました。ソースコードから理解していくという作戦です。Diewaldhttp://thomasdiewald.com/blog/?p=95このライブラリはjavaで記述されていて、GPUを使うバージョンも公開されていたのですが、ダウンロードして動作したのはCPUバージョンのみ。CPUバージョンだからかパフォーマンスも正直、イマイチ。今回はopenFrameworksを使うつもりでいたのと、パフォーマンスを改善することを目的にまずはライブラリをC++に移植するところから開発をスタート。動かしたところ、パフォーマンスはそれほど変わらず・・・マシンにインストールされているのはjava6なんですが、java6、かなり速いです。次にロジックを見直して不要そうな部分をどんどん省いていったんですが、これも対して効果なし。残る作戦はGPUを使った並列処理化しかない、と思いはOpenCLでロジック部分を実装。結果はかえって遅くなる始末。これにはヘコみました。それでも納得できなかったのでいろいろと試した結果、GPUでの並列化でなく、CPUでの並列化の方が速いことが判明。満足いくパフォーマンスを得ることができました。内部的にはCPUコアをフル活用しているんだと思っています。今回、プログラムでは2次元配列を多用しており、GPU側のメモリへの転送速度がネックになっているんだと推測しています。openCL慣れてくれば、かなり応用範囲の広い技術な気がしています。今回はデータ並列(同じ処理を複数同時に行う)しかしてないんですが、タスク並列(違う処理を同時に行う)でやれる部分もあったりしますし、openGLとメモリ領域を共用して描画速度をもっと早めたりもできそうですし。以前、作成したチューリングパターンなんかにも応用できそうです。ちなみに今回の開発環境は以下のとおりです。openFrameworksスイミーもう発表済みなんでここに載っけてもいいかと思ってブログに載せます。銀座で発表したものです。実は去年、「MeMe2013「動き」の設計」という短期の授業を受講したのですが、その授業での動きの考え方に基づいて作成したのが、この動画です。授業で一緒になった佐藤さんによるもの。実装面は僕がやりました。それから、ビジュアルイメージ的には絵本のスイミーを参考に。このコンセプトを聞いて最初に思ったのが、boids。一度やってみたかったのです。プログラムそのものはそんなに難しくないんですけど、パラメータの調整が繊細で、そっちに時間をとられました。開発時はパラメータの数が多すぎてそういうのを入れる気にならなかったです。