カテゴリー : Alternativa3D

3d studio max から Altanativa3D への書き出し

この記事はFlashPlayer11で利用できるStage3Dを使ったコンテンツを作るために3Dソフト3D studio MAX 2012を使って作られた3DのモデリングデータをFlashの3D用ライブラリのAlternativa3D8をつかってswfファイルにするまでの手順を説明しています。

プラグイン Alternativa3DS Max 2012 plugin が入ってることを前提(前の記事参照)にwindows7/3d studio max 2012の環境を前提にしています。

作業の流れ

あらかじめモデリングしたデータがあると仮定します。ここでは3D studio MAXにサンプルとして用意されていたスポーツカーを利用しました。

・3D studio MAXでモデリングデータを開く。

・MAX上でモデルオブジェクトに任意の名前をつけます。この名前はAS上で呼びだすのでメモっておきます。

・メニューからexportを選び、opencollada+a3d形式で出力します。

・書きだしたファイルをAS上から呼び出します。

3DSmaxでの作業

maxを起動して適当なサンプルファイルを開きます。

左上のMAXロゴからexport>exportをたどり、書き出し設定ダイアログから拡張子を「opencollada+A3D」を選択し、任意の場所に書き出します。

これでmax側の作業は終了。

FlashBuilder/Flash側の作業

Alternativa3DのswcをBuilder/Flashに登録します。

Flash側の作業は
・書き出したDAEファイルをロードする。
・DAE内のオブジェクトの名前をFlash側に伝える。

上の画面の右上modifyタブで表示されているオブジェクト名を

var mesh:Mesh = parser.getObjectByName(“bmw7“) as Mesh;

として登録する。
超詳細はこちら

下のサンプルはAltanativa3dのサンプルになります。

package parsersexample {

	import alternativa.engine3d.controllers.SimpleObjectController;
	import alternativa.engine3d.core.Camera3D;
	import alternativa.engine3d.core.Object3D;
	import alternativa.engine3d.core.Resource;
	import alternativa.engine3d.core.View;
	import alternativa.engine3d.loaders.Parser3DS;
	import alternativa.engine3d.loaders.ParserA3D;
	import alternativa.engine3d.loaders.ParserCollada;
	import alternativa.engine3d.loaders.ParserMaterial;
	import alternativa.engine3d.loaders.TexturesLoader;
	import alternativa.engine3d.materials.TextureMaterial;
	import alternativa.engine3d.objects.Mesh;
	import alternativa.engine3d.objects.Surface;
	import alternativa.engine3d.resources.ExternalTextureResource;
	import alternativa.engine3d.resources.Geometry;

	import flash.display.Sprite;
	import flash.display.Stage3D;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.net.URLLoader;
	import flash.net.URLLoaderDataFormat;
	import flash.net.URLRequest;

	public class ParsersExample extends Sprite {

		private var scene:Object3D = new Object3D();

		private var camera:Camera3D;
		private var controller:SimpleObjectController;

		private var stage3D:Stage3D;

		public function ParsersExample() {
			stage.align = StageAlign.TOP_LEFT;
			stage.scaleMode = StageScaleMode.NO_SCALE;

			// Camera and view
			camera = new Camera3D(1, 1000);
			camera.view = new View(stage.stageWidth, stage.stageHeight, false, 0, 0, 4);
			addChild(camera.view);
			addChild(camera.diagram);

			// Initial position
			camera.rotationX = -130*Math.PI/180;
			camera.y = -30;
			camera.z = 35;
			controller = new SimpleObjectController(stage, camera, 50);
			scene.addChild(camera);

			stage3D = stage.stage3Ds[0];
			stage3D.addEventListener(Event.CONTEXT3D_CREATE, onContextCreate);
			stage3D.requestContext3D();
		}

		private function onContextCreate(e:Event):void {
			stage3D.removeEventListener(Event.CONTEXT3D_CREATE, onContextCreate);

			var loaderCollada:URLLoader = new URLLoader();
			loaderCollada.dataFormat = URLLoaderDataFormat.TEXT;
			loaderCollada.load(new URLRequest("parsersexample/test.DAE"));
			loaderCollada.addEventListener(Event.COMPLETE, onColladaLoad);

			stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
			stage.addEventListener(Event.RESIZE, onResize);
			onResize();
		}

		private function onColladaLoad(e:Event):void {

			var parser:ParserCollada = new ParserCollada();
			parser.parse(XML((e.target as URLLoader).data), "parsersexample/", true);
			trace(parser.objects);
			var mesh:Mesh = parser.getObjectByName("bmw7") as Mesh;
			mesh.x = 0;
			scene.addChild(mesh);

			uploadResources(mesh.getResources(false, Geometry));

			var textures:Vector.<ExternalTextureResource> = new Vector.<ExternalTextureResource>();
			for (var i:int = 0; i < mesh.numSurfaces; i++) {
				var surface:Surface = mesh.getSurface(i);
				var material:ParserMaterial = surface.material as ParserMaterial;
				if (material != null) {
					var diffuse:ExternalTextureResource = material.textures["diffuse"];
					if (diffuse != null) {
						textures.push(diffuse);
						surface.material = new TextureMaterial(diffuse);
					}
				}
			}

			// Loading of textures
			var texturesLoader:TexturesLoader = new TexturesLoader(stage3D.context3D);
			texturesLoader.loadResources(textures);

		}

		private function uploadResources(resources:Vector.<Resource>):void {
			for each (var resource:Resource in resources) {
				resource.upload(stage3D.context3D);
			}
		}

		private function onEnterFrame(e:Event):void {
			controller.update();
			camera.render(stage3D);
		}

		private function onResize(e:Event = null):void {
			camera.view.width = stage.stageWidth;
			camera.view.height = stage.stageHeight;
		}
	}
}

上のサンプルを実行すると下のような結果になります。

Alternativa3D 8 3DS Max 2012 plugin の入れ方

Alternativa3Dの3Dsmax2012のプラグインの登録方法のやり方です。

まずは準備、

環境

windows7 64bit / 3d studio max 2012

準備

ここからmax用のプラグインをダウンロード。

3dsmaxへの登録方法

ダウンロードして解凍フォルダの中には32bitと64bit用のフォルダがはいっているので自分の環境にあったものを選択します。

↓は解凍したフォルダの中身

上のファイルを3dsmaxのインストールされているディレクトリのstdplugsフォルダ

C:\Program Files\Autodesk\3ds Max 2012\stdplugs

に全部コピーします。(※pluginsディレクトリにいれるのが一般的みたいです。僕の環境ではこのディレクトリにいれるとmax起動時に自動的にプラグインをロードしてくれなかったのでstdplugsディレクトリにコピーしています。)

確認

コピーした後3dsmaxを起動すると使える状態になっています。

使えない場合は3ds maxのメインメニュー>Customize>Plugin Managerを選択して起動し、コピーしたプラグインが登録されているか確認できます。