‘try’ カテゴリーのアーカイブ

3D engine studies 100726

2010.07.26

自前エンジンにラスタライザ組み込んだ。やっと一息つけるとこまでできたー。

Rasterizer Test01(要:FlashPlayer10.1)

解像度640×480、△9800のトーラスにフラットシェーディングした状態で、自分の環境の場合30fpsくらい。背面カリングしてるので、実質△4000〜△4500くらい描画してる。ポリゴンあたりの描画面積のほうが影響ありそうなので、何枚描画できるかなんて性能評価の基準にならないかもしれないけど、まあ目安として。初代プレステが(たぶんローレゾで)30フレーム動作だと12000微少ポリゴン描画できるってことだから、なんとか近づけたい。目指せ初代プレステ。

Zバッファ持たせたので交差ポリゴンも問題なし。

Rasterizer Test02(要:FlashPlayer10.1)

テクスチャにもとりあえず対応。アルファブレンドはまだ。

Rasterizer Test03(要:FlashPlayer10.1)

ようやくBlenderローダーが前に進められそうな状況が整ってきたので、とりあえずハデな部分はこのへんで止めて地味な処理を詰める。勝手な解釈で曖昧にしてた部分が全部ひっくり返されて、かなり整理された。

PV3D FrustumClipping and QuadrantRenderEngine issue

2010.06.17

FrustumClipping と QuadrantRenderEngine が混在できないバグが未だにほったらかしっぽいので(Rev.942)、去年MLで流れてた対処法を紹介。とりあえず何とかしたい人向けTips。

FrustumClipping and QuadrantRenderEngine work together Demo(要:FlashPlayer9)

/core/dyn/DynamicTriangles.as の64行目以下

triangle.instance = object;
triangle.vertices = [v0, v1, v2];
triangle.uv = [uv0, uv1, uv2];
…

の部分を、以下のような感じに。

triangle.renderCommand.instance = object; //←この一行を追加
triangle.instance = object;
triangle.vertices = [v0, v1, v2];
triangle.uv = [uv0, uv1, uv2];
…

バカ正直に使うと当然負荷が大きくなるわけで、床面が真っ平らで良いならビットマップを透視投影した方が経済的だと思う。
QuadrantRenderEngine使用時は、通常のクリッピングの流れからバイパスして、視錘台の各平面と他のポリゴンとの交差をいっぺんに判定して分割、不可視部分を刈り取るようにすれば結構最適化できそうだけど、そこまでやるなら根本的なデータ構造含めて作り直したいっていう開発サイドの判断で放置されてるのかなぁ。

[Away3D] BSP-dev Branch

2010.04.09

Away3Dに BSP/PVS を実装しようとしてるブランチを見つけてニヤリ。
コミッターはFP10版Away3DにPixelbenderによるシェーディング実装した David Lenaerts
今どきのリアルタイムレンダリングシーンじゃ特に意識しないだろうし、Flash用エンジンに絞っても Alternativa3D とか infinity3d にはとっくに実装されてるし、これといったアドバンテージがあるわけじゃないけど、ライセンス的に緩めなAway3Dに組み込まれるのは本当にありがたい。

今のところObjectContainer3Dを継承したクラスとしてBSPTreeが実装されてて、空間分割されたコンテナをSceneに追加する形で使う。この辺はハナっからScene3DにBSPが組み込まれてる(と思われる)Alternativa3Dのほうがスマートだと頭の悪いオレでも思うので、今後の仕様変更でScene3Dに内包されるかも。そうなれば Zソート・クリッピング・カリング・ポリゴン交差時の分割処理に至るまでパイプラインの至る所で恩恵にあずかれるはず。あと、内部で持ってる物理演算や衝突判定の最適化にも取り入れようとしているみたいなので、ちょっぴり期待しておく。

まだまだガンガン仕様変更があると思うけど、どんな感じになるのか試したくて、以前作った迷路を使ってポータルシステムがどの程度カリングを最適化してくれるのかを見てみた。比較用にBSP/PVSを使わない場合も改めて作成。

BSPTreeとポータルの生成にはかなり時間がかかる。DoomやQuakeなんかだとレベルエディタを使って事前に作ったものを外部ファイルとして保存しておいて、実行時は読み込みだけで済むようにしてあるように、事前処理のがよさそう。Away3Dもこの辺は考えてあるようで、エクスポータークラスが用意されてる(PreFabにレベルエディタ的な機能が追加されたりして?)。今回は使い方がよくわかんねーのと、必要なデータ全部エクスポートするのこれ?って感じだったので諦めた。

