Alternativa3Dをやってみた。


前々から少し興味があったので手を出してみました。

デモ

キーボードとマウスでカメラを制御できます。
W:前
S:後
A:左
D:右
Space:上
Z:下
↑:上回転
↓:下回転
→:右回転
←:左回転
Shiftを押しながら他のキーを押す:加速
Wheel:拡大、縮小
Mouseでドラッグしたまま動かす:回転



今回やってみて便利だと思った点は、CameraControllerです。
これを使用すると、カメラのキーボード、マウスからの制御が自動で設定されます。
さらにカメラとその他のオブジェクトとの衝突判定を計算してくれるところ。上のデモを動かしてもらえると分かりますが、カメラはCubeなどのオブジェクトを通り抜けられないようになっています。


今回のソース

package {
	import alternativa.engine3d.controllers.CameraController;
	import alternativa.engine3d.core.Camera3D;
	import alternativa.engine3d.core.Object3D;
	import alternativa.engine3d.core.Scene3D;
	import alternativa.engine3d.display.View;
	import alternativa.engine3d.materials.DevMaterial;
	import alternativa.engine3d.materials.FillMaterial;
	import alternativa.engine3d.materials.WireMaterial;
	import alternativa.engine3d.primitives.Box;
	import alternativa.engine3d.primitives.Cone;
	import alternativa.engine3d.primitives.Sphere;
	import alternativa.types.Point3D;
	import alternativa.utils.FPS;
	
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;

	[SWF(backgroundColor="#000000", frameRate="100")]

	public class Alternativa3d_sample01 extends Sprite	{
		
		private var scene:Scene3D;
		private var view:View;
		private var camera:Camera3D;
		private var cameraController:CameraController;
		private var box:Box;
		private var sphere:Sphere;
		private var cone:Cone;
		
		public function Alternativa3d_sample01(){
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.align = StageAlign.TOP_LEFT;
			
			//Sceneの作成
			scene = new Scene3D();
			//Object3Dを生成しておき、ここに色々つっこんでいく。
			scene.root = new Object3D();
			//Cubeの生成
			box = new Box(100, 100, 100, 3, 3, 3);
			//Cubeの材質を決めている。
			box.cloneMaterialToAllSurfaces(new DevMaterial());
			box.x = 200;
			//CubeをSceneに追加
			scene.root.addChild(box);
			
			//Sphereの生成
			sphere = new Sphere(100, 10, 10);
			sphere.cloneMaterialToAllSurfaces(new WireMaterial(1, 0xFFFFFF));
			sphere.x = -200;
			scene.root.addChild(sphere);
			
			//Coneの生成
			cone = new Cone(100, 100, 0);
			cone.cloneMaterialToAllSurfaces(new FillMaterial(0xff0000));
			cone.x = 0;
			scene.root.addChild(cone);
			
			//カメラの生成
			camera = new Camera3D();
			camera.x = 100;
			camera.y = -150;
			camera.z = 100;
			//カメラをSceneに追加
			scene.root.addChild(camera);
			
			//Viewの生成
			view = new View();
			addChild(view);
			//カメラをViewを対応させる。
			view.camera = camera;

			// カメラコントローラの作成。
			cameraController = new CameraController(stage);
			cameraController.camera = camera;
			//カメラをコントロールするキーをデフォルト設定する。
			/*
			W:前
			S:後
			A:左
			D:右
			Space:上
			Z:下
			↑:上回転
			↓:下回転
			→:右回転
			←:左回転
			Shiftを押しながら他のキーを押す:加速
			Wheel:拡大、縮小
			Mouseでドラッグしたまま動かす:回転
			*/
			cameraController.setDefaultBindings();
			//カメラの衝突判定を有効にする。
			cameraController.checkCollisions = true;
			//カメラの衝突判定の有効半径。要はカメラの物理的な大きさ?
			cameraController.collisionRadius = 20;
			//カメラの照準の設定。中心。
			cameraController.lookAt(new Point3D());
			//キー操作を有効にする。
			cameraController.controlsEnabled = true;

			//パフォーマンスを表示する。
			FPS.init(stage);

			stage.addEventListener(Event.RESIZE, onResize);
			stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
			onResize(null);
		}
		
		private function onResize(e:Event):void {
			view.width = stage.stageWidth;
			view.height = stage.stageHeight;
		}
		
		private function onEnterFrame(e:Event):void {
			//カメラの動きをさせるキーの入力を受け付ける。
			cameraController.processInput();
			//レンダリング
			scene.calculate();
		}
	}
}