flash on 2010-8-21

by mtok
...
@author Motoki Matsumoto
♥0 | Line 194 | Modified 2010-08-21 14:43:05 | MIT License
play

ActionScript3 source code

/**
 * Copyright mtok ( http://wonderfl.net/user/mtok )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/swCG
 */

package  
{
    import away3dlite.cameras.Camera3D;
    import away3dlite.containers.ObjectContainer3D;
    import away3dlite.containers.Scene3D;
    import away3dlite.containers.View3D;
    import away3dlite.core.base.Object3D;
    import away3dlite.materials.ColorMaterial;
    import away3dlite.materials.Material;
    import away3dlite.materials.WireColorMaterial;
    import away3dlite.primitives.Sphere;
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.geom.Matrix3D;
    import flash.geom.Vector3D;
    /**
     * ...
     * @author Motoki Matsumoto
     */
    public class Away3DSample001 extends Sprite
    {
        private var _view:View3D;
        private var _camera:Camera3D;
        private var cameraDrawing:CameraDrawing;
        
        public function Away3DSample001() 
        {
            if (stage) {
                init();
            }else {
                addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
            }
        }
        
        private function addedToStageHandler(e:Event):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
            init();
        }
        
        private function init():void
        {
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP_LEFT;
            
            _camera = new Camera3D(10,200);
            //camera.lookAt( new Number(0, 0, 0));
            _view = new View3D(null, _camera);
            _view.x = stage.stageWidth * 0.5;
            _view.y = stage.stageHeight * 0.5;
            addChild(_view);
            _camera.lookAt( new Vector3D(0, 0, 0));
            
            _buildScene(_view.scene);
            
            addCameraDrawing();
            
            addEventListener(Event.ENTER_FRAME, enterFrameHandler);
        }
        
        private function addCameraDrawing():void
        {
            cameraDrawing = new CameraDrawing();
            addChild(cameraDrawing);
        }
        
        private function _buildScene(scene:Scene3D):void
        {
            //var light:DirectionalLight3D = new DirectionalLight3D();
            //scene.addLight(light);
            
            var container:ObjectContainer3D = new ObjectContainer3D();
            container.name = "objects";
            container.x = 0;
            container.y = 0;
            container.z = 3000;
            
            var mat:WireColorMaterial = new WireColorMaterial(0xff0000, 1, 0x000000, 1);
            var sphere:Sphere = new Sphere( mat, 500, 15, 9);
            
            sphere.x = 0;
            sphere.y = 0;
            sphere.z = 0;
            
            container.addChild(sphere);
            
            var i:int;
            for (i = 0; i < 50; i++) {
                container.addChild( getRandomSphere(800, 1400, 50));
            }            
            
            scene.addChild(container);
        }
        private function  getRandomSphere(distMin:Number, distMax:Number, size:Number):Object3D 
        {
            var color:uint = Math.random() * 255 * 255 * 255;
            var cMat:Material = new ColorMaterial(color, 1);
            
            var r:Number = (distMax - distMin) * Math.random() + distMin;
            var pos:Vector3D = new Vector3D(r, 0, 0);
            var mat:Matrix3D = new Matrix3D();
            mat.appendRotation(Math.random() * 360, Vector3D.Z_AXIS);
            mat.appendRotation(Math.random() * 360, Vector3D.Y_AXIS);
            //mat.appendRotation(Math.random() * 360, Vector3D.X_AXIS);
            pos = mat.transformVector(pos);
            var sphere:Sphere = new Sphere(cMat, size, 3, 3);
            sphere.x = pos.x;
            sphere.y = pos.y;
            sphere.z = pos.z;
            
            return sphere;
        }
        private function enterFrameHandler(e:Event):void 
        {
            _camera.zoom  = (stage.mouseY / stage.stageHeight) * 4 + 0.5;
            _camera.focus = (stage.mouseX / stage.stageWidth) * 600;
            
            
            var obj3d:Object3D = _view.scene.getChildByName('objects') as Object3D;
            obj3d.rotationY += 1;
            
            cameraDrawing.update(_view);
            
            _view.render();
        }
    }

}

