forked from: 【途中】落下する大仏

by mash forked from 【途中】落下する大仏 (diff: 1)
♥0 | Line 129 | Modified 2010-10-29 15:11:15 | MIT License
play

ActionScript3 source code

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

// forked from soh1106c's 【途中】落下する大仏
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;

            mylight=new PointLight3D(true,true);
            mylight.y=300;
            mylight.z=-400;

///////////////////////////////// 地面表示

            wireframeMateria = new WireframeMaterial();
            var materiaList2 :MaterialsList = new MaterialsList();
            materiaList2.addMaterial(wireframeMateria, "all");

            ground=physics.createCube(materiaList2,500,500,10,10,1,10);
            ground.movable=false;

            ground.restitution=0.05;

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

            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/study/papervision/jigLib/res/buddha3.dae",materiaList);
                BuddhaSkin.scale=3;
                scene.addChild(BuddhaSkin);

                var BuddhaBox=new JBox(new Pv3dMesh(BuddhaSkin),100,100,100);

                physics.addBody(BuddhaBox);
                boxBody[i]=BuddhaBox;
                boxBody[i].moveTo(new Vector3D(150, 1000 + (40 * i + 40), 0));
            }

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

            boxBodyb=new Vector.<RigidBody>();
            for (i= 0; i < 1; i++) {
                boxBodyb[i]=physics.createCube(materiaList,50,50,50);
                physics.getMesh(boxBodyb[i]).addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, handleMousePress);
                boxBodyb[i].moveTo(new Vector3D(-150, 1000 + (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();
            }
        }
        
///////////////////////// レンダリング

        protected override function onRenderTick(event:Event = null):void {

            physics.step();
            super.onRenderTick(event);
        }
    }
}