März 2010
Flash und Geodaten
Fortsetzung, Teil 3
Ich hier – du da
Der Quellcode steht auch als Download bereit.
Im Grunde haben wir somit unsere Basisanwendung beendet. An dieser Stelle war es mir persönlich jedoch ein wenig zu trist, die Karte bzw. das Kartenmaterial einfach nur anzuzeigen. Warum das gesamte Szenario nicht einfach um ein wenig 3-D erweitern? So eine Karte sieht doch, gemapped auf ein paar konvex gewölbte Planes, einfach viel besser aus.
Ein wenig Papervision3D hier, ein bisschen AS3Mod dort – so ein kleiner 3-D-Geomapper ist nun auch wirklich schnell geschrieben (Listing 3).
package {///////////////////////////////////// import used classes///////////////////////////////////import com.as3dmod.*;import com.as3dmod.modifiers.*;import com.as3dmod.plugins.pv3d.*import flash.display.*;import flash.events.*;import flash.filters.*;import flash.text.*;import flash.utils.getTimer;import gs.*;import gs.easing.*;import org.papervision3d.cameras.*;import org.papervision3d.materials.*;import org.papervision3d.materials.shadematerials.*;import org.papervision3d.materials.shaders.*;import org.papervision3d.materials.utils.*;import org.papervision3d.objects.primitives.*;import org.papervision3d.render.*;import org.papervision3d.scenes.*;import org.papervision3d.view.*;///////////////////////////////////// class///////////////////////////////////public class GeoMapper extends flash.display.Sprite {public var surface_tp :BitmapData;public var surface_lm :BitmapData;public var surface_rm :BitmapData;public var surface_bm :BitmapData;private var view :Viewport3D;private var scene :Scene3D;private var tp_plane :Plane;private var lm_plane :Plane;private var rm_plane :Plane;private var bm_plane :Plane;private var camera :Camera3D;private var renderer :BasicRenderEngine;private var stack01 :ModifierStack;private var stack02 :ModifierStack;private var stack03 :ModifierStack;private var stack04 :ModifierStack;private var bend01 :Bend;private var bend02 :Bend;private var bend03 :Bend;private var bend04 :Bend;private var rumble :Boolean = false;///////////////////////////////////// class constructor///////////////////////////////////public function GeoMapper() {super();if ( stage ) {setup();} else {addEventListener( Event.ADDED_TO_STAGE,setup );}}///////////////////////////////////// setup///////////////////////////////////private function setup( event:Event = null ):void {removeEventListener( Event.ADDED_TO_STAGE, setup );///////////////////////////////////// initialize///////////////////////////////////initEngine();setupMaterials();initbend01ings();launch();}///////////////////////////////////// initialize: 3d.engine///////////////////////////////////private function initEngine():void {this.view = new Viewport3D( 800, 640 );this.view.filters = [new DropShadowFilter(40, 90, 0, 0.6, 24, 24)];this.scene = new Scene3D();this.renderer = new BasicRenderEngine();this.camera = new Camera3D();this.camera.zoom = 13;this.camera.z = -120;this.view.mouseEnabled = false;this.view.mouseChildren = false;addChild( this.view );}///////////////////////////////////// setup: material(s)///////////////////////////////////private function setupMaterials():void {///////////////////////////////////// setup: material(s)///////////////////////////////////var bmp01 :BitmapMaterial = new BitmapMaterial( this.surface_tp );bmp01.smooth = true;var bmp02 :BitmapMaterial = new BitmapMaterial( this.surface_lm );bmp02.smooth = true;var bmp03 :BitmapMaterial = new BitmapMaterial( this.surface_rm );bmp03.smooth = true;var bmp04 :BitmapMaterial = new BitmapMaterial( this.surface_bm );bmp04.smooth = true;///////////////////////////////////// setup: map.plane(s)///////////////////////////////////this.tp_plane = new Plane( bmp01, 800, 213, 10, 10 );this.tp_plane.y = 213;this.lm_plane = new Plane( bmp02, 400, 213, 10, 10 );this.lm_plane.x = -200;this.rm_plane = new Plane( bmp03, 400, 213, 10, 10 );this.rm_plane.x = 200;this.bm_plane = new Plane( bmp04, 800, 213, 10, 10 );this.bm_plane.y = -213;///////////////////////////////////// add///////////////////////////////////this.scene.addChild( this.tp_plane );this.scene.addChild( this.lm_plane );this.scene.addChild( this.rm_plane );this.scene.addChild( this.bm_plane );}///////////////////////////////////// initialize: 3d.bend01ing(s)///////////////////////////////////private function initbend01ings():void {this.stack01 = new ModifierStack( new LibraryPv3d(), this.lm_plane );this.stack02 = new ModifierStack( new LibraryPv3d(), this.rm_plane );this.stack03 = new ModifierStack( new LibraryPv3d(), this.tp_plane );this.stack04 = new ModifierStack( new LibraryPv3d(), this.bm_plane );this.bend01 = new Bend();this.bend01.force = -0.1;this.bend01.offset = 1.0;this.bend02 = new Bend();this.bend02.force = -0.1;this.bend02.offset = 0.0;this.bend03 = new Bend();this.bend03.force = -0.2;this.bend03.offset = 0.5;this.bend04 = new Bend();this.bend04.force = -0.2;this.bend04.offset = 0.5;///////////////////////////////////// add: modifier(s)///////////////////////////////////this.stack01.addModifier( this.bend01 );this.stack02.addModifier( this.bend02 );this.stack03.addModifier( this.bend03 );this.stack04.addModifier( this.bend04 );}///////////////////////////////////// launch///////////////////////////////////private function launch():void {addEventListener( Event.ENTER_FRAME, onUpdateFrame );}private function onUpdateFrame( event:Event ):void {///////////////////////////////////// handle: modifier.stack///////////////////////////////////this.stack01.apply();this.stack02.apply();this.stack03.apply();this.stack04.apply();///////////////////////////////////// render///////////////////////////////////this.renderer.renderScene( this.scene, this.camera, this.view );}///////////////////////////////////// process: bend01ing(s)///////////////////////////////////private function deform( event:MouseEvent ):void {if ( !this.rumble ) {var p1:Perlin = new Perlin( 0.1 );var p2:Perlin = new Perlin( 0.1 );var p3:Perlin = new Perlin( 0.1 );var p4:Perlin = new Perlin( 0.1 );this.stack01.clear(); this.stack02.clear();this.stack03.clear(); this.stack04.clear();this.stack01.addModifier( this.bend01 ); this.stack01.addModifier( p1 );this.stack02.addModifier( this.bend02 );this.stack02.addModifier( p2 );this.stack03.addModifier( this.bend03 );this.stack03.addModifier( p3 );this.stack04.addModifier( this.bend04 );this.stack04.addModifier( p4 );this.rumble = true;} else {this.stack01.clear(); this.stack02.clear();this.stack03.clear(); this.stack04.clear();this.stack01.addModifier( this.bend01 ); this.stack02.addModifier( this.bend02 );this.stack03.addModifier( this.bend03 ); this.stack04.addModifier( this.bend04 );this.rumble = false;}}}}
Der Quellcode steht auch als Download bereit.
































