homeへのリンクです。

Sandy 1

2007年07月07日

Flash用の3D表示用のライブラリでは、SandyPapervision3Dが有名らしい。
とりあえずここでは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()で呼び出すようになっている。
シングルトンということか?

ソースはまったく見ていないので、記述は全て当てづっぽう。