8
votes

Comment faire une rotation 3D autour du centre dans AS3 en utilisant matrix3d?

J'essaie de faire pivoter un sprite en trois dimensions autour de son point central, et je me lance de comprendre une partie du comportement de matrix3d.

ive remplacé les méthodes RotationX, Rotationy et Rotationz de la Sprite comme suit: p>

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);   

} 


2 commentaires

La meilleure chose à faire est de vérifier UICOMPONENT # Transformaround et la mise en œuvre de AdvancedLayout.As associée. Ils font exactement cela, enveloppant matrix3d.


Ne pas regarder à travers votre code, mais êtes-vous en train de vivre à Gimbal Lock? en.wikipedia.org/wiki/gimbal_lock


3 Réponses :


1
votes

Je ne connais rien à propos de AS3, mais je ne sais que votre code, je me demande pourquoi vous traduisez sur l'axe z en utilisant ce que je comprends des valeurs X et Y (largeur et hauteur). L'axe z ne devrait-il pas être traduit en utilisant quelque chose comme "profondeur"?


0 commentaires

3
votes

Une autre solution facile consiste à ajouter l'objet et à centrer dans un sprite de conteneur et à faire les transformations 3D sur le sprite contenant.


1 commentaires

yeh c'est beaucoup plus facile. Créez un holder Sprite, puis ajoutez le sprite avec x: -mysprite.width * 0.5 et Y: -MYSPRITE.Height * 0.5 puis faites pivoter le support



0
votes

Ceci est très simple, vous pouvez essayer d'utiliser le code suivant: xxx

tandis que s est votre Sprite, le troisième paramètre, vector3d indiquez la position centrale de votre Sprite .

Le code ci-dessus rendra la sprite s faire pivoter plus -1 degements.


0 commentaires