PV3D2.0之後的版本
把TargetCamera和FreeCamera整合在一起了
也就是只有一個Camera3D類別
那怎麼切換呢?
var camera:Camera3D = new Camera3D();
camera物件有個target屬性, 指的就是camera的鏡頭要看著誰。
當設定成camera.target = new DisplayObject();
鏡頭就會看著新建立的3D物件座標,就會一直看著0,0,0座標。
就是TargetCamera。
要切換成FreeCamera的話, 就把target屬性設成null即加。
程式碼:
把TargetCamera和FreeCamera整合在一起了
也就是只有一個Camera3D類別
那怎麼切換呢?
var camera:Camera3D = new Camera3D();
camera物件有個target屬性, 指的就是camera的鏡頭要看著誰。
當設定成camera.target = new DisplayObject();
鏡頭就會看著新建立的3D物件座標,就會一直看著0,0,0座標。
就是TargetCamera。
要切換成FreeCamera的話, 就把target屬性設成null即加。
程式碼:
package{ import flash.display.MovieClip; import flash.display.Sprite; import flash.events.MouseEvent; import flash.utils.getTimer; import milkmidi.papervision3d.Trident3D; import org.papervision3d.materials.ColorMaterial; import org.papervision3d.objects.DisplayObject3D; import org.papervision3d.objects.primitives.Plane; //匯入MovieClip類別。 import flash.events.Event; //匯入事件類別。 import org.papervision3d.view.BasicView; //匯入BasicView類別。 public class ToggleCameraType extends Sprite { //A01_BasicDocument類別, 繼承MovieClip。 private var view:BasicView; //宣告view變數為BasicView物件。 private var isTargetCamera:Boolean = true; private var btn:TestButton; public function ToggleCameraType():void{ //建構函式, 該類別被實體化時, 會執行一次。 //可以把要初始化的值或物件寫在這。 init3DEngine(); //執行initPV3DEngine函式。 init3DObject(); //執行initPV3DObject函式。 initObject(); } private function init3DEngine():void{ //此函式的用意,是用來建立PV3D所需的基本物件類別。 //在此建構BasicView物件、設定Camera參數。 view = new BasicView(0, 0, true, true, "Target"); view.camera.y = 300; //建構BasicView物件 //參數值( //viewport寬度, viewport高度, 是否自動對齊場景中間 //, 是否開啟滑鼠感應功能,camera類別) //viewport寬度和viewport高度設定為0的話, //表示寬高是跟著整個場景的大小。 //PV3D的Camera有二種類型: //Target:目標Camera,不論鏡頭怎麼移動,永遠看著目標點。 //Free :自由Camera,可以任意的移動和旋轉鏡頭。 this.addChild(view); //BasicView是繼承Sprite物件,可被加入至顯示物件容器裡。 this.addEventListener(Event.ENTER_FRAME, onEventRender3D); //偵聽ENTER_FRAME事件。 } private function init3DObject():void{ //init3DObject函式, 用來建立PV3D物件、材質及偵聽事件。 var colorMat:ColorMaterial = new ColorMaterial(0x223344); for (var i:int = 0; i < 5; i++) { var plane:Plane = new Plane(colorMat, 200, 200); plane.x = (i - 2) * 250; view.scene.addChild(plane); } view.scene.addChild( new Trident3D(1300, true, false)); //筆者所撰寫的Trident3D。 //讓PV3D出現3D的座標系。 //new Trident3D(線段長度:uint, 是否出現座標字母:Boolean, 是否出現交叉平面:Boolean); } private function initObject():void { btn = new TestButton("Toggle"); btn.addEventListener(MouseEvent.CLICK, onBtnClick); this.addChild(btn); } private function onBtnClick(e:MouseEvent):void { isTargetCamera = !isTargetCamera; if (isTargetCamera) { view.camera.target = new DisplayObject3D(); //透過camera物件的target屬性。 btn.label = "Current CameraType:Target"; }else { view.camera.target = null; btn.label = "Current CameraType:Free"; } trace("isTargetCamera:" + isTargetCamera); } private function onEventRender3D(e:Event):void { view.camera.x = Math.sin(getTimer() / 1000) * 500; //讓camera來回移動。 //範圍是-500到500。 view.singleRender(); //運算view物件。 //使用算圖類別,運算Camera所看到的Scene3D世界 //並將結果呈顯在view裡。 } } } ////建立一個鈕按。 import flash.display.Sprite import flash.text.TextField; internal class TestButton extends Sprite { private var _txt:TextField; public function TestButton(p_label:String) { _txt = new TextField(); _txt.text = p_label; _txt.width = 200; this.addChild(_txt); this.buttonMode = true; this.mouseChildren = false; this.graphics.beginFill(0xffddee); this.graphics.drawRect(0, 0, 150, 20); this.graphics.endFill(); } public function set label(p_label:String):void { _txt.text = p_label; } }SourceCodeDownload
留言
我為什麼出現這三個錯誤呀??
都找不到問題...
1180: 呼叫可能未定義的方法 Trident3D。
1136: 引數個數錯誤。需要 0 個。
1172: 找不到定義 milkmidi.papervision3d:Trident3D。
還有關於這幾斷成釋法我有點看不懂能否請你解釋一下...
我有看到您的away3d的示範
我最近也在自學away3d
有個問題想要請教你
請問away3d裡也可以及時切換camera的屬性嗎
我現在找的方法只有
把整個view移除掉再從新建立
可是這樣的話每次就會從新算圖鏡頭
會回到原本的位置
就不能鏡頭移到哪裡及時切換camera屬性了
如果您知道的話想像你討教討教
感恩