« 習作:バグレゴAS | メイン | 今週のふりかえり(2008/5/12-2008/5/16) »

習作:3Dレゴ

バグレゴASの3D化をにらんで、3Dでレゴを表示するところまで作ってみました。

lego3d.png
(クリックすると表示されます)

【使ったツール】
Papervision3D 2.0 GreatWhite

【参考にしたページ】
[Papervision3D]プリミティブなオブジェクトを並べてみる - l4l

【ソース】

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;
}
}
}



トラックバック

このエントリーのトラックバックURL:
http://trichord.change-vision.com/blog/mt-tb.cgi/210

コメントを投稿