Maze normal
Maze using BSP/PVS (BSP/PVS使用)

■操作方法
カーソルキー [CursorKey] … 移動 (move)
[Z], [X] Key … ティルト (Tilt)

※要:FlashPlayer10

BSP/PVS版は、スタンドアロンプレーヤーならかなりヌルヌル動く感じ。マシンパワーのある環境だと2つの違いが分かりにくいかもしれないけど、オレの環境(MacBookPro 2.33GHz Core2Duo)だと全然違う。クリッピングモードをRectangle Clippingにすると視覚的にも違いが見て取れる。Project stats の T-ELEMENTS と R-ELEMENTS を見ると処理対象のFaceが大幅に減ってるのが分かる。ワクワクしてまいりました。

ハードウェアの進化に伴って失われつつある先人達の技術を追体験しつつ手軽に勉強できるのが、ActionScriptで3Dをやる唯一のメリットだと思うので、こういうトピックは超アガる。ちゃんと自分のものにするには相当ハードル高いけど、とりあえず周辺をウロウロする。

参考:
BSP Trees(視覚的でわかりやすい)
バイナリ空間分割(Binary space partitioning)- Wikipedia
BSP trees in 3D worlds
ゲームプログラミングのためのリアルタイム衝突判定(Amazon)

QuakeII GWT Building&Running for Mac

2010.04.08

Java版Quake II「Jake2」を、Google Web Toolkit(GWT)でJavaScriptに移植したという
Quake II GWT Port が、WebGLのベンチマークになりそうだったので動かしてみたメモ。
以下、MacOSXでのビルド手順。

QuakeII GWTは、Mercurialでソース管理されてるのでコレ必須。
http://mercurial.selenic.com/downloads/

サウンド関連でVorbis-toolsとLameも必要。MacPorts使ってるなら

sudo port install vorbis-tools
sudo port install lame

でインストール。Fink使ってるならそっちで。
どっちも使ってない場合は、Homebrew突っ込んで、

sudo chown -R $USER /usr/local
curl -Lsf http://github.com/mxcl/homebrew/tarball/master | tar xvz -C/usr/local --strip 1
brew install vorbis-tools
brew install lame

でもいいらしい。
オレはMacPorts経由だったので他の方法は試してない。ダメだったらすんません。
これで準備完了。

適当なディレクトリに移動したあと、

hg clone https://quake2-gwt-port.googlecode.com/hg/ quake2-gwt-port

で、QuakeII GWT Portのリボジトリがコピーされる。
続いてサーバー、クライアントのビルドとリソースのインストール。

cd quake2-gwt-port
./build-dedicated-server
./install-resources

./install-resourcesとか時間かかるので、メシ食うとか風呂入るとか。
終わったら一部ディレクトリ構造を変更。なんかバグらしい?

cp -r maven-build/server/target/gwtquake/war/gwtquake war

以上でビルド完了。

サーバーを起動

./run-dedicated-server

起動できたら、WebGLに対応したブラウザで、

http://localhost:8080/GwtQuake.html

にアクセスする。
公式には、Chromiumが推奨ブラウザになってたけど、WebKit Nightly Buildでも動いた。

自分の環境では、11〜13fpsくらいの速度。遊べない事もないけど、たまにブラウザごと落ちる。ドライバの問題なのかGPUそのものが対応できてないのかよくわかんないけどそんな感じ。
HTML5よりなにより、GWTスゲーっていう印象。

FireFox3.6 mozOrientation

2010.04.02

mozOrientation + PV3D(要:FireFox3.6 + Flash Player9以降 + 加速度センサ付きPC)
※加速度センサ積んでれば、PCを前後左右に傾けることで玉が転がる

FireFox3.6が加速度センサの傾き検出できるってんで、ありがちな物を作って体験してみた。
自分のMacBookProでしか試してないんで確証はないけど、mozOrientationがディスパッチされる環境なら動くはず。

参考サイト:
加速度センサーの値を表示するサンプル(MozOrientation)

今回のネタを作ろうとFireFox3.6にしたらFlashの再生時、妙に負荷かかるようになった。
起動して数時間使った後で、上のデモを再生すると頻繁にGCが発生してるみたいな挙動になって、衝突判定すり抜けたりする。FireFoxを再起動すると直るんだけどオレの環境の問題かなぁ。