はじめに
この記事は先日Flying Tokyo #19に参加した際にCinderに触発されたopenFrameworksを使っている大学生の書いた記事です。
すごいよCinder!!
Flying Tokyo #19について
Cinderについて
Cinderとは、画像、音声、動画等を簡単に処理&可視化できる、主にビジュアルデザイン向けの強力なC++ライブラリであり、The Barbarian GroupのAndrew Bell氏が中心となってオープンソースとして開発が進められています。
同様の思想を持つProcessingやopenFrameworksによく似ており、C++で簡単に記述できるうえ、Windows、MacOSX、iOS(iPhone/iPad)といった複数のプラットフォームをカバーしています。
https://research.preferred.jp/2010/11/cinder-intro/より引用
openFrameworksとの違いについて
ビジュアルデザイン向けの強力なC++ライブラリという点でかなり両者は似ています。私もCinderを始めたばかりなので、詳しいことはわかっていませんが、Simonさんの話を参考にさせてもらうと
そもそもProcessingやopenFrameworksはアーティスト、デザイナー、そして学生にコーディングを教えるためにつくらたもので、CinderはというとBarbarian Group(米国のインタラクティブマーケティング企業)の内製ライブラリとして誕生し、プログラマがプログラマのために作ったものである。そのためCinderはアーティスティックでクリエイティブなツールをその中心に置きながらも、モダンで標準的なC++言語の作法を尊重するという特長を持っているらしい。
確かに今回のワークショップでも、ある程度C++11やテンプレートに関する知識、const correctnessとか、Smart Pointerとか知識あるの前提みたいな感じだったので、oFより敷居は高いかもしれません。
しかしながら、setup()
,update()
,draw()
があるよとか、openFrameworksをやっていれば役立つ知識はかなり多いです!
Cinderのすごいとこ!(Flying Tokyo #19で感じた点)
- Runtime Compileのblock(oFでいうとこのaddon)があるのでライブコーディングできちゃう!(Cinder-Runtime)
- ファイルなど(画像ファイル、ソースファイルなど)に変更があった場合の監視ができ、イベントを受け取れる(oFでも多分できるけど、CinderはWatchDogでサポートしてくれている)
- イベントは
getWindow()->getSignal~~
みたいなので大体受け取れてイベント駆動っぽいのも書きやすい。 - Windowの指定が簡単、複数台ディスプレイとかがあってもどこに何を出すかとかの設定がとてもしやすい。
- オブジェクト指向のライブラリ設計アプローチ。例えば四角形を描画するときoFでは
ofDrawRectangle( x, y, w, h )
と書いていたけど、xとか何入れてるかよくわからない、、、対してCinderはgl::drawSolidRect( Rectf( x1, y1, x2, y2 ))
のように書く。(最近ではoFでもそのような書き方もサポートされたが、) - Batchというのを使うと、Gpuをうまく使える!oF以上にパフォーマンスあげるのがライブラリのおかげで楽な面が多い。
- geomのサポートが熱く、3Dモデルとかなくても簡単な地形など作れる!(Teapod/Sphere/Cylinder/WireCapsuleなどのSourceが一行で呼び出して使える+Perlin Noise,Twist,Transformなどでの変形)(oFでも3Dモデルなくても作れたりするけど、transformとかあった??かな??)
などなど...
参考
Workshopの際に講師のSimonさんが準備してくださったレポジトリをTeiichi Otaさんが翻訳を加え、私が多少修正、コメントを加えたものです。READMEが超充実してるので、参考にどうぞ!
https://github.com/Hiroki11x/FlyingTokyo19
特に、コンパイラを標準のものを使用していない方、Cinder-Runtimeを使う際にinstall.shでコンパイラが怒られる方、こちらが参考になればと思います。
OSX の gcc を変更した話
Simonさんのサンプルプロジェクト
以下にSimonさんが作られたサンプルプロジェクトがまとまっています。その中の幾つかを紹介します。
1. CascadedShadowMapping
2. PBRBasics
3. PBRTexturingBasics
4. ParallaxCorrectedCubemap
5. TessellatedNoise
Blockのサンプル(openFrameworksで言うaddon)
6. CinderImGui
GUIツールキットimguiのCinderBlockです。
よくあるコールバック式ではなく、Immediate Mode という少しめずらしい構造をしています。
例えばボタンなら以下のような形です。スライダーなども大体こんなかんじです。
// draw 関数内
if(ui::Button("button 1")) {
printf("push !\n");
}
毎秒何回も更新されるアプリケーションに大変親和性の高いGUIパラダイムと言えるでしょう。
openframeworksのaddonもあります >> ofxImGui
7. CinderRuntime
これはopenFrameworksで言うaddonのsampleプロジェクト
標準のサンプル
8. ClothSimulation
9. DeferredShadingAdvanced
10. EarthQuake
11. ExponentialShadowMap
12. FallingGears
13. Flickr
14. Geometry
15. GoodNightMorning
16. MandelbrotGLSL
17. MeshVoxels
18. NormalMapping
19. PaletteBrowser
20. ParticleSphereGPU
21. PickingFBO
22. VoronoiGpu
23. Wisteria
他のすごそうなサンプル集
追記
Ushio@githubさんからCinderImGuiについて編集いただきました、ありがとうございます!