2009/07/08

SIO2 - Blender で作ったシーンファイルを表示させる このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

今日は、Tutorial04 をベースにして、自分で作った Blender シーンを iPhone シミュレータで表示させてみます。

Tutorial04 はヤシの木と箱と草があるシーン(tutorial04.blend)を表示し、画面をドラッグすることで視点の移動ができるというサンプルです。



プロジェクトの作成

SIO2_SDK_v1/tutorial04 を SIO2_SDK_v1/foo04 としてコピーし、ここを今回の作業場所とします。



Blender でシーンを作成

起動直後の Cube 1個に加えて、tutorial04.blend からヤシの木をコピーしてみました。ヤシの木が見えるようにカメラの位置を調整します。

20090707_iphone_0

Blender でレンダリングできていることを確認します。

20090707_iphone_1



.sio2 形式にエクスポート

Blender シーンを独自形式に変換するため、SIO2 SDK 付属のエクスポータ SIO2_SDK_v1/exporter/sio2_exporter.py を使います。


  1. エクスポート先ディレクトリ SIO2_SDK_v1/foo04/export/ を作る

  2. シーンを全選択

  3. sio2_exporter.py を Blender から実行して、エクスポート先ディレクトリを指定してエクスポート



成功すると、SIO2_SDK_v1/foo04/export/ 以下に Scene/ と Scene.sio2 ができます。

Scene/ ディレクトリには camera, material, object などの要素ごとにディレクトリがあり、その中に要素の情報が記述されたファイルがあります。

Scene.sio2 は Scene/ を ZIP したものみたいです。

スクリプトのエラーメッセージは、MacOS X のアプリケーション → ユーティリティ → コンソール で見ることができます。



Scene.sio2 を読み込むように変更


  • プロジェクトファイル template.xcodeproj を開いて、Resources に Scene.sio2 を追加

  • template.mm を開いて、templateLoading 内で sio2ResourceOpen している部分のファイル名を "Scene.sio2" に変更



printf したものは、コンソールで見ることができます。




インストールされるプログラム名称を変更


iPhone シミュレータ上で元々の tutorial04 が上書きされないように、プログラムの名前を変えます。

Xcode menu → プロジェクト → アクティブターゲット "tutorial04" を編集 → Packaging → プロダクト名 を tutorial04 から foo04 に変更



動作確認

20090707_iphone_2

ビルドして実行すると、こんな感じで出ました。
特にコアな部分ではまることもなく、ほうほうといった感触です。

次回は、Tutorial06 を元に、自分で作ったシーンに対して物理シミュレーションを有効にしてみる予定です。

2009/07/02

SIO2 - Frustum culling system があった このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

前のエントリで

大量のオブジェクトからカメラ付近のものだけ抜き出して描画するような仕組みはないっぽい


と書きましたが、SIO2 には Frustum culling という仕組みがあり、完全に視錐台の外にあるオブジェクトはそもそも描画しないようになっているようです。



仕組み


  1. 各オブジェクトについて、オブジェクトの bounding sphere が一部でも視推台に含まれるかを計算(sio2ResourceCull 関数)

  2. 各オブジェクトについて、上記の値が真なら描画する(sio2ResourceRender 関数)





性能見積もり(ざっくり)

視推台の包含判定がオブジェクトの個数だけ実行されるというのがちょっと気になったので試算してみます。

bounding sphere の包含判定を行う sio2CameraSphereDistInFrustum 関数を見ると、必要な演算量は、視推台の 6 面それぞれについて 3 次元ベクトルの内積と加算なので float 36 演算。

一方、iPhone 3G の CPU はだいたい 500Mflops, 描画は 50fps とすると、1 フレームあたり 10Mflops。これで全部包含判定すると、10M / 36 = 300K として、30 万回分。

プロセッサ資源を全部包含判定に使うわけにはいかないので、保守的に 5% 使うことにすると、1.5 万回分。というわけで、オブジェクト数が 1000 とか 10000 程度であれば、BVH 的なツリー構造を使わなくても O(N) 判定で特に問題ないかな、といったところです。

この辺は、大量のオブジェクトやポリゴンを扱うオフラインレンダラと比べると、そんなにオーダーを気にしなくて良い分野なのかな、という印象を持ちました。



ちなみに

テクスチャに Alpha 成分を持つオブジェクトのソートもやってくれるようですが、そこではバブルソートが使われていました。半透明オブジェクトはそんなに多くねぇよな、という理由でしょうか。



参考

2009/07/01

SIO2チュートリアルを実行してみた このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

SIO2 INTERACTIVEから SIO2 Engine Free Edition をダウンロードして解凍。

チュートリアル 19 個のビルド、実行、ソース斜め読みをしてみました。

分かったこと

  • チュートリアルには、templateRender, templateScreenTap, templateScreenTouchMove などの雛形関数が用意されていて、概ねこれらの関数内部だけ書けば良いようになっている。これを流用するのが楽そう。

  • キャラクター、オブジェクト、光源など Blender でデザインしたシーンを、SIO2 SDK 付属エクスポーターを使って独自形式(.sio2)にエクスポートする。

  • SIO2 runtime は .sio2 ファイルを読み込み、iPhone 上で描画する。

  • SIO2 runtime はシーン内のオブジェクトの位置やテクスチャなどを動的に変更できる。この仕組みを使ってユーザーの入力をオブジェクトに反映させる。

  • 物理エンジンをONにすると、オブジェクト同士の衝突や自由落下などの影響がオブジェクトに反映される。

  • アニメーション、パーティクルも Blender 上で作ったものが再生できる。

  • ビデオ、サウンド、ソケットを扱う API がある。

  • 大量のオブジェクトからカメラ付近のものだけ抜き出して描画するような仕組みはないっぽい




疑問

  • Bullet にある Vehicle API みたいなのは SIO2 でも使える?どうやって使えばよい?

  • LOD のような仕組みはある?



ある程度 Blender を使えるようにしないといけないようです。

実機で動かすには有料の iPhone Developer Program に入らないといけないですか。そうですか。