2009/12/30

Blender - シーンの自動生成 このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

シーンを自動生成したい

SIO2 を使った iPhone ゲームに表示させるための街並みシーンを作ろうとしています。手動で作るのは大変だと思ったので、最小限の情報から規則的に生成することを考えています。


Open City Engine

まず試したのはOpen City Engineというツールです。これはかなり強力なツールで、車線の数、ビルの種類(住居用/商業用/...)、ビルの分布などを指定して、信号機や歩道を含む街のシーンを生成することができます。

で、こっちを採用する路線で行ってたんですが、SIO2 + iPhone 環境にフィットさせるために今後いろいろ必要になるであろうカスタマイズ性を考えると、Open City Engine 内部を思い通りにいじくるのは大変そうだと思ったので、自分で作ってみることにしました。


オレオレエンジン(0.01)

道路を表すグラフから、道路メッシュや信号機、フェンス、横断歩道などを生成します(予定では)。今できてるのは、ラフな道路メッシュの生成と、道に沿って猿を設置する機能です。

道路を表すグラフ(黄色くハイライトされてるやつ。8頂点, 8エッジ)
roads generation


生成されたシーン
roads_generation


TODO


  • 道路同士をシームレスに繋げる

  • 何をどこに設置するかを決めるアルゴリズム

  • 設置する信号機、横断歩道、街路樹、フェンス、標識などの手配(作るor見つけてくる)

  • 設置するオブジェクトに応じた物理パラメータの設定

  • シーンの部分描画(未検討)への対応


などなど。


ちなみに

以前にも似たようなことを途中までしていまして、そのときは Metasequoia で作ったシンプルグラフ(.mqo)を C# で parse、道路メッシュを生成、それを別の .mqo に出力、それを Metasequoia で開いて DirectX(.x) 形式に手動でエクスポートというワークフローでした。

Blender + python 構成だと、内部データを直接いじれるので面倒な parse をしなくてよい、Blender のいろんな機能がスクリプトから使えるなど、良いことばかりです。(今は Metasequoia でもできるのかもしれませんが。)

ビデオ編集の話といい、いろんなメディアが Blender, Python というフリーなツールを介して繋がっていく感じが大変良いです。

2009/12/28

iPhone tips - 複数台の Mac で実機転送する時の注意 このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

メッセージ "A signed resource has been added, modified, or deleted." が出て実機転送できない

当方では Dropbox でソースを2台の Mac で共有して開発していますが、Mac A で実機動作させた後に Mac B で実機動作させようとしたところ、メッセージ "A signed resource has been added, modified, or deleted." が出て、実機にインストールできないという現象がおきました。

いろいろ検索したところ、
XCode Issue: 'A Signed resource has been added, modified or deleted.'にある通り、「ビルド→すべてのターゲットをクリーニング」をしたらうまく実機転送ができるようになりました。めでたしめでたし。

2009/12/07

SIO2 - tips このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

SIO2 を使って iPhone プログラムを開発する時の豆知識がいくつか溜まってきたので書きます。



Bounds はできるだけ box にする
Blender の Logic panel では物体の物理シミュレーション関連の設定ができます。物理シミュレータからみた物体の形状(Bounds) を Triangle Mesh や Convex Hull にすると、よりポリゴンの形に即したシミュレートができますが、その代わり必要な計算が増えて遅くなります。

例えば、簡単な坂を作りたい時は、直方体を傾けたメッシュを作って Bounds: Triangle Mesh にする代わりに、Axis-aligned な直方体メッシュを作って Bounds: Box にし、オブジェクトを傾けると良いです。



「ディスティネーショングループのフォルダに項目をコピーする」のチェックを外す
Xcode で Blender からエクスポートした sio2 ファイル(例えば Scene.sio2)をプロジェクトに追加する際、上記チェックボックスをオフにします。オンにすると、今ある Scene.sio2 がプロジェクトと同じフォルダにコピーされ、以降それが参照されてしまうため、オリジナルの Scene.sio2 への更新が反映されなくなってしまいます。
ハマリ1時間くらい。



library not found for -lstdc++-static が出る場合
SDK 3.1.2 にしたら出ました。以下の対策でビルドが通りました。

(1) Set the C++ Standard Library Type to Dynamic
(2) Add this in the C/C++ Compiler Flags: -fno-regmove -Wno-write-strings -falign-loops=16 -fvisibility=default

ビルドの件に関してはこのスレッドを参考にしました。

2009/11/24

