In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

【途中】数珠つなぎの車

先頭の半透明の青い玉をつかんで引っ張れます。

【元ネタ】YouTube - traffic jam 
http://www.youtube.com/watch?v=3wU7_19gDcI
Get Adobe Flash player
by soh1106c 24 Dec 2010
    Embed
/**
 * Copyright soh1106c ( http://wonderfl.net/user/soh1106c )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/bkgb
 */

package
{
    import flash.ui.Keyboard;
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.events.MouseEvent;
    import flash.geom.Vector3D;

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

    import org.papervision3d.cameras.CameraType;
    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.utils.MaterialsList;
    import org.papervision3d.materials.shadematerials.*;
    import org.papervision3d.materials.*;
    import org.papervision3d.objects.DisplayObject3D;
    import org.papervision3d.core.geom.renderables.Vertex3D;
    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="600", height="800", backgroundColor="#ffffff", frameRate="60")]
    public class Constraints extends BasicView
    {
        private var mylight:PointLight3D;
        private var mouse3D:Mouse3D;
        private var colorMateria:ColorMaterial;
        private var wireframeMateria:WireframeMaterial;
        private var vplObjects:ViewportLayer;
        
        private var ground:RigidBody;
        private var chainBody1:Vector.<RigidBody>;
        private var chain1:Vector.<JConstraintPoint>;
        
        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 CarSkin1:DAE;
        private var CarSkin2:DAE;
        private var CarSkin3:DAE;
        private var CarSkin4:DAE;
        private var CarSkin5:DAE;
        private var CarSkin6:DAE;
        private var CarSkin7:DAE;
        private var CarSkin8:DAE;
         
        public function Constraints()
        {
            super(800, 600, true, true, CameraType.TARGET);
            
            stage.addEventListener(MouseEvent.MOUSE_UP, handleMouseRelease);
            stage.addEventListener(MouseEvent.MOUSE_MOVE, handleMouseMove);
            
            Mouse3D.enabled = true;
            mouse3D = viewport.interactiveSceneManager.mouse3D;
            viewport.containerSprite.sortMode = ViewportLayerSortMode.INDEX_SORT;
            
            mylight = new PointLight3D(true, true);
            mylight.y = 300;
            mylight.z = -400;
            
            camera.y = mylight.y;
            camera.z = mylight.z;
             
            startRendering();
            
            initObject();
        }

        private function initObject():void
        {
            physics = new Papervision3DPhysics(scene, 8);
            
            wireframeMateria = new WireframeMaterial(0,0);
            var materiaList :MaterialsList = new MaterialsList();
            materiaList.addMaterial(wireframeMateria, "all");
            
            ground = physics.createCube(materiaList, 500, 500, 10,10,1,10);
            ground.y = -500;
            ground.rotationZ=30;
            ground.movable = false;
            viewport.getChildLayer(physics.getMesh(ground)).layerIndex = 1;
             
            vplObjects = new ViewportLayer(viewport,null);
            vplObjects.layerIndex = 2;
            vplObjects.sortMode = ViewportLayerSortMode.Z_SORT;
            viewport.containerSprite.addLayer(vplObjects);
            
            colorMateria = new ColorMaterial(0x0000ff,0.1);
            colorMateria.interactive = true;
        
            CarSkin1=new DAE;
            CarSkin1.load("http://soh1106.lolipop.jp/res/car/c1.DAE");
            CarSkin1.scale=1;
            scene.addChild(CarSkin1);
            var CarBox1=new JBox(new Pv3dMesh(CarSkin1),200,50,50);
            physics.addBody(CarBox1);
            
            CarSkin2=new DAE;
            CarSkin2.load("http://soh1106.lolipop.jp/res/car/c2.DAE");
            CarSkin2.scale=1;
            scene.addChild(CarSkin2);
            var CarBox2=new JBox(new Pv3dMesh(CarSkin2),200,50,50);
            physics.addBody(CarBox2);
            
            CarSkin3=new DAE;
            CarSkin3.load("http://soh1106.lolipop.jp/res/car/c3.DAE");
            CarSkin3.scale=1;
            scene.addChild(CarSkin3);
            var CarBox3=new JBox(new Pv3dMesh(CarSkin3),200,50,50);
            physics.addBody(CarBox3);
            
            CarSkin4=new DAE;
            CarSkin4.load("http://soh1106.lolipop.jp/res/car/c4.DAE");
            CarSkin4.scale=1;
            scene.addChild(CarSkin4);
            var CarBox4=new JBox(new Pv3dMesh(CarSkin4),200,50,50);
            physics.addBody(CarBox4);
            
            CarSkin5=new DAE;
            CarSkin5.load("http://soh1106.lolipop.jp/res/car/c5.DAE");
            CarSkin5.scale=1;
            scene.addChild(CarSkin5);
            var CarBox5=new JBox(new Pv3dMesh(CarSkin5),200,50,50);
            physics.addBody(CarBox5);
            
            CarSkin6=new DAE;
            CarSkin6.load("http://soh1106.lolipop.jp/res/car/c6.DAE");
            CarSkin6.scale=1;
            scene.addChild(CarSkin6);
            var CarBox6=new JBox(new Pv3dMesh(CarSkin6),200,50,50);
            physics.addBody(CarBox6);
            
            CarSkin7=new DAE;
            CarSkin7.load("http://soh1106.lolipop.jp/res/car/c7.DAE");
            CarSkin7.scale=1;
            scene.addChild(CarSkin7);
            var CarBox7=new JBox(new Pv3dMesh(CarSkin7),200,50,50);
            physics.addBody(CarBox7);
            
            CarSkin8=new DAE;
            CarSkin8.load("http://soh1106.lolipop.jp/res/car/c8.DAE");
            CarSkin8.scale=1;
            scene.addChild(CarSkin8);
            var CarBox8=new JBox(new Pv3dMesh(CarSkin8),200,50,50);
            physics.addBody(CarBox8);
            
            var CarBall=physics.createSphere(colorMateria, 50,6,3);
            
            chain1 = new Vector.<JConstraintPoint>();
            chainBody1 = new Vector.<RigidBody>();
            chainBody1.push(CarBall);
            chainBody1.push(CarBox1);
            chainBody1.push(CarBox2);
            chainBody1.push(CarBox3);
            chainBody1.push(CarBox4);
            chainBody1.push(CarBox5);
            //chainBody1.push(CarBox6);
            //chainBody1.push(CarBox7);
            chainBody1.push(CarBox8);
            
            for (var i:int = 0; i <chainBody1.length; i++)
            {                    
                chainBody1[i].maxLinVelocities = 200;
                chainBody1[i].maxRotVelocities = 10;
                physics.getMesh(chainBody1[i]).addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, handleMousePress);
                chainBody1[i].moveTo(new Vector3D( 0, 100 + (20 * i+20), 0));
                vplObjects.addDisplayObject3D(physics.getMesh(chainBody1[i]));
            }
             
            var pos1:Vector3D;
            var pos2:Vector3D;
            for (i = 1; i < chainBody1.length; i++ ){
                pos1 = JNumber3D.getScaleVector(Vector3D.Y_AXIS, chainBody1[i - 1].boundingSphere);
                pos2 = JNumber3D.getScaleVector(Vector3D.Y_AXIS, -chainBody1[i].boundingSphere);
                chain1[i - 1] = new JConstraintPoint(chainBody1[i - 1], pos1, chainBody1[i], pos2, 1, 0.01);
            }
        }
         
        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;
            trace(1);
            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);
        }
        
        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;
                dragConstraint.disableConstraint();
                currDragBody.setActive();
            }
        }
        
        private function resetBody():void
        {
            if (chainBody1[0].currentState.position.y < -1000)
            {
                for (var i:String in chainBody1)
                {
                    chainBody1[i].moveTo(new Vector3D( 0, 800 + (20 * int(i) + 20), 0));
                }
            }
        }
        
        protected override function onRenderTick(event:Event = null):void {
            
            //physics.step();//dynamic timeStep
            physics.engine.integrate(0.2);//static timeStep
            resetBody();
            super.onRenderTick(event);
        }
    }
}