天天看點

Alternativa3D學習筆記之HelloWorld

A3D的基本元素有3D舞台Stage3D,3D錄影機Camera3D,錄影機的視圖View,3D顯示對象Object3D和材質Material。另外,程式中所有的顯示對象必須加到一個根容器rootContainer上,其本質上是一個Object3D。要想讓場景響應滑鼠和鍵盤事件,以控制錄影機,我們可以聲明一個簡單控制器SimpleObjectContainer,當然這個控制器并不好用,我們可以在以後自己建立一個控制器。

A3D基本架構:

1、設定舞台的縮放模式、幀率、對齊方式等,不是必須,但隻有設定了舞台的縮放模式舞台才能正确響應大小改變事件。

2、初始化根容器。

3、初始化錄影機和錄影機視圖,把視圖加到顯示清單,把錄影機加到根容器。

4、為錄影機初建立一個控制器,不是必須。

5、初始化舞台。

6、context3D預設定。

7、初始化Context3D事件,加載資源,注冊幀事件。

8、在幀事件裡渲染3D舞台,如果要響應滑鼠或鍵盤事件,重新整理控制器。

下面是A3D的HelloWorld程式:

public class HelloBasic extends Sprite
	{
		//舞台
		private var stage3D:Stage3D;
		//錄影機
		private var camera3D:Camera3D;
		//顯示對象根結點
		private var rootContainer:Object3D;
		//錄影機控制器
		private var controller:SimpleObjectController;
		//3D顯示對象
		private var box:Object3D;
		
		public function HelloBasic()
		{
			//(1)舞台屬性
			this.stage.frameRate=60;
			this.stage.scaleMode=StageScaleMode.NO_BORDER;
			this.stage.align=StageAlign.TOP_LEFT;
			
			//(2)初始化根顯示對象
			this.rootContainer=new Object3D();
			
			//(3)初始化錄影機
			this.camera3D=new Camera3D(1,10000);
			this.camera3D.x=-150;
			this.camera3D.y=100;
			this.camera3D.z=-50;
			this.camera3D.view=new View(this.stage.stageWidth,this.stage.stageHeight,false,0x000000,0.1,4);
			//錄影機視圖必須加到顯示清單
			this.addChild(this.camera3D.view);		
			//将錄影機添加到根結點
			this.rootContainer.addChild(this.camera3D);
			
			//(4)初始化錄影機控制器
			this.controller=new SimpleObjectController(stage,camera3D,100,1,0.1);
			controller.lookAtXYZ(0,0,0);
			
			//初始化一個方盒
			var box:Box=new Box();
			box.setMaterialToAllSurfaces(new FillMaterial(0x804080));
			rootContainer.addChild(box);
			
			//(5)初始化3D舞台
			this.stage3D=this.stage.stage3Ds[0];
			//(6)context3D預設定
			this.stage3D.addEventListener(Event.CONTEXT3D_CREATE,initContext3D);
			this.stage3D.requestContext3D();
		}
		
		//(7)初始化Context3D事件
		private function initContext3D(event:Event):void {
			//加載資源
			for each(var resource:Resource in rootContainer.getResources(true)){
				resource.upload(stage3D.context3D);
			}
			//添加幀事件
			this.addEventListener(Event.ENTER_FRAME,enterFrameHandler);
		}
		
		private function enterFrameHandler(event:Event):void {
			camera3D.render(stage3D);
			//為了監聽滑鼠和鍵盤事件,實時更新控制器
			controller.update();
		}
	}