今回もnote.xさんの記事を参考にさせていただきました。
note.x:Papervision3Dメモ #19 D3S Importer Library for Papervision3D
ライブラリを落としてきて設定するまでの手順はPapervision3Dの時と同じです。
- 公式サイトからライブラリを落とす。
- 解凍した後、d3sフォルダをFlex SDKのframeworks/sourceフォルダ以下に置く。
ライブラリの使い方はとても簡単で、Max3DSをimportしておいて、
import d3s.net.papervision3d.objects.Max3DS;Max3DSクラスのコンストラクタにマテリアルとモデルファイルの名前を渡して、モデルオブジェクトを作成します。
作ったモデルを表示するにはいつものように、シーンに addChild() してあげます。
// マテリアル設定注意しなければならない事として、D3S Importer Libraryはアニメーションに対応してません。また読み込むのは、頂点、テクスチャ座標、面の情報だけで、テクスチャなどは自分で読み込む必要があります。
material = new WireframeMaterial( 0xffffff, 150 );
// .3dsファイルからモデルを作成
model = new Max3DS( material, "DINO.3ds", 3 );
scene.addChild( model );
(アニメーションするモデルを出したいなら、手っ取り早いのはnote.xさんがやられているように、MD2フォーマットのファイルを探してそちらを表示することでしょう。MD2はモデルの頂点アニメーションのデータを持っているので、Papervison3Dのような単純な3Dエンジンには向いてますね。とはいえ、古いゲームエンジンのフォーマットですし、日本語圏では馴染みが無いのがネックですね。)
実を言うと今回一番苦労したのは、適切な.3dsデータを探すことでした。ハイポリゴンのモデルは割とゴロゴロしてたんですが、さすがに1万ポリゴン前後だと、重くてブラウザの挙動もおかしくなるので……。
今回使用させていただいたのはNeval'sCGさんが公開しておられる恐竜のモデルです。(Neval'sCG→Models→DINOSAUR)
表示の際はワイヤーフレームで、背面を非表示にしています。
Load_3DS.swf
package
{
import d3s.net.papervision3d.objects.Max3DS;
import flash.display.*;
import flash.events.*;
import flash.text.*;
import org.papervision3d.cameras.Camera3D;
import org.papervision3d.core.Number3D;
import org.papervision3d.core.proto.MaterialObject3D;
import org.papervision3d.materials.*;
import org.papervision3d.scenes.Scene3D;
[SWF(backgroundColor = 0x3333ff)]
public class main extends Sprite
{
// 3Dライブラリ用
private var container : Sprite;
private var scene : Scene3D;
private var camera : Camera3D;
private var material : WireframeMaterial;
// 3Dモデル
private var model : Max3DS; // Max3DSモデル
// 回転制御
private var rot : Number = 0;
// モデル情報
private var sModelInfo : TextField;
public function main()
{
stage.frameRate = 60;
stage.quality = "MEDIUM";
stage.scaleMode = "noScale";
stage.align = StageAlign.TOP_LEFT;
sModelInfo = new TextField();
sModelInfo.backgroundColor = 0x000000;
sModelInfo.defaultTextFormat = new TextFormat("Verdana", 16, 0xFFFFFFFF);
sModelInfo.selectable = false;
sModelInfo.width = 300;
addChild( sModelInfo );
init3D();
this.addEventListener( Event.ENTER_FRAME, update );
}
// 3Dの初期化
private function init3D():void
{
// コンテナ生成
this.container = new Sprite();
addChild(this.container);
this.container.x = this.stage.stageWidth / 2;
this.container.y = this.stage.stageHeight / 2;
// シーン生成
scene = new Scene3D( container );
// カメラ設定
camera = new Camera3D();
camera.y = 30;
camera.z = 100;
camera.zoom = 10;
camera.focus = 100;
// マテリアル設定
material = new WireframeMaterial( 0xffffff, 150 );
material.oneSide = true;
// .3dsファイルからモデルを作成
model = new Max3DS( material, "DINO.3ds", 3 );
scene.addChild( model );
}
// 毎フレームの処理
private function update( event:Event ):void
{
// マウス座標でオブジェクトを回転
rot += this.container.mouseX / 150;
model.rotationX = 90;
model.rotationY = rot;
// モデルの情報を表示
sModelInfo.text = "vertices: " + model.geometry.vertices.length +
"\nfaces:" + model.geometry.faces.length;
// レンダリング
this.scene.renderCamera( camera );
}
}
}
【Papervision3Dの最新記事】

