SceneKitで遊んでみる
SceneKitで遊んでみる
iOS8にはいった、3Dの何かを簡単に作れるSceneKitで遊んでみた。
キャラクタが画面中央に表示されて、5秒に1回ジャンプのアニメを実行する。BananasAsimpleSceneKitplatforminggame と https://github.com/shu223/iOS8-Sampler のSceneKitのサンプルをコピペでつなぎあわせたようなもの。
感じ的には、three.js で3Dしている方の説明とおんなじ感じだなと思った。せっかくだから、ミクさんのアプリを作ればいいのに、3Dデータ変換方法がわからなくて、断念。
Githubのサンプルアプリ。 https://github.com/reinforce-lab/ObjC_Codes/tree/master/SceneKitDaeExample
SceneKit Framework Reference https://developer.apple.com/library/ios/documentation/SceneKit/Reference/SceneKit_Framework/
3Dデータの変換
https://github.com/ark-project/ark-project にオープンなデータがあったので、サンプルに使わせてもらった。 cheetah3dというMacのアプリで読み込んで、dae形式に書き出して、テクスチャの設定をする感じ。
モデルが最初真っ白だったから、まず左のペインのMマークのマテリアルで、diffuseにテクスチャの画像ファイルを指定。光の放出を意味するEmissionが白だと、やっぱり白いままなので、これを黒に変更、とかすると3Dモデル+テクスチャが表示される。
lapisの3Dモデルは、上腕部がXcodeでプレビュ表示されない。またビルド時にdae形式のアイルを変換するっぽくて、その時にエラーが出てた。なので、モデルファイルはプロジェクトからは削除してある。
ツールによって、ファイルフォーマットの相性とか、データの作り方や命名方法など、実際にやっていくと、いろいろあるんかもね。

SceneKitの使いどころ
3Dのモデルを読み込み、それを表示させたり、アニメーションをさせたり、物理シミュレーションで動かしたりするのが簡単にできるのが、SceneKit。昨年iOS7で導入された2Dテームを手軽に作れる SpriteKit の3D版といった感じ。
3Dゲームを作る環境には、Unity等がある。それに比べて何か利点があるかというと、多分ない。開発環境を見ても、3Dのモデルはプレビューはできるけど編集能力はないし、物理シミュレーションやアニメーションができるけど、現在のところはインタラクティブに確認する機能もないから、ビルドして振る舞いを見るしかない。プラットフォームもiOSかMacOS縛りになる。
Unityを使うほどではないとか、Unityのラインセスをとって学ぶのが大変だとか、Unityを使った人がいないときに、アプリにちょっと3Dを入れたい場合には便利だと思う。3Dのシーンを見せるのに、レンダリングした動画を入れちゃうと、見るだけになるけど、例えばカメラアングルをぐりぐり動かしたいとか、アプリ側から演出したいとか、そういうときに3Dモデル+アプリ的ななにか、をちょっと入れる場面も、使えると思う。
イメージ的には、アイカツ!ミュージックビデオメーカーみたいな。http://app.famitsu.com/20140806_420069/
あるいは、月齢表示とかのアプリなら、月の3Dモデルに太陽と地球の放射光があたっているさまを、表示するとか。
SceneKitのなかみ
プロジェクトのサンプルコードを見たら、そのままだけど。
表示は、UIViewを継承する SCNView 。これのsceneプロパティに、SCNScene のオブジェクトを入れる。ゲームだと、3D画面の上に操作用画面をいれるけど、それはSCNScene のoverlayなんとかに、SpriteKitの画面を入れられるので、それを使うといいっぽい。
SCNScene は、3Dモデルやアニメーションといったデータを保持するクラス。内部のデータ構造は、SCNNode をノードにする木構造。ノードを作っては、そこにカメラとかオブジェクトとかを張り付けていく。木構造の根は、SCNScene の rootNode プロパティ。
3Dモデルのテクスチャには、リソースの画像ファイルや、文字列やら、CALayerやSpriteKitの画面が貼り付けられる。だから、カメラのプレビュ画面がCALayerから派生しているけど、そういうカメラ動画を貼り付けるとか、そんなのも簡単にできる。
OpenGLのレンダラを生で叩くとか、低レベルなところもありっぽい。OpenGLで別で自分で書いたのと融合とか、面白い事が出来る人には、使いこなせるんあろうと思う。
面白いのは、アニメーションの指定がCoreAnimation。ノードに貼り付けた3Dオブジェクトやライトやカメラの、位置や速度や質量や加速度やらをCoreAnimationでアニメできる。また、アニメのデータは dae 形式のファイルに入れたアニメのデータをCoreAnimationとして読みだすことができるので、別にコードで書かなくてもいい。
2次元のUIのアニメだと思っていたCoreAnimationのスキルが、3Dなところでもそのまま使えるのは、汎用的で面白い。
あとはパッと見たところで:
SCNProgram
OpenGL Shading Language (GLSL)で記述したシーエだープログラムを使ってカスタムなレンダリングを実行する。 バーテックスシェーダー、フラグメントシェーダー
SCRenderer
すでにレンダラのコンテキストが指定されているアプリに、別のコンテキストを指定できる。EAGLContext object 。
SCNView。カメラグリグリ動かせる、フレームレート(最大60、デフォルト60)、スナップショット。
https://developer.apple.com/library/ios/documentation/SceneKit/Reference/SCNView_Class/
SCNScene。Vihicleのサンプル、オーバーレイが継承している。
SKSpriteNode。2次元の画像。
SpriteKit(2次元ゲームを作るやる)のシーンをオーバレイ。速度メータとか。
SKScene *scene = self.overlaySKScene
//self はSCNView
SCAAnimationEvent。足音とか、アニメに同期した音