習作:3Dレゴ
バグレゴASの3D化をにらんで、3Dでレゴを表示するところまで作ってみました。
【使ったツール】
・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;
}
}
}
