Get_relative_matrix3d: le concept...

Description

Voici une source qui vous ESSAIERA de vous expliquer comment
fonctionne la fonction "getRelativeMatrix3D()" de l'objet "Transform".

Je dis la source, je n'expliquerais à personne le pourquoi du comment si le code et les commentaires n'était pas suffisant... Désolé. J'aide ! Je ne forme pas !

Créér un nouveau doc flash CS4 de 800x600 en 50FPS
Lui attribué la classe la classe "Matrix3DExample"
(Fla et AS étant dans le même dossier, il va de soit)
Publier et voilà !

Source / Exemple :


/*



package 
{
	import flash.display.* ;
	import flash.events.* ;
	import flash.geom.* ;
	import flash.filters.* ;
	
	/**

  • @author Top30
  • /
public class Matrix3DExample extends Sprite { public var world :Sprite ; // /**
  • Constructeur
    • /
public function Matrix3DExample() :void{ // Décoration this.addChild( this.getBackground(0x000000,0x444444) ) ; // Container du monde 3D this.world= new Sprite() ; this.addChild( this.world ) ; // Si "z" n'est pas défini, "getRelativeMatrix3D(this.stage)" retournera null this.world.x= this.stage.stageWidth/2 ; this.world.y= this.stage.stageHeight/2 ; this.world.z= 0 ; ////////////////////////////////////////////////////////////////////////////////// // Ajout de 8 cubes au sein du monde 3D var i :int= -1 ; var n :Number= Math.PI/4 ; while( ++i< 8 ) this.world.addChild( this.getCube( 75, Math.cos(i*n)*150, Math.sin(i*n)*150,0) ); // Ecoutes this.stage.addEventListener( Event.ENTER_FRAME, _enterFrameHandler ) ; this.stage.addEventListener( MouseEvent.MOUSE_MOVE, _mouseHandler ) ; } // /**
  • Retourne un sprite "cube"
    • /
public function getCube( size:Number, pX:Number, pY:Number, pZ :Number ) :Sprite{ // Le cube et sa position var cube :Sprite= new Sprite() ; cube.x= pX ; cube.y= pY ; cube.z= pZ ; // Les faces cube.addChild( this.getCubeFace( 0xFF0000, size, 0,-1, 0, -1, 0, 0 ) ) ; cube.addChild( this.getCubeFace( 0x00FF00, size, 0, 2, 0, 0, 0, 1 ) ) ; cube.addChild( this.getCubeFace( 0xFFFF00, size, 0, 1, 0, 1, 0, 0 ) ) ; cube.addChild( this.getCubeFace( 0x0000FF, size, 0, 0, 0, 0, 0,-1 ) ) ; cube.addChild( this.getCubeFace( 0x00FFFF, size, 1, 0, 0, 0,-1, 0 ) ) ; cube.addChild( this.getCubeFace( 0xFF00FF, size, 1, 0, 0, 0, 1, 0 ) ) ; cube.filters= [new GlowFilter(0x000000,1,25,25,1.25)] ; return cube ; } // /**
  • Retourne un sprite "face de cube"
    • /
public function getCubeFace( color:Number, size:Number=50, rX:Number=0, rY:Number=0, rZ:Number=0, pX:Number=0, pY:Number=0, pZ:Number=0 ) :Sprite{ // La face var face :Sprite= new Sprite() ; face.graphics.beginFill( color, .85 ) ; face.graphics.drawRect( -size/2,-size/2, size,size) ; // Sa rotation face.rotationX= rX*90 ; face.rotationY= rY*90 ; face.rotationZ= rZ*90 ; // Sa position face.x= pX*(size/2) ; face.y= pY*(size/2) ; face.z= pZ*(size/2) ; return face ; } /**
  • Fait tourner le monde 3D
    • /
private function _mouseHandler( e:MouseEvent ) :void{ var w :Number= this.world.x ; var h :Number= this.world.y ; this.world.rotationY= ((e.stageX-w)/-w)*360 ; this.world.rotationX= ((e.stageY-h)/-h)*360 ; } // /**
  • Calcul le Z sorting du monde 3D et ses enfants
    • /
private function _enterFrameHandler( e:Event ) :void{ this.sortChild( this.world ) ; } // /**
  • Efface les enfants et les reindex selon leur "Z relatif"
  • Est autorécursive sur les enfants "DisplayObjectContainer" contenant eux aussi des enfants
    • /
public function sortChild( parent:DisplayObjectContainer ) :void{ var z :Number ; var data :Object ; var list :Array= [] ; var matrix :Matrix3D ; var child :DisplayObject ; // // Pour tous les enfants de parent... var i :int= -1 ; var j :int= -1 ; while( ++i< parent.numChildren ){ child= parent.getChildAt(i) ; // // On récupère la matrice global par rapport au stage... matrix= child.transform.getRelativeMatrix3D(this.stage) ; // Au cas où le "z" de l'enfant ne serait pas définit. // Evitant ainsi l'erreur du null en cas de "z" non définit... if( matrix!=null ) list.push( {z:matrix.position.z, child:child} ) ; // Si a des enfants "DisplayObjectContainer", on récursie if( child is DisplayObjectContainer ) this.sortChild( child as DisplayObjectContainer ) ; } // On vide le parent des enfants while( parent.numChildren>0 ) parent.removeChildAt(0) ; // On trie les enfants par rapport à leur "z" relatif... list.sortOn( "z", Array.NUMERIC|Array.DESCENDING ) ; // On remplie le parent par rapport au tri "z" précédent for each( data in list ) parent.addChild( data.child ) ; } // /**
  • Décoration
    • /
public function getBackground( colUp:uint, colDown:uint ) :Shape { var matrix :Matrix = new Matrix() matrix.createGradientBox(400, 400, Math.PI/2, 0, 0); var shape :Shape = new Shape() ; shape.graphics.beginGradientFill("linear", [colUp, colDown], [1, 1], [1, 255], matrix, "pad", "rgb", 0) ; shape.graphics.drawRect( 0, 0, 400, 400) ; shape.width = this.stage.stageWidth ; shape.height = this.stage.stageHeight ; return shape ; } } }

Conclusion :


La fonction "getRelativeMatrix3D()" peut être effectivement utile pour des concepts de 3D relativement basique.

Pour de la 3D plus précise, ou plus complexe, c'est vrai que des packages comm "PaperVision3D", "Always3D", "Sandy", etc... Sont bien plus perfomant.

Codes Sources

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.