note.x

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

Rasterizer Test01(要:FlashPlayer10.1)

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

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

Rasterizer Test02(要:FlashPlayer10.1)

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

Rasterizer Test03(要:FlashPlayer10.1)

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


3Dアプリでモデリング・モーション付やって、それをそのままASで扱えたらさぞかし楽しかろうと常々考えてきたにもかかわらず、一向にベストな方法が見つけられないし、出現しそうもないので、自力で色々作り始めてみることにした。

本来、.daeが正しく書き出せて、正しく読み込まれればそれが出来るはずなんだろうけど、現状3dsMAXとかMayaでも持ってない限り可能性が薄い。Unwrap3Dはwin用だし。んで、BlenderのエクスポータでもいじってみようかとColladaの仕様書とか見てみたりするんだけど、これがもーなにがなんだか。

そんなわけで.blend形式。ファイルフォーマットが公開されてるんで、こいつを手がかりに.blendローダーを作成。バイナリ最高。バージョンによるデータの差異は吸収できてないしメッシュの読み込みだけだけど、2.49bのファイルは問題ないとこまで来た。
いいかげんな3Dエンジンらしきものも自作。ジオメトリパイプラインの実装でつまずきまくって、首吊ろうかと思ったけど何とか動くようになった。まだ何かがオカシイので多分どっかの符号間違えてる。苦労した分、オレオレエンジンの成長が楽しくてしょーがない。擬人化したいぐらい。

ここまでの成果として、Blenderで編集したメッシュが.swf側に即時反映されるビューアを作ってみた。画面右がFlashPlayer。

城戸さんそのまんまなのがアレだしショボすぎて泣けてくるけど、これ、ちゃんと作ればかなり便利かも。swfで実際に表示されるまで分からない部分とかが、モデリングしながら確認できるのはメチャメチャ助かる。

当面は、プレハブみたいな実装の3Dエンジンをもうちょっとマトモなものにしつつ、なんとかしてモーションデータの再生までこぎ着けたい。とか宣言して自分を追い詰めておく。
まぁぼちぼち。


SCRATCHBRAINさんのエントリ「Away3D v2.1.0の使い方(8)- daeファイルのエラー解析中」で、オレがハマったのと全く同じ問題でお悩みのご様子なので支援してみる。

結論から書くと、書き出された.daeファイルにUV定義に関するノードが含まれてないのが原因。…たぶん。
他の問題の可能性もあるけど、SCRATCHBRAINさんが公開して下さった 問題のあるdaeファイル を拝見した感じだとほぼ間違いないかと。

解決するには、以下のような感じで。

1. UVを定義するオブジェクトを選ぶ。
2. Editingパネルの「Mesh」にある、「UV Texture」項目の「New」ボタンを押してUV定義を新規作成しつつ割り当て。オブジェクトが複数ある場合は、全てにこの作業を行う。(Blender2.45までだったら、UV Face Selectモードに一度切り替えることで、自動でUV定義される)

3. Collada Pluginでエクスポート。

キチンと作り込む場合は、UV定義しただけじゃ当然ダメで、UVエディット機能でしっかり指定する必要があるけど、単純にAway3DやPV3Dで読み込み可能なファイルにするだけなら、上記の手順でイケるはずです。(ダメだったら、イケねーぞゴルァ!とかコメントでも)

それから、(ほとんど私信になっちゃうけど)件の.daeファイルにはカメラやライト、Physicsに関するノードが含まれてますが、これ全然いらないです。書き出したいオブジェクトのみを選択した状態で、「Only Export Selection」を有効にしてエクスポートするといいと思います。あと「Disable Physics」を有効にするといいんじゃないかと。これらは、Away3Dで読み込むこととはあんまり関係ないですが、余計なデータは無いに越したことはないので。


AS3Exporterのテスト(要:FlashPlayer9)

Blenderから頂点・頂点インデックス・UV座標値を、各種AS3用3Dエンジン(Away3D、PV3D、Sandy)に対応した.asファイルとして吐き出すスクリプトが公開されてたのを最近見つけたんで使ってみた。スクリプト本体のダウンロードや、導入方法、基本的な使い方は、下記配布元で懇切丁寧に解説されてる。
http://rozengain.com/?postid=54

Away3D2.0以降で使う場合は、パッケージ構造の変更に対応するために下記のような修正が必要だった。

AS3Export.py – 187〜199行目

	as_output_string = 		"package "+as_package_name.val+" {\n"
	as_output_string +=		"\timport away3d.core.*;\n"
	as_output_string +=		"\timport away3d.core.mesh.*;\n"
	as_output_string +=		"\timport away3d.core.material.*;\n"
	as_output_string +=		"\timport away3d.core.utils.*;\n\n"

	as_output_string +=		"\tpublic class "+as_class_name.val+" extends Mesh {\n"
	as_output_string +=		"\t\tprivate var ve:Array;\n"
	as_output_string +=		"\t\tprivate var fa:Array;\n\n"
	as_output_string +=		"\t\tpublic function "+as_class_name.val+"(init:Object = null) {\n"
	as_output_string +=		"\t\t\tsuper( init );\n"
	as_output_string +=		"\t\t\tinit = Init.parse(init);\n"
	as_output_string +=		"\t\t\tve = [];\n"

を、下記のように変更した。

	as_output_string = 		"package "+as_package_name.val+" {\n"
	as_output_string +=		"\timport away3d.core.*;\n"
	as_output_string +=		"\timport away3d.core.base.*;\n\n"

	as_output_string +=		"\tpublic class "+as_class_name.val+" extends Mesh {\n"
	as_output_string +=		"\t\tprivate var ve:Array;\n"
	as_output_string +=		"\t\tprivate var fa:Array;\n\n"
	as_output_string +=		"\t\tpublic function "+as_class_name.val+"(init:Object = null) {\n"
	as_output_string +=		"\t\t\tsuper( init );\n"
	as_output_string +=		"\t\t\tve = [];\n"

それ以外は今のとこ問題なく、最新の2.46でもちゃんと動作した。
忘れがちなので要注意だったのが、Colladaエクスポーターと違って△ポリに自動変換してくれないので、エクスポート前に△ポリに変換しておくべし。

書き出された .as は、普通にMeshを継承したクラスになってるので、プリミティブオブジェクトと同じように扱えばオッケ。
当然ながらアニメーションには対応してないけど、これ結構便利かも。頂点とUV定義だけで充分な場合Collada使う意味無いし、そういうケースのほうが多いし。あと、モデルデータがファイルとして存在しない分コンテンツ保護にも繋がりそう。

追記:
ライブラリの更新にExporter側が追いついてないみたいで、書き出した形状の法線が逆になる。テクスチャ貼らないならライブラリ側で反転させればいい(Away3DならinvertFaces()、PV3Dならoppositeプロパティ)けど、テクスチャ貼る場合はそうもいかないのでAS3Exporterのテンプレートに手を加える。

AS3ExpAway3D220.as 21行目

ve.push(new Vertex(x, y, z));
↓
ve.push(new Vertex(x, z, y));

AS3ExpPapervision20.as 22行目

ve.push(new Vertex3D(x, y, z));
↓
ve.push(new Vertex3D(x, z, y));

と、頂点の定義順を入れ替えるだけ。あとは「Away3D 2.2, 2.3, 2.4, 3.4」「Papervision2.0」用としてエクスポート。Away3D 3.6、PV3D 2.1 で動作確認した。他のライブラリは未確認だけど問題があった場合の対処についての理屈は同じ。