SIO2 - マルチタッチを検出する(2) このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

開発環境を iPhone SDK 3.1.2, Xcode 3.2.1, SIO2 intteractive 1.4 に変えて、作っていたプログラムを新たに tutorial062 にマージしたところ、Interface Builder で Multiple Touch にチェックを入れるだけではマルチタッチが検出できなくなってしまいました。

いろいろ調べたり試したりしたところ、Classes/EAGLView.mm の createFramebuffer 関数で EAGLView の multipleTouchEnabled を YES にしたらうまくいくことが分かりました。なにゆえに昔はこうしなくても良かったのかまでは調べていませんが、とりあえずこれで動いてます。Window と View の両方で multipleTouchEnabled=YES にする必要があるとか?(教えて君)

追加後のコードはこんな感じになります。


// EAGLView.mm
- (BOOL)createFramebuffer {
self.multipleTouchEnabled=YES;
glGenFramebuffersOES(1, &viewFramebuffer);

2009/11/12

SIO2 - gluLookAt を使いたい このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

gluLookAt 的な便利関数を使いたい

SIO2 のチュートリアルには画面タップで視点が移動するサンプルが入っていますが、使い慣れた(?) gluLookAt を使いたいなぁと思ったので探してみました。



vectormath を使う

いろいろ調べて試したところ、vectormath を使うのが楽だという結論になりました。


  • 行列、ベクトルなどの演算ライブラリ. LookAt 系関数もあり.

  • SCE 製.

  • BSD license

  • Bullet physics SDK に含まれている.



Bullet physics SDK - SVN trunkのあたりから落とせます。

行列/ベクトル演算ライブラリは DirectX とかだと充実してますが、OpenGL には全然用意されていないので、vectormath みたいなものがあるととても助かります。



使用例

include/vectormath を、例えば template.mm と同じ階層にある Classes/ にコピーして、以下のようにすると使えます。


// template.mm に書く
#include "classes/vectormath/c/vectormath_aos.h"


実際のコード例は以下。いろいろ無駄なことをしているような気もしますが、とりあえずこれでキャラクター視点のカメラワークになります。


// キャラクターの行列を取得
btTransform tr = g_vehicle_phy->getChassisWorldTransform();
VmathMatrix4 m;
tr.getOpenGLMatrix((float*)&m);

// 視点, 見る方向, 上ベクトルを計算
VmathVector4 eye, target, up;
vmathV4MakeFromElems(&eye, 0, -1, 2, 1); //
vmathV4MakeFromElems(&target, 0, 1, 1.5, 1); // Y-front
vmathV4MakeFromElems(&up, 0, 0, 1, 0); // Z-up
vmathV4Add(&up, &up, &eye);
vmathM4MulV4(&eye, &m, &eye);
vmathM4MulV4(&target, &m, &target);
vmathM4MulV4(&up, &m, &up);
vmathV4Sub(&up, &up, &eye);

// (視点, 見る方向, 上ベクトル) を元に view 行列を計算
vmathM4MakeLookAt(&m, (VmathPoint3*)&eye, (VmathPoint3*)&target, (VmathVector3*)&up);

// 設定
glMultMatrixf((float*)&m);




画面

こんな感じ。

20091112_iphone_sio2

2009/11/05

SIO2 - マルチタッチを検出する このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

SIO2 Interactive でマルチタッチを使う方法をまとめます。


マルチタッチを有効にする

少しはまりましたが、ここだけ押さえれば後は普通です。

iPhone Simulatorのマルチタッチが効かないに書いてあるとおり、Interface Builder で Multiple Touch にチェックを入れます。こうしないと、座標が 1 個しか取れないようです。

やり方を詳しく書くと


  1. MainWindow.xib を Interface Builder で開く

  2. Tools -> Attributes Inspector で View Attributes パネルを開く

  3. View タブの Interaction - Multiple Touch にチェックを入れる





SIO2 アプリケーションからの見え方


templateScreenTap()
タップされたとき、指が離れたときに呼ばれる。第二引数に SIO2_WINDOW_TAP_UP または SIO2_WINDOW_TAP_DOWN が来るようです。

templateScreenTouchMove()
ドラッグされたときに呼ばれる。

sio2->_SIO2window->n_touch
現在検出されているタッチ数。

sio2->_SIO2window->touch[i]
各タッチ座標。float x, float y を持つ vec2 型。

sio2->_SIO2window->n_tap
タップ回数。ダブルクリックだと 2, トリプルクリックだと 3, 以下同様。ちょっと(0.7 秒くらい?)時間を空けたり、ある程度離れた部分をタップしたりすると 0 にクリアされます。

2009/10/12

F1中継っぽいテロップの使用例 このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク



"F1中継っぽいテロップを生成するスクリプト"で作った連番画像を、Blender を使ってカートのビデオに合成してみました。

"Blender でビデオ編集したい"とも関連するので、作り方などを後ほど記事にする予定です。

2009/10/09

F1中継っぽいテロップを生成するスクリプト このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

F1中継っぽいテロップを生成するスクリプトを作ってみました。

F1-like-telop

F1-like-telop

F1-like-telop

こんな感じで、予選の残り時間ぽい画像ができます。



使い道

あまり思いつかないですが、以下のような動画との合成に使えるかも。


  • カートに乗ったあなた(王道)

  • 無表情の人々(普段のピット風景)

  • 議論する人々(トラブル発生時のピット風景)

  • 座ったまま寝てる人(徹夜作業の疲れで予選中にうたた寝するピットワーカー)




コード (shell script)

Imagemagick で、グレーと白の背景に文字を入れた画像と、グラデーション2つと白画像をつなげた画像を合成しています。もっと簡単にできるという方、ぜひ教えてくださいw


# Prepare fonts
# ln -s /cygdrive/c/WINDOWS/Fonts /usr/share/fonts/corefonts
# List fonts
# identify -list font |less
# Generate
# # 4:07 から 3:07 まで連番で作る
# perl -e 'for $c (0..60){$t=247-$c;$m=int($t/60);$s=$t%60; $txt=sprintf("%d:%02d", $m, $s); $f=sprintf("out/%03d.png", $c); `sh gen.sh $txt $f`;}'

REST_TIME=$1
OUT_FILE=$2

convert -size 160x6 gradient:black-white g0.png
convert -size 160x28 xc:white g1.png
convert -size 160x6 gradient:white-black g2.png
montage -geometry +0+0 -tile 1x3 g0.png g1.png g2.png g.png

convert -size 160x40 xc:white -fill "#303030" -draw "rectangle 0,0 40,40" \
-pointsize 28 -gravity Center -font "Malgun-Gothic-Bold" \
-fill white -annotate -60-2 "Q3" \
-fill black -annotate +20-2 $REST_TIME base.png
composite -compose multiply g.png base.png $OUT_FILE

2009/08/21

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

前回は、Tutorial04 を元にして、ヤシの木と立方体のシーンが iPhone シミュレータで描画できることを確認しました。

今回は、Tutorial06_2 を元にして、自分で作ったシーンに対して物理演算が適用できることを iPhone シミュレータで確認します。

Tutorial06 は物理シミュレーションのデモです。
シーンファイル(Tutorial06.blend)には、起伏のある広場(?)、球体、円錐、Blender のマスコットのお猿さん(Suzanne)などが含まれます。各物体は物理シミュレーションの対象となるように Actor 属性が設定がされています。iPhone シミュレータで Tutorial06 を実行すると、広場に物体がばらばらと落ちてきます。さらに、カメラを物体にぶつけることで物体を動かすことができます。



プロジェクトの作成

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



ソースの(軽微な)変更

前回同様、読み込むシーンファイルの名前とインストールされるプログラムの名前を変更します。



Blender でシーンを作成

以下の物体を配置しました。括弧内はプリミティブの種類と設定した属性です。


  • 地面(Plane, Static, Actor)

  • ビルを模した直方体(Cube, Static, Actor)

  • トイレットペーパー(Cylinder, RigidBody, Actor, Bounds=Cylinder)

  • 何の変哲もないボール(Sphere, RigidBody, Actor, Bounds=Sphere)

  • カメラ(Lens=80deg)



Actor, RigidBody, Bounds の設定は、Logic panel(F4) から行います。
この状態で Blender から Start Game(P) すると、Actor 設定をした物体が自由落下して床に衝突する様子を見ることができます。

逐一 iPhone シミュレータで確認することなく、かなりの作業が Blender 上で完結するのは SIO2 の良いところだと思います。

20090820_iphone_SIO2

Blender の練習のために、地面とビルには "FOO BAR" テクスチャ、トイペにはトイペテクスチャを貼りました。(見栄えを少し良くするためでもあります)

20090820_iphone_SIO2

ちなみに、Actor 設定したオブジェクトを SIO2 エクスポータでエクスポートすると、"flags(1)" という行がオブジェクトを表すテキストファイルに追加されるようです。



Object transform scale に注意!

Blender でオブジェクトの大きさを変えるときは Object transform の scale を調整することが多いかと思いますが、そうして scale を変えたオブジェクトは SIO2 では衝突判定されないようです。(正確には scale が 1.0 じゃないとだめみたいです。理由までは追えていないです...)

Object mode で Object scale を変更するのではなく、Edit mode で Mesh 自体の大きさを変更すれば OK です。



動作確認

前回同様 .sio2 形式にエクスポートした後、Command + Enter でビルドして実行すると、カメラとトイペ(と何の変哲もない球)が床に落ちて以下の画面になりました。

20090820_iphone_SIO2

画面ドラッグでカメラを移動させると、トイレットペーパーを蹴散らすことができます。あなたの家のトイレで実際にやるともう少し面白いかもしれません。

20090820_iphone_SIO2


床の Object scale を 1.0 でない値にすると、カメラとトイペが床を突き抜けてしまいました。とりあえずは、こういうもんだと思って Object scale を使わないようにすれば良さそうです。

20090820_iphone_SIO2


次回は、未定ですが、Bullet Vehicle を SIO2 で使う方法が分かればいいなあといったところです。

2009/08/09

Blender でビデオ編集したい このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

Blender 2.49 がビデオテクスチャをサポートしたらしいです。

Blender wiki - VideoTexture

これを使って、ちょっと高度なビデオ編集が Blender Script でできうるんじゃないか?と、ちょっと期待しちゃいます。

というのは、Blender はもともと 3D オブジェクトを作ったりぐりぐり動かしたりするのが得意なので、そこにビデオテクスチャが加われば、複数のビデオを重ねたり、3D 空間にビデオを配置したり、3D キャラクタとビデオを合成したりといった、今のところ高価なビデオ編集ソフトにしかないエフェクトがフリーウェアである Blender でも(原理的には)できちゃうんじゃないかと思ったからです。

以上、Windows ムービーメーカーでは複数のビデオを合成できないと分かって、いろいろ調べているうちに見つけたネタでした。

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 に入らないといけないですか。そうですか。

2009/06/22

iPhone 用ゲームを作るための下調べをした このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

(ishida にそそのかされて)いろいろ検索したところ、SIO2 というゲームエンジンが良さそうなのでチュートリアルをやってみようと思います。

SIO2 の特徴のうち気に入ったもの


  • Blender で作ったアニメーションつきモデルが使える

  • 物理エンジン Bullet が使える

  • shadow map で影が出る



ほうほう!いいんじゃないでしょうか。

あと、大量のポリゴンをワールドに配置して、カメラから見えそうなものだけを描画する空間データ構造マネージャみたいなのがあるとうれしいんですが、あるんでしょうか...

過去、ちょっとやる気になっちゃあ凍結、というのを繰り返してますが、楽に作れそうならちょっとやってみようかと思います。

過去↓

2009/01/01

インストールレスなGPSデータの公開方法 このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

あけましておめでとうございます

手軽にGPSデータを公開したい

最近、「よし散歩するぞ!」という時は GPS(GPS-CS1K)を持ち歩いて経路を記録しています。

で、これを手軽に公開したいなと思ったので少し調べてみたんですが、世に知られている方法は大きく分けて


  • 専用ソフトでKMLやHTMLを生成、それを自分用のHTTPサーバにアップ or Google map マイマップにインポート
    trk2goolgemaps
  • GPSログをアップすると、そのデータを Google map にプロットするビューアの URL が発行される(SightField プレテストサービス



といった感じで、いろんなPCを使う環境の人にとっては専用ソフトをインストールするのが手間だったり、データが専用サイトに登録されるのでいつ消されても文句言えない、サービス継続リスクがある、などという状況でした。



ソリューション

というわけで


  • 専用ソフトなしで公開できる
  • データは Google map マイマップに保存する


というワークフローを作ってみました。


nmea2kml


NMEAフォーマットのGPSログファイルをアップ→KMLファイルをダウンロード→Google map マイマップにインポート→作ったマイマップを公開

という流れで公開します。

Google map マイマップサービスが消えるリスクもなくはないですが、ユーザー数からして最良の保管場所と言ってよいかなと思います。

個人的にビューアをかませてURL発行したいという時は、Google spreadsheet とか大手データ保存サービスを使うとデータ管理リスクが減ってよいかな、と思います。