2009-12-14 18 views
8

Sto provando a ruotare uno Sprite in tre dimensioni attorno al suo punto centrale, e sto cercando di capire parte del comportamento di matrix3D.come fare la rotazione 3D intorno al centro in AS3 usando matrix3D?

Ive sovrascritto il set metodi rotationX, rotationY, e rotationZ della Sprite come segue:

override public function set rotationX (_rotationX:Number) : void { 

    this.transform.matrix3D.prependTranslation(this.width/2.0, this.height/2.0, 0); 
    this.transform.matrix3D.prependRotation(-this.rotationX, Vector3D.X_AXIS); 
    this.transform.matrix3D.prependRotation(_rotationX, Vector3D.X_AXIS); 
    this.transform.matrix3D.prependTranslation(-(this.width/2.0), -(this.height/2.0), 0); 

} 

override public function set rotationY (_rotationY:Number) : void { 

    this.transform.matrix3D.prependTranslation(this.width/2.0, this.height/2.0, 0); 
    this.transform.matrix3D.prependRotation(-this.rotationY, Vector3D.Y_AXIS); 
    this.transform.matrix3D.prependRotation(_rotationY, Vector3D.Y_AXIS); 
    this.transform.matrix3D.prependTranslation(-(this.width/2.0), -(this.height/2.0), 0); 

} 

override public function set rotationZ (_rotationZ:Number) : void { 

    this.transform.matrix3D.prependTranslation(this.width/2.0, this.height/2.0, 0); 
    this.transform.matrix3D.prependRotation(-this.rotationZ, Vector3D.Z_AXIS); 
    this.transform.matrix3D.prependRotation(_rotationZ, Vector3D.Z_AXIS); 
    this.transform.matrix3D.prependTranslation(-(this.width/2.0), -(this.height/2.0), 0); 

} 

sto usando prependTranslation per correggere il punto centrale della rotazione, e la prima prependRotation ad annullare qualsiasi previously- rotazione applicata.

Testarlo, rotazioneX funziona esattamente come previsto e lo Sprite ruota attorno al suo asse orizzontale.

rotationY e rotationZ sembrano funzionare correttamente. Tuttavia, c'è un problema: ogni volta che vengono impostati rotationY o rotationZ, cambiano anche tutti gli altri valori di rotazione. Questo non è un problema con rotationX: se imposto rotazioneX, non cambia nient'altro. Ma se imposto rotationY o rotationZ tutti i valori di rotazione cambiano, che è un problema per la mia app (che sta cercando di salvare e ripristinare i valori).

Penso che mi manchi solo un po 'di comprensione su cosa sta succedendo con matrix3D. Come posso implementarlo così non c'è alcuna interdipendenza tra i valori?

+0

cosa migliore è quello di controllare [UIComponent # transformAround] (http://opensource.adobe.com/svn/opensource/flex/sdk/trunk/frameworks/projects/framework/src/mx/core/UIComponent.as) e l'implementazione AdvancedLayout.as correlata. Fanno esattamente questo, avvolgendo Matrix3D. –

+0

Non stai guardando attraverso il tuo codice, ma stai vivendo Gimbal Lock? http://en.wikipedia.org/wiki/Gimbal_lock –

risposta

3

Un'altra soluzione facile è aggiungere l'oggetto e centrarlo all'interno di uno sprite contenitore e fare le trasformazioni 3D sullo sprite contenente.

+0

yeh questo è molto più facile. creare un Sprite titolare, quindi aggiungere lo Sprite con x: -mysprite.width * 0.5 e y: -mysprite.height * 0.5 e quindi ruotare il supporto – daidai

1

Non so nulla di AS3 ecc. Ma guardando solo il tuo codice, mi chiedo perché traduci sull'asse z usando quello che capisco essere x e y (larghezza e altezza). L'asse z non dovrebbe essere tradotto usando qualcosa come "profondità"?

0

Questo è molto semplice, si può provare utilizzare il seguente codice:

var matrix3d:Matrix3D = s.transform.matrix3D; 
matrix3d.appendRotation(-1, Vector3D.Z_AXIS , new Vector3D(390, 360, 0)); 

mentre s è il tuo sprite, il terzo parametro, Vector3D indicare la posizione centrale del vostro sprite.

Il codice sopra farà ruotare gli sprite di più -1 grado.

Problemi correlati