import away3dlite.cameras.Camera3D;
import away3dlite.containers.ObjectContainer3D;
import away3dlite.containers.View3D;
import away3dlite.materials.ColorMaterial;
import away3dlite.primitives.Sphere;
import flash.display.Graphics;
import flash.display.Sprite;
import flash.geom.Matrix;
import flash.geom.Vector3D;
import flash.text.TextField;
import flash.text.TextFormat;

class CameraDrawing extends Sprite {
    private var label:TextField;
    private var label2:TextField;
    private var draw:Sprite;
    private var _scale:Number = 1 / 30;
    public function CameraDrawing() 
    {
        var pan:Sprite = new Sprite();
        pan.graphics.beginFill(0xffffff);
        pan.graphics.drawRect(0, 0, 100, 190);
        pan.graphics.endFill();
        addChild(pan);
        
        var txtFormat:TextFormat = new TextFormat("_sans", 10);

        label = new TextField();
        label.defaultTextFormat = txtFormat;
        label.x = 0;
        label.y = 0;
        label.text = "As Seen from above";
        addChild(label);
        
        label2 = new TextField();
        label2.defaultTextFormat = txtFormat;
        label2.x = 0;
        label2.y = 170;
        label2.text = "Zoom: Focus:";
        addChild(label2);
        
        draw = new Sprite();
        
        var mat:Matrix = new Matrix();
        mat.scale(1, -1);
        mat.translate(50, 160);
        draw.transform.matrix = mat;
        addChild(draw);
        
    }
    
    public function  update( view:View3D):void 
    {
        var g:Graphics = draw.graphics;
        g.clear();
        g.lineStyle(1, 0x000000);
        drawCamera(g, view.camera);
        drawCameraFrustrum(g, view.camera);
        drawObjects(g, view);
        
        label2.text = "Zoom " + Math.floor(view.camera.zoom * 10)/10 + "Forcus " + Math.floor( view.camera.focus * 10)/10;
    }
    
    private function drawCamera(g:Graphics, camera:Camera3D):void 
    {
        g.lineStyle(1, 0x000000);
        g.drawCircle(camera.x, camera.y, 3);
        
        g.moveTo(camera.x+10, camera.y);
        g.lineTo(camera.x-10, camera.y);
        
        g.moveTo(camera.x, camera.y + 10);
        g.lineTo(camera.x, camera.y - 10);
    }
    
    private function  drawCameraFrustrum(g:Graphics, camera:Camera3D):void 
    {
        var f:Number = camera.focus;
        var z:Number = camera.zoom;
        
        var hw:Number = stage.stageWidth * 0.5;
        var w:Number = 50 / _scale;
        var z0:Number = camera.z - f;
        var z1:Number = 5000;
        g.lineStyle(1, 0x000000);
        g.moveTo(  camera.x  * _scale, z0 * _scale);
        g.lineTo(  hw/f * z1 * _scale, z1 * _scale);
        g.moveTo(  camera.x  * _scale, z0 * _scale);
        g.lineTo( -hw/f * z1 * _scale, z1 * _scale);
    }
    
    private function  drawObjects(g:Graphics, view:View3D):void 
    {
        var objects:ObjectContainer3D = view.scene.getChildByName("objects") as ObjectContainer3D;
        var i:int;
        var pos:Vector3D = new Vector3D();
        
        for (i = 0; i < objects.children.length; i++) {
            var o:Sphere = objects.children[i] as Sphere;
            pos.x = o.x;
            pos.y = o.y;
            pos.z = o.z;
            pos = o.sceneMatrix3D.transformVector(pos);
            var cm:ColorMaterial = o.material as ColorMaterial;
            g.beginFill(cm.color);
            g.drawCircle(pos.x*_scale, pos.z*_scale, o.radius * _scale);
            g.endFill();
        }
    }
}