Flash用の3D表示用のライブラリでは、SandyとPapervision3Dが有名らしい。
とりあえずここではSandyを見て行く。
Sandyはフレームワークとして、Pixlibを採用している。
それゆえSandyを利用するには、Pixlibもダウンロードしておく必要がある。
ダウンロード後の解凍処理でたちまち問題が発生する。
解凍には+Lhacaを使っていたのだが、rarファイルを解凍すると中身が空っぽのフォルダができるので、???だった。
+Lhacaはrarファイル対応との説明がサイトに書かれているが、バージョンによっては解凍ができないらしい。
Lhazをダウンロードして使うことにした。
こちらでは問題なく解凍できた。
Sandyの概略はここにある。
それによると、3Dワールドのルートとして、まずWorld3Dクラスを作る。
これにエレメントを追加指定って3Dワールドを作っていくらしい。
操作対象になるオブジェクトはTransFormNodeGroupの下に追加して行く。
TransFormNodeGroupに追加できるオブジェクトは3種類で、Object3D,Sprite2D,Sprite3Dがある。
Object3Dは本当の3D構造で、フレーム表示の度にレンダリングされる。
Sprite2Dは、カメラの位置に関係なく、いつも正面を向いている。
Sprite3Dは、カメラの位置に応じて、事前に用意した、360枚のスキン画像を切り替えて表示できる??(まだ、ちょっとよくわからない。)
このページに一番基本になる3Dワールドの初期化のサンプルコードが載っている。
そのコードをコピーしてパブリッシュしてみるのだが、たちまち引っかかる。
文字コードの問題なのか、作成者が使っているコンパイラがFlashではないのか、ライブラリ自体のバージョンの問題なのか、それらが絡み合ってのことなのか、Flash8の文法チェックではエラーがでまくり、テストコードのパブリッシュが一向にできない。
エラーコードは、sandy.xxx.xxxがロードできない、といったものが表示される。
そこで、エラーになっているクラスファイルを見てみるが、確かにその場所にクラスファイルは存在している。
ファイルを開こうとするとまたエラーが出る。
このファイルは外部で書き換えられています。リロードしますか、というエラー。
ここで、はいをクリックすると、ファイルは開かれない。
いいえをクリックしてファイルを開く。
ファイルを開いたら、class sandy.xxx.xxx{というクラスの頭の部分のsandy.xxxを削除して、クラス名のみにする。
そして、import sandy.xxx.*;というインポート分を追加する。
何でか知らないがこういう風に書き直すと、文法チェックのエラーが消える。
最後のエラーは、Camera3Dクラスのコンストラクタに渡す引数の型が合わないというもの、確かにソースを見ると、サンプルでは全然だめなのがわかる。
よくわからないが、型が合うように、スクリーンと同じ600,600に修正してパブリッシュしてみる。
とりあえずこれで、エラーは出なくなった。
修正したサンプルのコード内容は以下。
import sandy.core.data.*; import sandy.core.group.*; import sandy.primitive.*; import sandy.view.*; import sandy.core.*; import sandy.skin.*; import sandy.util.*; import sandy.core.transform.*; import sandy.events.*; function init( Void ):Void { // screen creation, the object where objects will be displayed. //var ecran:ClipScreen = new ClipScreen( this.createEmptyMovieClip('ecran', 1), 600, 600 ); // we create our camera var cam:Camera3D = new Camera3D( 600, 600 ); // we add the camera to the world World3D.getInstance().addCamera( cam ); // we create the root node. var bg:Group = new Group(); // and set it as the root node of the world. World3D.getInstance().setRootGroup( bg ); // and we lauch the scene creation createScene( bg ); // and now everything is created, we can launch the world rendering. World3D.getInstance().render(); } function createScene( bg:Group ):Void { ;// make you implementation here } // We lauch the animation creation. init();
どうやら、ライブラリのバージョンアップでscreenは作らなくてもよくなったらしい。
World3Dはコンストラクタから生成するのではなく、スタティックなメソッドgetInstance()で呼び出すようになっている。
シングルトンということか?
ソースはまったく見ていないので、記述は全て当てづっぽう。