Forums Développement Multimédia

Aller au contenu

Galère avec PerspectiveMatrix3D ✔

CODE Actionscript

8 réponses à ce sujet

#1 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 25 April 2012 - 19:13 PM

Hello !

Je suis en train de faire quelques tests avec Molehill dans lesquels j'utilise la classe PerspectiveMatrix3D fourni par adobe pour gérer la perspective. Tout fonctionne bien à ceci près que mon système de coordonnée est inversé dés que j'utilise les perspective.

En gros, si j'écris ça

var plane:Plane = new Plane();
plane.y = -100;
 

J'aimerais que ma Plane soit disposé à 100px vers le haut ; mais la plane est en fait positionné à 100px vers le bas. C'est un problème facile à contourner, mais il revient sans cesse (sur tout mes projets molehill)


Quelqu'un a t'il un bout de code permettant de fabriquer un équivalent de PerspectiveProjection pour molehill (avec exactement le même comportement (ou du moins , un équivalent de new PerspectiveProjection().toMatrix3D() ) ?


Merci d'avance !

#2 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 19 June 2012 - 23:36 PM

Mieux vaut tard que jamais


package
{
import com.adobe.utils.PerspectiveMatrix3D;
import flash.geom.Matrix3D;
import flash.geom.Vector3D;
/**
  * ...
  * @author tlecoz
  */

public class PerspectiveProjection3D extends Matrix3D
{

  private var persMatrix:PerspectiveMatrix3D = new PerspectiveMatrix3D();
  private var viewMatrix:Matrix3D = new Matrix3D();

  public function PerspectiveProjection3D(screenW:Number,screenH:Number,fieldOfViewInDegree:Number=60,zNear:Number=0.1,zFar:Number=10000)
  {
 
   var a:Number = (Math.PI / 180 * fieldOfViewInDegree) ;
   var a2:Number = a/2
   var focal:Number = (screenW / 2) * (Math.cos(a2) / Math.sin(a2))
 
   viewMatrix.appendScale(1, -1, 1);
   viewMatrix.appendTranslation(0, 0, focal);
   persMatrix.perspectiveFieldOfViewLH(a, screenW / screenH, zNear, zFar);
   append(viewMatrix);
   append(persMatrix);
  }
}
}
 

En utilisant cet objet en tant que matrice de projection, les coordonnées X/Y/Z sont respecté (par rapport au fonctionnement classique de Flash), et la "camera" est placé à distance telle qu'un carré de 256x256 apparaitra à l'écran en mesurant 256x256 si sa distance est égale à 0.

Bref exactement ce qu'on s'attend à trouver en fait.... :)

EDIT : Merci lilive pour le coup du scale, c'est tellement bête que ... je me sens bête ^^

#3 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 29 June 2012 - 22:03 PM

En 3D la matrice de projection est calculée selon un (0, 0) qui est au centre de l'écran.
Il est donc normal que le -y aille vers le bas.

#4 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 30 June 2012 - 03:21 AM

Certes, mais avec PerspectiveMatrix3D le z aussi était inversé...

C'est une classe tout simple, mais elle me permet de travailler comme j'avais l'habitude de le faire avec PerspectiveProjection, et c'est tout ce que je lui demande :)

#5 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 30 June 2012 - 10:03 AM

Normalement le Z c'est 0 pour l'écran et 1 pour le z far.

#6 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 02 July 2012 - 12:30 PM

Peut être mais ce n'est pas super pratique dans le cas d'un mini-site ou les dimensions d'une image dans la démo doivent être égale aux dimensions de l'image dans le psd :)

Il existe peut être une autre méthode pour travailler en pixel plutot qu'en repère normalisé, mais je ne la connais pas :)

#7 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 23 September 2012 - 13:20 PM

Je vais peut être dire une connerie, parce que je n'ai peut être pas compris l'enjeu de la démarche, mais est-ce-qu'un petit coup de "y *= -1" (pareil pour Z si nécessaire afin que -1 soit le far) ne permettrait pas d'éviter l'usage de la classe? Voir même en agal systématiquement avant l'envoi à op ?
Ne baisse jamais les bras, car c'est à ce moment là que le miracle risque de se produire..

Site web: http://www.pureas3.org
Twitter: https://twitter.com/PureAS3

Enjoy with Flash Player :-)

#8 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 23 September 2012 - 13:37 PM

Citation

ne permettrait pas d'éviter l'usage de la classe?

le code de la classe s'éxécute une seule fois et rend son usage plus naturelle (pour moi) par rapport à la classe PerspectiveProjection de FP10. Tu peux modifier les coordonnées à la mains si tu préfère, mais tu devrais le faire pour chaque objet 3D pour chaque frame donc bof...

Citation

Voir même en agal systématiquement avant l'envoi à op ?
Quel est l'intérêt ? Le code donné plus haut s'éxécute une seule fois au début de l'animation après quoi on utilise le résultat tout du long. L'éxécuter en AGAL sous entendrais faire le calcul autant de fois qu'il y a de triangle dans l'animation et occuper de la place dans le code AGAL, limité à 200 lignes.
Certes le calcul en AGAL est plus rapide mais il est lu en permanence. La création de la classe que je propose est plus "lente" (ca se fait en moins d'une milleseconde donc ca va) mais le calcul n'est fait qu'une fois (puisqu'il se trouve dans le constructeur).

Au final, elle sera appliqué en AGAL mais cela ne prendra qu'une ligne (m44) , la classe (donc la matrix) étant utilisé comme constante du Shader. Faire des calcul de matrix en AGAL, c'est faisable mais ça prend vite beaucoup de ligne (surtout dans le cas d'une matrix3D) puisque tu n'as accés à la matrix que de manière brute (en gros soit tu l'applique avec m44 , soit tu convertis à la main les 16 valeurs contenues dans la matrix en trois nouvelle coordonnées (ce qui est nettement plus compliqué/lourd que d'utiliser m44) )


Si tu n'as jamais fait de 3D avec Flash10 , cette classe n'a pas d'intérêt particulier (par rapport à une utilisation classique de la classe PerspectiveMatrix3D) car tu n'as aucune habitude à conserver d'une version à l'autre

#9 alama.be

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 23 September 2012 - 15:02 PM

Je parlais uniquement pour le redressement des coordonnées

Citation

Certes le calcul en AGAL est plus rapide mais il est lu en permanence. La création de la classe que je propose est plus "lente" (ca se fait en moins d'une milleseconde donc ca va) mais le calcul n'est fait qu'une fois (puisqu'il se trouve dans le constructeur).

C'est pas faux! Après, c'est parce que j'ai eu le même souci, j'avais besoin de faire correspondre Y à Flash, j'ai donc simplement inversé y, d'où ma proposition.
Ne baisse jamais les bras, car c'est à ce moment là que le miracle risque de se produire..

Site web: http://www.pureas3.org
Twitter: https://twitter.com/PureAS3

Enjoy with Flash Player :-)



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)