package physics { import flare.basic.*; import flare.core.*; import flare.materials.*; import flare.materials.filters.*; import flare.physics.colliders.*; import flare.primitives.*; import flare.system.*; import flare.utils.*; import flash.display.*; import flash.events.*; import flash.geom.*; import flash.utils.*; /** * @author Ariel Nehmad */ public class Test05_MeshCollision extends Sprite { [Embed(source = "assets/meshCollisions.zf3d", mimeType = "application/octet-stream")] private var Model:Class; private var scene:Scene3D; private var spheres:MeshBatch3D; private var model:Pivot3D; private var player:Cube; private var batch:MeshBatch3D; public function Test05_MeshCollision() { scene = new Viewer3D( this, null, 0.4 ); scene.autoResize = true; scene.allowImportSettings = true; scene.addEventListener( Scene3D.COMPLETE_EVENT, completeEvent ); var mat:Shader3D = new Shader3D( "", [new NullFilter( 0x605060, 5 )] ); var sphere:Sphere = new Sphere( "sphere", 7, 24, mat ); sphere.collider = new SphereCollider( sphere.radius ); batch = new MeshBatch3D( sphere ); for ( var i:int = 0; i < 200; i++ ) createSphere(); model = scene.addChildFromFile( new Model ); } private function completeEvent( e:Event ):void { var mat:Shader3D = new Shader3D( "", [new NullFilter( 0x405060, 5 )] ); player = new Cube( "cube", 15, 15, 25, 1, mat ); player.collider = new BoxCollider( player.width, player.height, player.depth ); player.collider.isRigidBody = true; player.collider.friction = 1; player.collider.restitution = 0.1 player.collider.setMass( 10 ); player.collider.constrainLocalRotation( 0, 0, 0 ); player.x = 10; player.y = 7.5; player.z = -30; scene.addChild( batch ); scene.addChild( player ); scene.addEventListener( Scene3D.UPDATE_EVENT, updateEvent ); } private function updateEvent(e:Event):void { // we can move the player as a kinematic moving and rotating it as usual.... if ( Input3D.keyDown( Input3D.UP ) ) player.translateZ( 1.5 ); if ( Input3D.keyDown( Input3D.DOWN ) ) player.translateZ( -1.5 ); if ( Input3D.keyDown( Input3D.LEFT ) ) player.rotateY( -3 ); if ( Input3D.keyDown( Input3D.RIGHT ) ) player.rotateY( 3 ); // or as a rigid body, applaying forces and torques. if ( Input3D.keyDown( Input3D.SPACE ) ) { player.collider.awake(); player.collider.applyImpulse( 0, 50, 0 ); } if ( Input3D.keyDown( Input3D.R ) ) { player.setRotation( 0, 0, 0 ); player.setPosition( 0, 10, 0 ); player.collider.resetVelocities(); } scene.physics.step( 3, 1 / 30 ); } private function createSphere():void { var collider:SphereCollider = new SphereCollider( 7 ); collider.isRigidBody = true; collider.neverSleep = true; collider.position.x = Math.random() * 200 - 100; collider.position.z = Math.random() * 200 - 100; collider.position.y = Math.random() * 500 + 100; scene.physics.addCollider( collider ); batch.addInstance( collider.position, collider.orientation ); } } }