Papervision3Dの最近のブログ記事

以前、3ds maxにColladaMAXプラグインを用いてdae形式のファイルを出力し、Papervision3dでそれを表示させるという方法を紹介したが、今回はAS3 Geom Class ExporterというMaxScriptを用いてActionScript3.0形式のファイルにして使用してみた。


オブジェクトの設定とかUVマップとかは、今までの[Papervision3d]#4 3ds maxでモデリングしたデータをColladaを使って表示する①の1~20や、[Papervision3d]#6 ライト・影をテクスチャによって表現の(1)~(3)を参照。


出来たオブジェクトをActionScript3.0で保存するほう為には、

(1) AS3 Geom Class Exporterをダウンロードする。
AS3 Geom Class Exportershirotokoroさんのブログの、ここでダウンロードできます。
Download demo sources and 3ds max scriptからダウンロードしたら、ファイルを解凍

(2) 3ds maxからAS3 Geom Class Exporterを実行できるようにする
3ds maxの画面右から、ユーティリティのタブをクリックし、MAXScriptを選択し、スクリプトを実行をクリック

s1.gif




































(1)で解凍したフォルダの、AS3GeomClassExporter.msファイルを実行


(3) AS3 Geom Class Exporterでファイルを出力
ユーティリティーと書かれているセレクトボックスからAS3 Geom Class Exporterを選択すると下に、AS3 Geom Class Exporterの画面が出るEngineをPapervision3d1.5に指定し、ExportClass

s2.gif
































これで、指定したクラス名(ここではMyObject)でファイルが出力される。




これを扱うためのソースはMAXScriptと一緒に入っているデモに書かれているので、とりあえずはそれを使う。



単に表示するとかなら、Collada形式でもAS3.0形式でも出来るが、AS3.0のようにクラス化されていると、昔書いた[Papervision3d]#3 複数のオブジェクトに異なったイベントリスナーを付けてみるのように、マウスイベントとかも細かく記述できるからこっちの方が便利かも


↓は実際にAS3 Geom Class Exporterで出力したファイルを表示させたもの




参考サイト
the.fontvir.us

最近、ブログの更新が滞ってて申し訳ない。まぢレポート出すぎ・・・


さて、今回は、Papervision3d × 3ds maxで表示させるオブジェクトに影をつける為の方法をメモっておく
私の調べた限りでは、Papervision3dに"ライト"という概念がない

そこで、UVWマップのテクスチャを使って影っぽいものを表現する



やり方は、
(1) オブジェクトをモデリング
(2) ライトを設定し、テクスチャをレンダリングし、画像ファイルとして保存
(3) 出力したテクスチャをUVWアンラップ
(4) オブジェクトをCollada(.dae)ファイルで出力
である。



(1) オブジェクトをモデリング
サイコロも飽きてきた頃なので、最近モデリングしたヴァイオリンを使うことにした


(2) ライトを設定し、テクスチャをレンダリングし、画像ファイルとして保存
作成のライトのスカイライトを選び、影付けにチェックをし、床に置く

1.gif

































v2.gif


























マテリアルの設定は、フツーの色をつけるだけ
v3.gif













































