【途中】積み上げられた鉛筆立て

by soh1106c
【元ネタ】積み上げられた鉛筆立て | Flickr - Photo Sharing! 
http://www.flickr.com/photos/14757897@N00/5281926349/
♥0 | Line 211 | Modified 2010-12-21 22:07:02 | MIT License
play

ActionScript3 source code

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

package {
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.geom.Vector3D;
    import flash.display.*;

    import jiglib.geometry.*;
    import jiglib.math.*;
    import jiglib.physics.*;
    import jiglib.physics.constraint.*;
    import jiglib.plugin.papervision3d.*;

    import org.papervision3d.cameras.CameraType;
    import org.papervision3d.core.geom.renderables.Vertex3D;
    import org.papervision3d.core.math.Number3D;
    import org.papervision3d.core.math.Plane3D;
    import org.papervision3d.core.utils.Mouse3D;
    import org.papervision3d.events.*;
    import org.papervision3d.lights.PointLight3D;
    import org.papervision3d.materials.shadematerials.*;
    import org.papervision3d.materials.utils.MaterialsList;
    import org.papervision3d.materials.*;
    import org.papervision3d.objects.DisplayObject3D;
    import org.papervision3d.objects.primitives.*;
    import org.papervision3d.view.BasicView;
    import org.papervision3d.view.layer.ViewportLayer;
    import org.papervision3d.view.layer.util.ViewportLayerSortMode;
    import org.papervision3d.objects.parsers.*;

    [SWF(width="800",height="600",backgroundColor="#ffffff",frameRate="60")]
    public class penholder extends BasicView {  
        
        private var mylight:PointLight3D;
        private var mouse3D:Mouse3D;
        private var wireframeMateria:WireframeMaterial;
        private var shadeMateria:GouraudMaterial;
        private var onDraging:Boolean=false;
        private var currDragBody:RigidBody;
        private var dragConstraint:JConstraintWorldPoint;
        private var startMousePos:Vector3D;
        private var planeToDragOn:Plane3D;
        private var physics:Papervision3DPhysics;

        private var staplerSkin:DAE;
        private var staplerBox:RigidBody;
        private var pencilSkin:DAE;
        private var pencilBox:RigidBody;
        private var ground1:RigidBody;
        private var ground2:RigidBody;
        private var ground3:RigidBody;
        private var ground4:RigidBody;
        private var ground5:RigidBody;
        
        private var boxBody1:Vector.<RigidBody>;
        private var boxBody2:Vector.<RigidBody>;
        private var boxBody3:Vector.<RigidBody>;

        public function penholder() {
            
            super(800, 600, true, true, CameraType.TARGET);

            stage.addEventListener(MouseEvent.MOUSE_UP, handleMouseRelease);
            stage.addEventListener(MouseEvent.MOUSE_MOVE, handleMouseMove);

            init3D();
        }
        
        private function init3D():void {
            
            var cameraTarget:DisplayObject3D=new DisplayObject3D();
            cameraTarget.x=0;
            cameraTarget.y=1100;
            cameraTarget.z=0;
            camera.target=cameraTarget;
            
            physics=new Papervision3DPhysics(scene,8);

            Mouse3D.enabled=true;
            mouse3D=viewport.interactiveSceneManager.mouse3D;
            viewport.containerSprite.sortMode = ViewportLayerSortMode.INDEX_SORT;

            mylight=new PointLight3D(true,true);
            mylight.y=0;
            mylight.z=-600;
            
            var vplObjects:ViewportLayer = new ViewportLayer(viewport,null);
            vplObjects.layerIndex = 2;
            vplObjects.sortMode = ViewportLayerSortMode.Z_SORT;
            viewport.containerSprite.addLayer(vplObjects);
            
            wireframeMateria=new  WireframeMaterial(0xff0000,0);
            wireframeMateria.interactive=true;
            var materiaList = new MaterialsList();
            materiaList.addMaterial(wireframeMateria,"all");
            
            shadeMateria=new GouraudMaterial(mylight,0xeeee00);
            shadeMateria.interactive=true;
            var materiaList2 = new MaterialsList();
            materiaList2.addMaterial(shadeMateria,"all");

//Penholder

    var penholder:DAE=new DAE;
    penholder.load("http://soh1106.lolipop.jp/res/bungu/penholder.DAE");
    penholder.scale=6.5;
    scene.addChild(penholder);

//create Stapler
            
            boxBody1=new Vector.<RigidBody>();
            for (var i:int = 0; i <2; i++) {
                staplerSkin=new DAE;
                staplerSkin.load("http://soh1106.lolipop.jp/res/bungu/stapler.DAE");
                staplerSkin.scale=2*2.5;
                scene.addChild(staplerSkin);

                var staplerBox=new JBox(new Pv3dMesh(staplerSkin),140*2.5,140*2.5,500*2.5);
                staplerBox.rotationX=-40;
                
                physics.addBody(staplerBox);
                boxBody1[i]=staplerBox;
                boxBody1[i].moveTo(new Vector3D( 0, 6000*2.5+(i*500*2.5) , 0));
                vplObjects.addDisplayObject3D(physics.getMesh(boxBody1[i]));
            }
                
//create Pencil
            
            boxBody3=new Vector.<RigidBody>();
            for (i = 0; i <30; i++) {
                pencilSkin=new DAE;
                pencilSkin.load("http://soh1106.lolipop.jp/res/bungu/pencil.DAE");
                pencilSkin.scale=5*1.4;
                scene.addChild(pencilSkin);

                var pencilBox=new JBox(new Pv3dMesh(pencilSkin),100*1.4,100*1.4,1200*1.4);
                pencilBox.rotationX=0;
                
                physics.addBody(pencilBox);
                boxBody3[i]=pencilBox;
                boxBody3[i].moveTo(new Vector3D( 0, 4000+(i*1600*1.4) , 0));
                vplObjects.addDisplayObject3D(physics.getMesh(boxBody3[i]));
            }

//create Cube(for Drag)

           boxBody2=new Vector.<RigidBody>();
            for (i= 0; i < 0; i++) {
                boxBody2[i]=physics.createCube(materiaList2,100,100,1600);
                physics.getMesh(boxBody2[i]).addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, handleMousePress);
                boxBody2[i].moveTo(new Vector3D(0,1000, 0));
            }
            
//create Ground(for Penholder)
            
            ground1= physics.createCube(materiaList, 800, 800, 100);
            ground1.y = 250;
            ground1.movable = false;
            
            ground2 = physics.createCube(materiaList,800, 100, 1300);
            ground2.y = 780;
            ground2.z = -400;
            ground2.movable = false;
            
            ground3 = physics.createCube(materiaList,800, 100, 1300);
            ground3.y = 780;
            ground3.z = 400;
            ground3.movable = false;
            
            ground4 = physics.createCube(materiaList,800, 100, 1300);
            ground4.y = 780;
            ground4.x = -400;
            ground4.rotationY=90;
            ground4.movable = false;
            
            ground5 = physics.createCube(materiaList,800, 100, 1300);
            ground5.y = 780;
            ground5.x = 400;
            ground5.rotationY=90;
            ground5.movable = false;

            camera.y=mylight.y;
            camera.z=mylight.z;

            startRendering();
            
        }
        
//Drag

        private function findSkinBody(skin:DisplayObject3D):int {
            for (var i:String in PhysicsSystem.getInstance().bodies) {
                if (skin==physics.getMesh(PhysicsSystem.getInstance().bodies[i])) {
                    return int(i);
                }
            }
            return -1;
        }

        private function handleMousePress(event:InteractiveScene3DEvent):void {
            onDraging=true;
            startMousePos=new Vector3D(mouse3D.x,mouse3D.y,mouse3D.z);
            currDragBody=PhysicsSystem.getInstance().bodies[findSkinBody(event.displayObject3D)];
            planeToDragOn=new Plane3D(new Number3D(0,0,-1),new Number3D(0,0,- startMousePos.z));

            var bodyPoint:Vector3D=startMousePos.subtract(currDragBody.currentState.position);
            dragConstraint=new JConstraintWorldPoint(currDragBody,bodyPoint,startMousePos);
            PhysicsSystem.getInstance().addConstraint(dragConstraint);
        }

        private function handleMouseMove(event:MouseEvent):void {
            if (onDraging) {
                var ray:Number3D=camera.unproject(viewport.containerSprite.mouseX,viewport.containerSprite.mouseY);
                ray=Number3D.add(ray,new Number3D(camera.x,camera.y,camera.z));

                var cameraVertex3D:Vertex3D=new Vertex3D(camera.x,camera.y,camera.z);
                var rayVertex3D:Vertex3D=new Vertex3D(ray.x,ray.y,ray.z);
                var intersectPoint:Vertex3D=planeToDragOn.getIntersectionLine(cameraVertex3D,rayVertex3D);

                dragConstraint.worldPosition=new Vector3D(intersectPoint.x,intersectPoint.y,intersectPoint.z);
            }
        }

        private function handleMouseRelease(event:MouseEvent):void {
            if (onDraging) {
                onDraging=false;
                PhysicsSystem.getInstance().removeConstraint(dragConstraint);
                currDragBody.setActive();
            }
        }
        
//Reset        
        
        private function resetBox():void
        {            
            for (var i:int = 0; i < boxBody1.length;i++ )
            {
                if (boxBody1[i].currentState.position.y < 0)
                {
                    boxBody1[i].moveTo(new Vector3D(0, 6000*2.5+(i*500*2.5), 0));
                }
            }
            
            for (i = 0; i < boxBody2.length;i++ )
            {
                if (boxBody2[i].currentState.position.y < -1000)
                {
                    boxBody2[i].moveTo(new Vector3D(0, 1000+(i*100), 0));
                }
            }
            
            for (i = 0; i < boxBody3.length;i++ )
            {
                if (boxBody3[i].currentState.position.y < -1000)
                {
                    boxBody3[i].moveTo(new Vector3D(0, 4000+(i*1200*1.4*0.3), 0));
                }
            }
            
        }
        
//Rendering

        protected override function onRenderTick(event:Event = null):void {
            
            var rot:Number=(mouseX/stage.stageWidth)*720;
            camera.x=3000*Math.sin(rot*Math.PI/180);
            camera.z=3000*Math.cos(rot*Math.PI/180);
            camera.y=6000*(mouseY/stage.stageHeight);
            
//            physics.step();//dynamic timeStep
            physics.engine.integrate(0.5);//static timeStep
            resetBox();
            super.onRenderTick(event);
        }
    }
}