/**
* 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();
}
}
}