package {
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.MouseEvent;
import flash.geom.Point;
import org.papervision3d.core.math.Matrix3D;
import org.papervision3d.lights.PointLight3D;
import org.papervision3d.materials.*;
import org.papervision3d.materials.shadematerials.GouraudMaterial;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.objects.primitives.*;
import org.papervision3d.view.BasicView;
public class LegoTest01 extends BasicView {
private var L:Number = 25 / 2
private var BOX_W:Number = 19 / 3 * 3
private var BOX_H:Number = 19 / 5 * 3
private var ANTLER_W:Number = 1.8 * 3
private var ANTLER_H:Number = 0.9 * 3
private var COLORS:Array = [
0xcc0000, // red
0x0066a7, // blue
0x006822, // green
0x02b535, // light green
0xfbe419] // yellow
private var legos:Array = []
public function LegoTest01() {
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.frameRate = 30;
// event
stage.addEventListener(MouseEvent.MOUSE_DOWN, mdown);
stage.addEventListener(MouseEvent.MOUSE_MOVE, mmove);
stage.addEventListener(MouseEvent.MOUSE_UP, mup);
init();
startRendering();
}
private function init():void{
var light:PointLight3D = new PointLight3D()
light.z = 0;
light.x = 800;
light.y = 800;
for (var i:Number = 0; i < COLORS.length; i++) {
var lego:Cube = createLego(light, COLORS[i])
lego.x = BOX_W * L * 1.5 * (i - 2)
scene.addChild(lego);
}
}
private function createLego(light:PointLight3D, color:Number):Cube {
var gm:GouraudMaterial =new GouraudMaterial(light, 0xFFFFFF, color)
var mlist:MaterialsList = new MaterialsList({all:new GouraudMaterial(light, 0xFFFFFF, color)});
var cubeTop:Cube =new Cube(mlist, BOX_W * L, BOX_W * L, 0.1 * L);
var i:Number
var cubeSide:Cube
for each (i in [1, -1]){
cubeSide =new Cube(mlist, 0.1 * L, BOX_W * L, BOX_H * L);
cubeSide.x = i * BOX_W * L / 2
cubeSide.y = -BOX_H * L / 2
cubeTop.addChild(cubeSide);
}
for each (i in [1, -1]){
cubeSide =new Cube(mlist, BOX_W * L, 0.1 * L, BOX_H * L);
cubeSide.z = i * BOX_W * L / 2
cubeSide.y = -BOX_H * L / 2
cubeTop.addChild(cubeSide);
}
for each (i in [1, -1]){
for each (var j:Number in [1, -1]){
var cylinder:Cylinder =new Cylinder(gm, ANTLER_W * L / 2, ANTLER_H * L);
cylinder.x = i * (BOX_W) * L / 4
cylinder.z = j * (BOX_W) * L / 4
cylinder.y = ANTLER_H * L / 2
cubeTop.addChild(cylinder)
}
}
return cubeTop
}
private var mousePos :Point = null;
private var cameraPos :Point = null;
private var _cameraRotX :Number = 0;
private var _cameraRotY :Number = 0;
private function set cameraRotX(_rot:Number):void{
if(-89>_rot&&_rot<89){
_cameraRotX = _rot;
}else if(-89>=_rot){
_cameraRotX = -89;
}else{
_cameraRotX = 89;
}
}
private function set cameraRotY(_rot:Number):void{
_cameraRotY = _rot;
}
private function updateCameraPos():void{
var v:Matrix3D = new Matrix3D([0,0,-1000,1,0,0,0,0,0,0,0,0]);
var vrx:Matrix3D = Matrix3D.rotationX(_cameraRotX/180*Math.PI);
var vry:Matrix3D = Matrix3D.rotationY(_cameraRotY/180*Math.PI);
var va0:Matrix3D = Matrix3D.multiply(v,vrx);
var va1:Matrix3D = Matrix3D.multiply(va0,vry);
camera.x = va1.n11;
camera.y = va1.n12;
camera.z = va1.n13;
}
private function mdown(evt:MouseEvent):void{
mousePos = new Point(stage.mouseX,stage.mouseY);
}
private function mmove(evt:MouseEvent):void{
if(mousePos){
var vx :Number = (stage.mouseX - mousePos.x)/2;
var vy :Number = (stage.mouseY - mousePos.y)/2;
cameraRotX = _cameraRotX - vy;
cameraRotY = _cameraRotY + vx;
updateCameraPos();
mousePos = new Point(stage.mouseX,stage.mouseY);
}
}
private function mup(evt:MouseEvent):void{
mousePos = null;
}
}
}