package { import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageDisplayState; import flash.display.StageScaleMode; import flash.events.Event; import flash.events.MouseEvent; import flash.text.TextField; import flash.text.TextFieldAutoSize; import flash.text.TextFormat; import org.papervision3d.cameras.DebugCamera3D; import org.papervision3d.materials.WireframeMaterial; import org.papervision3d.materials.utils.MaterialsList; import org.papervision3d.objects.primitives.Cube; import org.papervision3d.render.BasicRenderEngine; import org.papervision3d.scenes.Scene3D; import org.papervision3d.view.Viewport3D; [SWF(frameRate="31", backgroundColor="0xffffff")] public class DebugCamera3DTest extends Sprite { private var viewport:Viewport3D; private var renderer:BasicRenderEngine; private var scene:Scene3D; private var camera:DebugCamera3D; private var fsbot:TextField; private var text:TextField; private var fullscreen:Boolean = false; public function DebugCamera3DTest() { stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; Init3D(); CreateFullScreenControl(); CreateCameraControlText(); stage.addEventListener(Event.RESIZE, ControlResize); ControlResize(); } private function CreateFullScreenControl():void { fsbot = new TextField; fsbot.text = "FullSreen"; fsbot.textColor = 0xffffff; fsbot.selectable = false; fsbot.background = true; fsbot.backgroundColor = 0x000000; fsbot.autoSize = TextFieldAutoSize.RIGHT; var format:TextFormat = new TextFormat("_sans", 9); fsbot.setTextFormat(format); fsbot.addEventListener(MouseEvent.CLICK, ShowFullScreen); addChild(fsbot); } private function CreateCameraControlText():void { var html:String = "

Presiona y arrastra el ratón.
Las teclas para controlar
la cámara son las siguientes:

"; html += "w = forward
"; html += "s = backward
"; html += "a = left
"; html += "d = right
"; html += "q = rotationZ--
"; html += "e = rotationZ++
"; html += "r = fov++
"; html += "f = fov--
"; html += "t = near++
"; html += "g = near--
"; html += "y = far++
"; html += "h = far--
"; text = new TextField; text.alpha = .5; text.multiline = true; text.htmlText = html; text.textColor = 0xffffff; text.selectable = false; text.background = true; text.backgroundColor = 0x000000; text.autoSize = TextFieldAutoSize.LEFT; text.width = 120; var format:TextFormat = new TextFormat("_sans", 9); text.setTextFormat(format); addChild(text); } private function ControlResize(e:Event = null):void { fsbot.y = 0; fsbot.x = stage.stageWidth - fsbot.width; text.y = stage.stageHeight - text.height; text.x = stage.stageWidth - text.width; } private function ShowFullScreen(e:Event):void { if(fullscreen) { stage.displayState = StageDisplayState.NORMAL; fullscreen = false; }else { stage.displayState = StageDisplayState.FULL_SCREEN; fullscreen = true; } } private function Init3D():void { viewport = new Viewport3D(500, 350, true, true); addChild(viewport); renderer = new BasicRenderEngine; scene = new Scene3D; camera = new DebugCamera3D(viewport, 90, 10, 10000); camera.propsDisplay.alpha = 0.5; // evita que los objetos de la escena desaparezcan al salirse del la vista frustum //camera.useFrustumCulling = false; CreateObjects(); addEventListener(Event.ENTER_FRAME, Loop3D); } private function CreateObjects():void { var mat:WireframeMaterial = new WireframeMaterial; mat.doubleSided = true; var materialList:MaterialsList = new MaterialsList; materialList.addMaterial(mat, "all"); // coloca varios cubos repartidos aleatoreamente por la escena for( var i:int = 0; i < 20; i++) { var cube:Cube = new Cube(materialList, 500, 500, 500, 2, 2, 2); cube.x = Float(-6000, 6000); cube.y = Float(-6000, 6000); cube.z = Float(500, 5000); scene.addChild(cube); } } private function Loop3D(event:Event):void { renderer.renderScene(scene, camera, viewport); } private function Float(min:Number,max:Number=NaN):Number { if (isNaN(max)) { max = min; min=0; } return Random()*(max-min)+min; } private function Random():Number { return Math.random(); } } }