Author: Thomas PFEIFFER
Date: October 8th 2007
version: 3.0
In this demo, you'll see how to use the parser (Collada in this case) to create objects from external models.
This example also provides an example of smooth camera movement targeting the object.
The models and textures used here are not provided. This code goal is to illustrate the parser use only.
This code is for FlexBuilder, and requires some adaptation to use it under Flash CS3.
package { import flash.display.Bitmap; import flash.display.MovieClip; import flash.display.Sprite; import flash.display.StageScaleMode; import flash.events.Event; import sandy.core.World3D; import sandy.core.scenegraph.Camera3D; import sandy.core.scenegraph.Group; import sandy.core.scenegraph.Shape3D; import sandy.materials.Appearance; import sandy.materials.BitmapMaterial; import sandy.parser.IParser; import sandy.parser.Parser; import sandy.parser.ParserEvent; [SWF(width="400", height="400", backgroundColor="#FFFFFF", frameRate="30")] public class ColladaTest extends Sprite { internal static const SCREEN_WIDTH:int = 400; internal static const SCREEN_HEIGHT:int = 400; internal static const SCREEN_WIDTH2:int = SCREEN_WIDTH/2; internal static const SCREEN_HEIGHT2:int = SCREEN_HEIGHT/2; private var world : World3D; private var camera : Camera3D; private var model:Shape3D; private var container:MovieClip; private var nLoaded:uint = 0; [Embed(source="assets/plane_texture.png")] private var PlaneTexture:Class; [Embed(source="assets/ball_texture.png")] private var BallTexture:Class; private var fps: CustomFPS; private var ball:Shape3D; public function ColladaTest() { stage.quality = "MEDIUM"; stage.scaleMode = StageScaleMode.NO_SCALE ; fps = new CustomFPS(); fps.y = 12; addChild( fps ); _init(); _createScene(); } private function _init():void { container = new MovieClip(); addChild(container); // world = World3D.getInstance(); world.container = container; // -- camera = world.camera = new Camera3D( SCREEN_WIDTH, SCREEN_HEIGHT ); camera.z = 140; world.root = new Group(); world.root.addChild( camera ); return; } private function _createScene():void { var lPic:Bitmap = new BallTexture(); var ballAppearance:Appearance = new Appearance( new BitmapMaterial( lPic.bitmapData ) ); var lParser:IParser = Parser.create( "assets/ball.dae", Parser.COLLADA, 1 ); lParser.addEventListener( ParserEvent.onInitEVENT, _initRender ); lParser.addEventListener( ParserEvent.onFailEVENT, _failInit ); lParser.standardAppearance = ballAppearance; lParser.parse(); } private function _failInit( pEvt:ParserEvent ):void { trace("model can't get parsed"); } private function _initRender( pEvt:ParserEvent ):void { // the parser creates a group in which the parsed objects are stored. var lGroup:Group = Group( pEvt.group ); // in this case, we have only one object per file, so we can access it that way. // you can also retrieve the correct object directly from its name. var lShape:Shape3D = lGroup.getChildList()[0]; world.root.addChild( lShape ); ++nLoaded; if( nLoaded == 2 ) { addEventListener( Event.ENTER_FRAME, enterFrameHandler ); } else { lShape.y += 40; ball = lShape; // var lPic:Bitmap = new PlaneTexture(); var planeAppearance:Appearance = new Appearance( new BitmapMaterial( lPic.bitmapData ) ); var lParser2:IParser = Parser.create( "assets/plane.dae", Parser.COLLADA, 1 ); lParser2.addEventListener( ParserEvent.onInitEVENT, _initRender ); lParser2.addEventListener( ParserEvent.onFailEVENT, _failInit ); lParser2.standardAppearance = planeAppearance; lParser2.parse(); } } private function enterFrameHandler( event : Event ) : void { camera.x += ((container.mouseX - SCREEN_WIDTH2)* 4 - camera.x) / 10; camera.y += ((container.mouseY - SCREEN_HEIGHT2)* 4 - camera.y) / 10; // -- camera.lookAt( 0, 40, 0 ); // -- ball.rotateY++; // -- world.render(); fps.nextFrame(); } } }