オブジェクトを選択した状態で、モデファイヤのUV座標からUVWアンラップを選択
右に出るパラメータの欄の編集をクリックし、選択モードの面サブ-オブジェクトモードをクリックし、
マッピングからフラッテンマッピングを選択
(この部分は、[Papervision3d]#4 3ds maxでモデリングしたデータをColladaを使って表示する①の14~19を参照)


UVW編集ウィンドウを閉じ、メインのウィンドウに戻ったら、レンダリングからテクスチャ レンダリングをクリック
v4.gif

























マッピング座標の既存チャンネルを使用を選択し、
出力の追加からCompleteMapを選択し、要素を追加
ファイル名とタイプから、出力する画像のパスと名前、形式を選ぶ
下に行って、ファイルのみをレンダリングをチェックし、レンダリング




























































時間がかかるかもしれないが以下のようなファイルが出力される。
violine_texture.png
















(3) 出力したテクスチャをUVWアンラップ
画像ファイルが出力できたら、それをオブジェクトに貼り付けなければならない。
まず、マテリアルエディタで、今まで単純に色を塗っていた状態なのでそれを削除
そして、今出力した画像を設定し、そのマテリアルを選択に割り当て
そして、それを名前をつけてライブラリに追加
(この辺の作業は、[Papervision3d]#4 3ds maxでモデリングしたデータをColladaを使って表示する①の③から⑩を参照)
すると、下のような状態になる。
v6.gif












































ここまで出来たら、もう一度モデファイヤのUV座標のUVWアンラップすればOK


(4) オブジェクトをCollada(.dae)ファイルで出力
ColladaMaxプラグインを入れていると、ファイルの出力でCollada(.dae)ファイルが出力できるので、出力



ActionScriptの書き方は、[Papervision3d]#5 3ds maxでモデリングしたデータをColladaを使って表示する②とほぼ同じなのでこれを見てください



マテリアルを、単にColorMaterialにした場合と、今回のようにテクスチャで影を表現した場合を見比べると、その差は一目瞭然
クリックすると、フラッシュで見れます。ただ、重いので覚悟してくださいww


violine.gifvioline2.gif





















参考サイト
ricardocabello How to render the illumination to a texture for Papervision3D with 3D Studio MAX
前回の[Papervision3d]#4 3ds maxでモデリングしたデータをColladaを使って表示する①に続き、Papervision3dでColladaを使ってみる。

前回は、.dae形式の3dオブジェクトを生成するところまでやったので、今回は、それを使うソースについて書いてみる



実際に動作するソースは、





17、18行目の

は、今までは使っていなかったが、
外部ファイルをActionScriptコンパイル後に生成されるswfファイルに含める時のコマンドで、さらにCでいう#defineみたいにここで定義した名前をプログラム内で使うことができる。



は、3ds maxで貼ったテクスチャの読み込みである。
まず、先ほど定義した画像ファイルのインスタンスを生成し、Bitmap型にキャスト
それを、Colladaコンストラクタに渡すためのMaterial配列(?)の中に、前回の⑩で定義したマテリアル名で登録する。


最後に

で、.daeファイルと、それに対応するマテリアルを引数に、Colladaオブジェクトを生成し
rootNodeに追加する



参考サイト
Papervision3D tutorial from the ground up (http://rozengain.com/?postid=28)

今回は、以下のコトを試してみる。
①3ds maxで3Dオブジェクトをモデリング
②ColladaMAXプラグインを用いて、3ds maxからCollada(.dae)形式でファイルを出力
③Papervision3dを使って、表示する


まず、環境設定から
3ds maxはデフォルトでは、Colladaを出力することができないのでColladaMAXというプラグインを入れる必要がある。
まず、Feeling Softwareに行き、ID登録をする。
ログインすると、DownloadからColladaMAXをダウンロードすることが出来る。

3ds maxがインストールされているなら、ダウンロードしたファイルを実行し、指示に従えばプラグインを入れることができる。




環境が整ったら、3ds maxでモデリングをする。

1.gif















①右のメニューから『ボックス』を選び、
②ボックスを作る
③上のメニューから『マテリアル エディタ』をクリックし、マテリアル エディタのウィンドウを開く

2.gif









































④マテリアル エディタの『拡散反射光の右のボタン』をクリックし、マテリアル/マップブラウザを開く

3.gif










































⑤マテリアル/マップブラウザの『ビットマップ』をダブルクリックし、画像を選択

今回は↓のdice.gifを使った。
dice.gif








画像が選択できたら、マテリアル エディタ ウィンドウに戻り、

4.gif









































⑥右から4番目のボタン『ビューポートにマップを表示』をクリック(必須ではない)
⑦左から3番目のボタン『マテリアルを選択へ割り当て』をクリックし、②で作ったボックスに画像を適応させる。ここで、②で作ったボックスが選択されてないければこのボタンは押せないので、押せない場合はボックスを選択する
⑧左から7番目のボタン『ライブラリに追加』をクリックし、このマップの設定に名前をつける










⑨『マテリアル/マップ ツリー全体をライブラリに追加しますか?』と聞かれるので『はい(Y)』をクリック

6.gif








⑩今回は『MyDiceMaterial』という名前をつける。ここで設定した名前はPapervisionで使うので、覚えておく(後でも見れるが)
⑪設定できたらマテリアル エディタのウィンドウを閉じる

7.gif















⑫上のメニューから、『モディファイヤ → UV 座標 → UVW マップ』を選択


8.gif















⑬右のメニューのパラメータから『ボックス』を選択し
⑭上のメニューから、『モディファイヤ → UV 座標 → UVW アンマップ』を選択

9.gif















⑮右のメニュのパラメータから『編集』をクリックし、UVWを編集ウィンドウを開く

10.gif













⑯セレクトボックスから、先ほどのマップを選択し、画面に表示させる

11.gif















⑰選択モードから『面サブ-オブジェクト モード』を選び
⑱メニューのマッピングから『フラッテンマッピング』を選択

12.gif











⑲設定を聞かれるが、『OK』を押す

13.gif













⑳すると以下のようにどの面にどの部分をマッピングするかを選択する枠がでるので以下のように移動

14.gif













これが出来たら、UVWを編集ウィンドウを閉じる
これで、モデリングは終了

ここで、これをそのままColladaでエクスポートしてもいいのだが、このままだと大きすぎるのかpapervisionで表示させると奥の方が小さくなりすぎてしまう。きっとpapervisionのカメラの設定で解決できるのであろうが、カメラについては、まだ詳しくないので、いろいろ実験した結果、このオブジェクトを縮小してから表示させると良い感じになった。

なので、
18.gif















スケールかなり、小さくし、

15.gif















『ファイル→書き出し』を選び

16.gif





















ファイルの種類を『COLLADA(*.dae)』にし、保存を押す。すると、

17.gif
















上のようなオプションを聞かれるが、これはデフォルトのままでいいらしい。

[Papervision3d]#5 3ds maxでモデリングしたデータをColladaを使って表示する②に続く
複数のオブジェクトに対し、

・マウスがオブジェクトに乗った時(マウスオーバー)
・マウスがオブジェクトから離れた時(マウスアウト)
・オブジェクトがクリックされた時(クリック)

に何らかのイベントを起こすようにする。

また、オブジェクトの種類(グループ?)によって、イベント処理を変更したいし、全オブジェクトの回転をrootNodeの回転で実現したいので、sceneに直接addChildせずに、rootNode的なものを用いることにする。
(Flashでは当たり前かもだけど、Flash自体初心者ww)



まず、前回作ったサイコロを5つで次のコトをやってみる
・黒いサイコロは、マウスが乗ると縮小
・白いサイコロは、マウスが乗ると拡大
・いずれもマウスが離れると元のサイズに戻る
・クリックされると、どのオブジェクトがクリックされたかを表示

結果は、

この結果に辿りつくまでにカナリ時間がかかった
Sceneをどのクラスのインスタンスにするかによってキーイベントの実装が異なるみたい
MovieScene3Dを使う場合は、リスナーを付けたいオブジェクトはかならずこのインスタンス直下になければならないようだ
だが、この方法だと先ほど述べたように全体を回転させたい場合にrootNodeという手段が使えないのだ。

これを解決するのが、InteractiveScene3Dクラスである。このインスタンスを作れば、今言ったような制限はなくなる。


そして、一番大変だったのが、
黒いサイコロと白いサイコロで、異なるイベントを起こす部分である。
Cubeオブジェクトのcontainer.nameに識別のための文字列を入れておき、イベントの最初に条件分岐するという方法もあるが、なんかしっくりこない。
そこで、黒いサイコロと白いサイコロを別々のクラスにし、イベント内でさらに自分のイベント用メソッドを呼び出すことに。
ここで問題になったのが、そのままCubeを継承して新たなクラスを作っても、DisplayObject3Dクラスに内メソッドを呼ぶとコンパイルエラーになる(当たり前)
なので、interfaceを利用することにした。調べてみると、actionScriptにもちゃんとinterfaceがあるので、使ったことないけどどうせJavaと同じように書けばいんだろうということで作成。
そのinterfaceを新たに作ったクラスでimplementsして、別々の処理を書けば完成。


クラス名をBlackDiceとかにするんなら、Material関係もクラス内に書いても良かったけど、もう動いちゃったから変更するのめんどくさくなったww。
あと、ClickEventメソッドは使わなかったww とりあえず、ソースは、
main.as

MyEvent.as

BlackDice.as

WhiteDice.as


もっと良い方法があれば教えてください
あわせて読みたいブログパーツ

iKnow