note.x

Away3D 3.6リリース。

Away3D 3.6.0: Flash 10 upgrades and the Influxis Battlecell API

実質、3.5.3リリース時の仕様をそのまま引き継ぐ形でメジャーアップグレード。予告通りNumber3D廃止、めでたくネイティブ 3D APIに完全移行。FlashPlayer9向けの2.x系は、メンテナンスアップデートのみ行われていくことになる模様。個人的には面白味が減ってしまった。

今回のデモは、FMSのホスティングやってるInfluxisと組んでRTMFP使ったマルチプレイヤーのFPS。4人まで同時接続できるらしいんだけど、海外サーバーな所為か2人でもうゲームにならなかった。趣旨と関係ないけど、マウスドラッグでエイミングはやりにくいな。

放置しっぱなしの過去エントリをどーするかねーと思いつつ、とりあえずView3Dに関するエントリを修正。


Away3DのFlashPlayer10版が大きく仕様変更して、MatrixAway3Dクラスが廃止。ビルトインクラスのMatrix3Dに置き換わった。なので、Object3Dのtransformプロパティの各要素を直接書き換えたりするような実装してる場合はMatrixAway3Dに関わる部分を変更しないとビルドできない。MatrixAway3DとMatrix3Dの各要素は下記の対応づけ。

MatrixAway3D

MatrixAway3D.sxx MatrixAway3D.sxy MatrixAway3D.sxz MatrixAway3D.tx
MatrixAway3D.syx MatrixAway3D.syy MatrixAway3D.syz MatrixAway3D.ty
MatrixAway3D.szx MatrixAway3D.szy MatrixAway3D.szz MatrixAway3D.tz
MatrixAway3D.swx MatrixAway3D.swy MatrixAway3D.swz MatrixAway3D.tw

ビルトインMatrix3D

Matrix3D.rawData[0] Matrix3D.rawData[4] Matrix3D.rawData[8] Matrix3D.rawData[12]
Matrix3D.rawData[1] Matrix3D.rawData[5] Matrix3D.rawData[9] Matrix3D.rawData[13]
Matrix3D.rawData[2] Matrix3D.rawData[6] Matrix3D.rawData[10] Matrix3D.rawData[14]
Matrix3D.rawData[3] Matrix3D.rawData[7] Matrix3D.rawData[11] Matrix3D.rawData[15]

値を読み取るだけなら、

var tx:Number = Object3D.transform.tx;

という記述を、

var tx:Number = Object3D.transform.rawData[12];

に置き換えることで対処できる。

要素の値を変更する場合、MatrixAway3Dの要領で

Object3D.transform.rawData[12] = 100;

なんて感じで直接代入しても変更が反映されないので、

var vec: Vector.<Number> = Object3D.transform.rawData;
vec[12] = 100;
Object3D.transform.rawData = vec;

と、Matrix3Dの仕様に準ずる。

また、MatrixAway3Dで実装されていたメソッドの

  • quaternion2matrix
  • compare

と、ゲッター/セッターとして定義されていた

  • forward
  • up
  • right

は、Matrix3DUtilsという新クラスが引き継いでる。
forward, up, rightについては読み取り専用でそれぞれ

  • getForward
  • getUp
  • getRight

というメソッドに変更になった。

あと、ベクトルについても主要な部分はNumber3DからVector3Dへ移行してる。
まだ一部でNumber3Dが使われている部分があるけど、最終的にはなくなるみたいなのでNumber3Dは忘れてよさげ。Number3Dに実装されてたgetAngleメソッドは、新クラスVector3DUtilsが引き継いでる。

今回の仕様変更がどの程度影響してるのか分からんけど、じわじわと高速化してきてうれしげ。新機能いらないから洗練してほしい。

2010/09/16追記
とか言ってるうちに、FP10版3.5.4にアップデート。
ArrayをVectorに置き換えたりという地味な最適化を目的としたものみたいだ。


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

Rasterizer Test01(要:FlashPlayer10.1)

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

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

Rasterizer Test02(要:FlashPlayer10.1)

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

Rasterizer Test03(要:FlashPlayer10.1)

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


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/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)


MORE