forked from: 【途中】落下する大仏
forked from 【途中】落下する大仏 (diff: 1)
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);
}
}
}