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.* ;
/**
public class Matrix3DExample
extends Sprite
{
public var world :Sprite ;
//
/**
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 ;
}
/**
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 ) ;
}
//
/**
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.
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.