forked from: flash on 2013-2-28
forked from flash on 2013-2-28 (diff: 24)
ActionScript3 source code
/**
* Copyright ohisama ( http://wonderfl.net/user/ohisama )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/oG6Mk
*/
// forked from ohisama's flash on 2013-2-28
package
{
import flash.geom.*;
import flash.events.Event;
import org.papervision3d.view.*;
import org.papervision3d.objects.*;
import Box2D.Dynamics.*;
import Box2D.Collision.*;
import Box2D.Common.Math.*;
import org.papervision3d.lights.PointLight3D;
import Box2D.Collision.Shapes.b2PolygonDef;
import org.papervision3d.materials.ColorMaterial;
import org.papervision3d.materials.shadematerials.FlatShadeMaterial;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.objects.parsers.DAE;
import Box2D.Collision.Shapes.b2CircleDef;
import Box2D.Common.Math.b2Vec2;
import org.papervision3d.objects.primitives.Sphere;
import org.papervision3d.objects.primitives.Plane;
import org.papervision3d.materials.special.CompositeMaterial;
[SWF(backgroundColor="#000000", width="475", height="475")]
public class Main extends BasicView
{
private var world : b2World;
public function Main()
{
var bgMatrix : Matrix = new Matrix();
bgMatrix.rotate(90 * Math.PI / 180);
graphics.beginGradientFill("linear", [0xFFFFFF, 0x001122], [100, 100], [0, 255], bgMatrix);
graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
var light : PointLight3D = new PointLight3D(true);
light.x = -600;
light.y = 300;
light.z = -600;
var col : ColorMaterial = new ColorMaterial(0xffffff, 0.5);
var co : CompositeMaterial = new CompositeMaterial();
co.addMaterial(col);
var floor : Plane = new Plane(co, 800, 800, 12, 12);
floor.pitch(90);
floor.y = -25;
scene.addChild(floor);
var colorArray : Array = [0xff0000, 0x00ff00, 0x0000ff, 0xffff00, 0xffffff, 0x0000ff, 0xffff00];
var worldBounds : b2AABB = new b2AABB();
worldBounds.lowerBound = new b2Vec2(-100, -100);
worldBounds.upperBound = new b2Vec2(300, 300);
var gravity : b2Vec2 = new b2Vec2(0, 0);
world = new b2World(worldBounds, gravity, true);
for (var i : int = 0; i < 7; i++)
{
var mat : FlatShadeMaterial = new FlatShadeMaterial(light, colorArray[i] as uint);
mat.interactive = true;
var bodyDef : b2BodyDef = new b2BodyDef();
bodyDef.position = new b2Vec2(50, i * 30 + 10);
var body : b2Body = world.CreateBody(bodyDef);
var shapeDef : b2CircleDef = new b2CircleDef();
shapeDef.radius = 15;
shapeDef.density = 1;
shapeDef.friction = 0.7;
shapeDef.restitution = 0.7;
body.CreateShape(shapeDef);
body.SetMassFromShapes();
var sphere : Sphere = new Sphere(mat, 30);
scene.addChild(sphere);
body.m_userData = sphere;
}
var ballshape : b2CircleDef = new b2CircleDef();
ballshape.radius = 20;
ballshape.density = 8;
ballshape.friction = 8;
ballshape.restitution = 0.9;
var balldef : b2BodyDef = new b2BodyDef();
balldef.position.Set(200, 100);
var ball : b2Body = world.CreateBody(balldef);
ball.CreateShape(ballshape);
var pow : b2Vec2 = new b2Vec2(-10, 0);
ball.SetLinearVelocity(pow);
ball.SetMassFromShapes();
var dae : DAE = new DAE(true, null, true);
dae.load("http://yumekikaku.dip.jp/obj/miku_run.dae");
dae.y = -10;
dae.z = 20;
dae.scale = 70;
//dae.rotationY = 90;
scene.addChild(dae);
ball.m_userData = dae;
camera.x = -400;
camera.y = 50;
camera.z = -200;
startRendering();
dae.play();
}
override protected function onRenderTick(event : Event = null) : void
{
var iterations : int = 10;
var timeStep : Number = 1.0 / 30.0;
world.Step(timeStep, iterations);
for (var bb : b2Body = world.m_bodyList; bb; bb = bb.m_next)
{
if (bb.m_userData is DisplayObject3D)
{
bb.m_userData.x = bb.GetPosition().x * 2 - 475 * .5;
bb.m_userData.z = -bb.GetPosition().y * 2 + 475 * .5;
bb.m_userData.rotationY = -bb.GetAngle() * (180 / Math.PI) + 90;
}
}
renderer.renderScene(scene, camera, viewport);
}
}
}