SceneKit日和(1)

どうも吉村です。

SceneKit.frameworkというものがMac OSX用のフレームワークとして10.8から存在します。
リアルタイム3D・2Dレンダリングのためのフレームワークです。
iOSにはまだ実装されていないですが、
デバイスの性能が上がれば、そのうち実装されるのではないでしょうか

これがまた凄いフレームワークで、
3Dが簡単に扱えるだけでなく、
CIFilterやCoreAnimationLayer等の高度な既存技術から、
OpenGL等の低レイヤーなAPIが高いレベルで統合できるすばらしいフレームワークになっています。

ぶっちゃけた話、WWDC2012とWWDC2013のSceneKitのセッションをしっかり見れば、
大抵のことは出来る様になるので非常におすすめです。

結構語りたいことは数多くあるのですが、
まずはとっかかりとして、導入から、OpenGLのコードの統合方法を紹介します。

まずは導入です。
1、Cocoaアプリケーションのテンプレートでできたウィンドウに、SceneViewを貼付けます。
SceneView貼付け

2、常に描画を強制したいので、PlayとLoopにチェックを入れます。
SceneViewプロパティ

3、制御用のオブジェクトを作成して、IBOutlet SCNView *_view;と結びつけておきます。
  インターフェースビルダーとソースとの関係はこのようになります。
SceneKitStudy_—_MainMenu_xib

4、シーンを作成し、カメラとオブジェクトのノード(今回はtreeNode)を作成します。
  作成するには以下のような感じで作成します。
  SCNNodeRendererDelegateというのは、ノードのレンダリングをさせてもらうために登録しておきます。
  SceneKitのノードは、親子構造を構築するためのものですが、今回は原点に配置するだけなので、
  さして気にする必要はありません。

5、SCNNodeRendererDelegateを実装します。
  ここでポイントなのは、行列の設定がargumentsの中に入ってくる点です。
  OpenGLのコンテキストはひとまず綺麗な状態のようですので、
  行列を汚してしまいましょう。
  実際にはCATransform3D構造体が、NSValueに入って渡されてきますので、GLKMatrix4FromCATransform3Dをつかって、
  GLKitの行列に変換してしまったほうがやりやすいでしょう。

行列の設定後、次に単純な木のフラクタル図形を描画するロジックを記述しましょう。
当然のごとく再帰関数になります。 線形反復の構造とも言えるでしょう。

乱数の適用には、今回はMTRandomを使わせてもらいました。

https://github.com/preble/MTRandom

そして、呼び出し側も作成すると、SCNNodeRendererDelegateの全貌は以下のようになります。

ここまで作成すれば、
SceneKitでのOpenGLの統合がかっちり成功します。

デモ動画です。

Grow from wowdev on Vimeo.

今回はかなり低レベルなAPIの統合のトピックでした。
別な記事では高レベルなAPIも紹介していこうと予定しています。