
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 で動作確認した。他のライブラリは未確認だけど問題があった場合の対処についての理屈は同じ。