複雑なオブジェクトを表示する
前回は単純なCubeを表示するだけで少しもおもしろくありませんでしたので,今回は,より複雑なオブジェクトを表示して遊んでみましょう。
複雑なオブジェクトとは,例えばFlash以外の3Dソフトで作ったキャラクターとか,そういうものです。しかし,オブジェクトをマーカー上に表示するといっても全く難しくなく,Papervision3Dの機能だけであっさりできます。
そもそも,FLARToolKitがやっていることは前回もお話したようにカメラ座標の計算のみであり,そこから先はPapervision3Dをいかに組み合わせて使うか,という部分がほとんどで,つまり,ここから先はPapervision3D講座みたいになります。
今回使うデータは,以下になります。
Flashをお持ちの方はflaディレクトリに.flaファイルがあるのでそれをパブリッシュ,Flex Builderを使ってる人はこのzipをそのままFlex ProjectのArchiveファイルとしてimportしてください。
なお,今回も前回使用したものと同じマーカーを使用します。そのため,まだマーカーを作ってない人は,マーカーのPDFファイルを80mm x 80mm(等倍)で印刷しておいてください。
外部データを読み込む
Papervision3Dは基本機能の1つとして,Colladaというデータ形式の3Dオブジェクトを読み込む機能がついています。ColladaとはSony Computer EntertainmentがPlayStation 3の標準データフォーマットとして開発したもので,現在ではKhronos Groupという組織が管理している3Dソフトウェア業界標準の3Dデータフォーマットです。
例えば,フリーの3Dソフト,BlenderでもCollada形式に対応しているので,とりあえずお金をかけずに3Dモデルを作ってみたいという方はBlenderを試してみてください。ちょっとクセがあるけど慣れれば問題ないと思います。
ただし,Colldaのサイトに,Collada対応の3Dソフト一覧という項目がありますが,必ずしもPapervision3Dで使えるColladaを書き出せるとは限らないので,注意してください。
みっくみくにしてやんよ
モデリングの説明から始めると話がそれすぎてしまうため,今回はすでにCollada形式で書き出されたデータを読み込むところから説明します。
まずは,外部データとしてnote.xさんがフリーで配布しているねぎミクColladaファイルを使ってみます。いわゆる「はちゅね」です。
外部データを読み込むコードは以下のようになります。詳細はGihyo2_1a.asを確認してください。
リスト1 外部ファイルの読み込み(Gihyo2_1a.as)
// Gihyo2_1a.as
package {
import flash.display.Sprite;
import org.papervision3d.objects.parsers.DAE;
[SWF(width=640, height=480, backgroundColor=0x0, frameRate=30)]
public class Gihyo2_1a extends PV3DARApp {
private var _miku:DAE;
public function Gihyo2_1a() {
this.init('Data/camera_para.dat', 'Data/flarlogo.pat');
}
protected override function onInit():void {
super.onInit();
this._miku = new DAE();
this._miku.load('negimiku.dae');
this._baseNode.addChild(this._miku);
}
}
}
とても簡単ですね。コードの流れは,前回のSimpleCube.asと同じように,まずはPV3DARAppクラスを継承したGihyo2_1aクラスを作ります。
そして,onInitの中でオブジェクトを作るのですが,今回は外部ファイルを読み込むだけなので,たったの3行です。DAEクラスがColladaファイルを読み込んで表示してくれるクラスです。このクラスのloadメソッドに読み込みたいColladaファイル(.daeという拡張子です)を指定すると,あとは勝手にモデルデータやテクスチャデータを読み込んでくれます。
読み込んだら前回と同じように,_baseNodeにaddChildします。そして,Flash使ってる方はGihyo2_1a.flaをパブリッシュ,Flex Builderを使っている方はGihyo2_1a.asをRunしてください。以下の図のように表示されるはずです。
そうでした,FLARToolKitの座標系が違うんでしたね。そこで,そのあたりを調整しましょう。それがGihyo2_1b.asです。以下の部分を確認してください。
リスト2 サイズと座標系の調整(Gihyo2_1b.as)
// Gihyo2_1b.as
this._miku = new DAE();
this._miku.load('negimiku.dae');
this._miku.scale = 5; // 1
this._miku.rotationX = 90; // 2
this._miku.rotationZ = 90; // 3
this._miku.z = 9.68721 * 5; // 4
this._baseNode.addChild(this._miku);
1では,サイズがもう少し大きくなるように調整しています。2と3では,正しい方向に回転させています。4では,Z方向に移動させています。
今回使ったデータは原点がはちゅねのおなかあたりにあるため,そのまま表示してしまうと,マーカーの上に正しく立ってくれません。そこで,ちょうど足がマーカー原点になるように移動させる必要があります。この数字はモデリングデータから調べたものです。実際に自分でモデルを作るときには,原点がマーカー中心だということを考えて作れば,わざわざActionScirptで移動させなくてもよくなります。
さて,Flashを使ってる方はGihyo2_1b.flaをパブリッシュ,Flex Builderを使っている方はGihyo2_1b.asをRunしてください。
どーん。はちゅね召喚に成功しました!
ね?簡単でしょう?

