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

【途中】落下する大仏

JigLibライブラリのバージョンを最新にしていただいて、動くようになった!
シーンについて考え中。
黄色の立方体のみ、つかめます。

【元ネタ】YouTube - 海へ落下する大仏 
http://www.youtube.com/watch?v=AoJc5tdJO9U
Get Adobe Flash player
by soh1106c 01 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/89Hs
 */

package {
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.geom.Matrix3D;
    import flash.geom.Vector3D;

    import jiglib.cof.JConfig;
    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 falling_buddha extends BasicView {
        private var mylight:PointLight3D;
        private var mouse3D:Mouse3D;
        private var wireframeMateria:WireframeMaterial;
        private var shadeMateria:GouraudMaterial;

        private var ground:RigidBody;

        private var boxBody:Vector.<RigidBody>;
        private var boxBodyb:Vector.<RigidBody>;

        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 BuddhaSkin:DAE;
        private var BuddhaBox:RigidBody;

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

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

            init3D();
        }

        private function init3D():void {
            JConfig.numContactIterations=12;
            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);

///////////////////////////////// 地面表示
            
            var bridge:DAE=new DAE;
                bridge.load("http://soh1106.lolipop.jp/res/bridge/washington_bridge/washington_bridge.DAE");
                bridge.scale=0.2;
                scene.addChild(bridge);

            var bridgeBox=new JBox(new Pv3dMesh(bridge),800,150,10);
            physics.addBody(bridgeBox);
            bridgeBox.movable=false;
            bridgeBox.z=0;
            bridgeBox.y=-450;
            bridgeBox.rotationY=-20;

            bridgeBox.restitution=1;

///////////////////////////////// 大仏表示

            shadeMateria=new GouraudMaterial(mylight,0xeeee00);
            shadeMateria.interactive=true;
            var materiaList = new MaterialsList();
            materiaList.addMaterial(shadeMateria,"all");

            boxBody=new Vector.<RigidBody>();
            for (var i:int = 0; i < 3; i++) {
                BuddhaSkin=new DAE;
                BuddhaSkin.load("http://soh1106.lolipop.jp/res/buddha/buddha.dae");
                BuddhaSkin.scale=5;
                scene.addChild(BuddhaSkin);

                var BuddhaBox=new JBox(new Pv3dMesh(BuddhaSkin),200,200,400);
                
                physics.addBody(BuddhaBox);
                boxBody[i]=BuddhaBox;
                boxBody[i].moveTo(new Vector3D(0, 2000 + (500 * i + 40), 0));
                vplObjects.addDisplayObject3D(physics.getMesh(boxBody[i]));
            }

///////////////////////////////// キューブ表示

            boxBodyb=new Vector.<RigidBody>();
            for (i= 0; i < 1; i++) {
                boxBodyb[i]=physics.createCube(materiaList,100,100,100);
                physics.getMesh(boxBodyb[i]).addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, handleMousePress);
                boxBodyb[i].moveTo(new Vector3D(-1000, 2000 + (40 * i + 40), 0));
            }

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

            startRendering();
        }
///////////////////////////////// ドラッグ

        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();
            }
        }
        
////////////////////// リセット        
        
        private function resetBox():void
        {            
            for (var i:int = 0; i < boxBody.length;i++ )
            {
                if (boxBody[i].currentState.position.y < -3000)
                {
                    boxBody[i].moveTo(new Vector3D(0, 2000 + (60 * i + 60), 0));
                }
            }
            
            for (i = 0; i < boxBodyb.length;i++ )
            {
                if (boxBodyb[i].currentState.position.y < -1000)
                {
                    boxBodyb[i].moveTo(new Vector3D(0, 2000 + (60 * i + 60), 0));
                }
            }
        }
        
///////////////////////// レンダリング

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