Forums Développement Multimédia

Aller au contenu

Orienter forme fonction de la destination

PAO Flash

17 réponses à ce sujet

#1 charlesd

    Ceinture Jaune

  • Members
  • PipPip
  • 29 messages

Posté 07 March 2013 - 21:18 PM

Bonjour,

J'ai des formes pointues (triangles) que je veux orienter toujours le "nez" vers l'avant.
Voici mon animation pour l'instant :

On voit bien que les formes se translatent mais leur orientation ne correspond pas à leur direction.
Pour l'instant, j'applique à mes formes une transformation matricielle : une translation suivant chaque axe et une rotation suivant chaque axe.

Je n'ai pas trop d'idée...
Merci à vous

#2 Nataly

    Community Jane

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 5783 messages

Posté 08 March 2013 - 10:57 AM

bonjour :)

je ne sais pas si ça vient de mon poste, navigateur… ? En tous cas, l'animation que tu poses comme illustration est tellement petite que je ne vois rien, ou quasi.


Comment t'y prends-tu ?
Tu dessines à chaque récurrence, ou tu as un tableau de sprites que tu manipules ?

J'imagine des sprites que tu veux orienter le nez en avant. Donc vers un point. Tous foncent vers le même point et ce qui te manque c'est la rotation ?



peut-être comme ça, avec cible le point vers lequel tout le monde se dirige et forme_c la forme courante


var v:Point=cible.subtract(forme_c)
// l'orientation
var angle=Math.atan2(v.y,v.x)
 


je crois qu'on manque d'info pour t'aider. Si tu publiais le bout de code qui gère le déplacement… ?
Le savoir est le seul bien qui s'accroit quand on le partage
une tartine de tutos

#3 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 08 March 2013 - 12:43 PM

Voir le messageNataly, le 08 March 2013 - 10:57 AM, dit :

je ne sais pas si ça vient de mon poste, navigateur… ? En tous cas, l'animation que tu poses comme illustration est tellement petite que je ne vois rien, ou quasi.

Bonjour,

ça me fait pareil. L'animation est ici.
Charles, il vaut mieux faire comme ça, sous forme de lien, sinon le forum ajoute automatiquement un balise {media} dont on ne peut choisir la taille (en tout cas j'y suis pas arrivé malgré mes recherches, mais j'ai vu des rapports de bug à ce sujet).

Tu peux aussi dans la plupart des cas mettre simplement ton swf en pièce jointe. C'est même le mieux, comme ça tu ne détériores pas la discussion si le swf vers lequel pointe le lien change.

#4 Nelchaël

  • Members
  • PipPipPipPipPipPipPipPip
  • 1900 messages

Posté 08 March 2013 - 12:45 PM

Effectivement, plus d'informations seraient nécessaires pour une réponse précise.
Le plus simple pour toi serait de faire un fichier de test avec juste un triangle et les équations de mouvement utilisées.
En regardant ton animation, peut-être qu'il ne manque qu'une rotation initiale au triangle ?
J'ai fait un exemple avec un clip :
function animer(ev_):void
        {
        mx3D_posi.prepend(mx3D_depl);
        mc_tria.transform.matrix3D=mx3D_rota.clone();
        mc_tria.transform.matrix3D.append(mx3D_posi);
        }
var mc_tria:triangle=new triangle();
var mx3D_rota:Matrix3D=new Matrix3D();
mx3D_rota.appendRotation(-90,Vector3D.X_AXIS);
var mx3D_posi:Matrix3D=new Matrix3D();
mx3D_posi.appendTranslation(400,500,400);
var mx3D_depl:Matrix3D=new Matrix3D();
mx3D_depl.appendTranslation(0,0,20);
mx3D_depl.appendRotation(-5,Vector3D.Y_AXIS);
mx3D_depl.appendRotation(3,Vector3D.X_AXIS);
mx3D_depl.appendRotation(0.5,Vector3D.Z_AXIS);
this.addChild(mc_tria);
this.addEventListener(Event.ENTER_FRAME,animer);
animer(null);
Le clip contient un dessin de triangle, pointe en haut.
La matrice de rotation initiale permet d'orienter la pointe dans le sens du mouvement.
Peut-être que tu pourras t'en inspirer... ;)

Fichier(s) joint(s)


nelchael.fr freelance flash CS6

#5 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 08 March 2013 - 13:09 PM

Hello.
Ça m'a fait tout bizarre de découvrir le swf :-) Heureux de voir que tu avances. Le résultat est convainquant.

Pour ta question, et pour le dire en franÇais de France :
- il y a un moment ou tu calcules le déplacement du triangle
- tu dois :
- - conserver l'ancienne position (éviter les x+=vx; par exemple)
- - calculer la prochaine position (futur_x = x + vx; pour continuer l'exemple)
- - et, grâce a ces 2 infos, tu peux savoir dans quel sens va ton triangle ( de mémoire : rotation = Math.atan2(futur_y - y; futur_x - x);


Attention, tu peux avoir besoin de rajouter 90, 180 ou 270° selon l'orientation du dessin de ton triangle au départ.
Quoi que, pour les perfs, je te conseille vivement de changer l'orientation de ton dessin du triangle plutôt que de faire des milliers de fois une addition inutile.


PS : en relisant le tout, je m'aperÇois que tu es passé aux matrices 3D, dans ce cas, la solution de Nelchäel te convient parfaitement).

#6 Nataly

    Community Jane

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 5783 messages

Posté 08 March 2013 - 18:46 PM

Voir le messageNelchaël, le 08 March 2013 - 12:45 PM, dit :


J'ai fait un exemple avec un clip :


Et pourquoi on n'a plus de bouton j'aime ?
Je préviens :
Image IPB
Le savoir est le seul bien qui s'accroit quand on le partage
une tartine de tutos

#7 charlesd

    Ceinture Jaune

  • Members
  • PipPip
  • 29 messages

Posté 08 March 2013 - 19:15 PM

Merci à tous pour vos réponses

Vous m'avez demandé le script. Désolé d'avance, je ne vois pas comment couper pour que cela reste clair.


public class Individu extends Sprite
{
  private static var _vitesse:Number = 10;
  private static var _liberté:Number = 10;
  private static var _cohésion:Number = 10;
  private static var _amitié:Number = 10;
  private static var _volonté:Number = 30;
  private static var _peur:Number = 10;

 
 
  private var _omega:Vector3D;
  private var _v:Vector3D;
  private var _ami:Individu;
  private var _points:Array = new Array();
  private var _polygon:Polygon3D;
  private var _matricePosition:Matrix3D;
  private var _matriceRota:Matrix3D;
  public function Individu():void
  {
   //graphics.beginFill(uint(Math.random()*0xFFFFFF),0.3);
   /*graphics.beginFill(000000,0.3);
   graphics.drawRect(0,0,2,2);
 
   graphics.endFill();*/

 
   var pointA:Vector3D = new Vector3D(10,4,10);
   var pointB:Vector3D = new Vector3D(20,4,10);
   var pointC:Vector3D = new Vector3D(10,10,10);
   var pointD:Vector3D = new Vector3D(10,4,10);
   var pointE:Vector3D = new Vector3D(10,4,20);
   var pointF:Vector3D = new Vector3D(20,4,10);
 
   var tab:Array = new Array(pointA,pointB,pointC,pointD,pointE,pointF);
   _points = tab;
   _polygon = new Polygon3D(tab,1);
   addChild(_polygon);
   _polygon.x=(Math.random()-.5)*400;
   _polygon.y=(Math.random()-.5)*400;
   _polygon.z=(Math.random()-.5)*400;
   _v = vecteur_alea(_vitesse);
   _omega=vecteur_alea(360);
 
   _matricePosition = new Matrix3D();
   _matricePosition.appendTranslation(_v.x,_v.y,_v.z);
   _matriceRota = new Matrix3D();
   _matriceRota.appendRotation(_omega.x,Vector3D.X_AXIS);
   _matriceRota.appendRotation(_omega.y,Vector3D.Y_AXIS);
   _matriceRota.appendRotation(_omega.z,Vector3D.Z_AXIS);
   _polygon.transform.matrix3D = _matriceRota.clone();
   _polygon.transform.matrix3D.append(_matricePosition);
 
 
 
 
   /*rotationX=(Math.random()-.5)*360;
   rotationY=(Math.random()-.5)*360;
   rotationZ=(Math.random()-.5)*360;*/

 
 
 
 
  }
  public function deplacement(predateur:Predateur,meneur:Individu):void
  {
 
 
   // Translation
   var distance_predateur = (predateur.polygon.x - _polygon.x) * (predateur.polygon.x - _polygon.x) + (predateur.polygon.y - _polygon.y) * (predateur.polygon.y - _polygon.y) + (predateur.polygon.z - _polygon.z)*(predateur.polygon.z - _polygon.z);
   var peur:Vector3D = new Vector3D((_polygon.x-predateur.polygon.x) * _peur / distance_predateur, (_polygon.y-predateur.polygon.y)*_peur / distance_predateur,(_polygon.z-predateur.polygon.z)*_peur / distance_predateur);
   var ailleurs:Vector3D=vecteur_alea(_vitesse*_liberté);
 
   var destination:Vector3D= new Vector3D((_ami.polygon.x * _amitié + meneur.polygon.x * _cohésion + (ailleurs.x+_polygon.x) * _liberté) / _volonté - _polygon.x,(_ami.polygon.y * _amitié + meneur.polygon.y * _cohésion + (ailleurs.y+_polygon.y) * _liberté) / _volonté -_polygon.y,(_ami.polygon.z * _amitié + meneur.polygon.z * _cohésion + (ailleurs.z+_polygon.z) * _liberté) / _volonté - _polygon.z);
   _v.x = _v.x * .8 + destination.x * .01 + peur.x;
   _v.y = _v.y * .8 + destination.y * .01 + peur.y;
   _v.z = _v.z * .8 + destination.z * .01 + peur.z;
   /*var axe:Vector3D = _v.crossProduct(predateur.vecteur_vitesse);
   axe.normalize();*/

 
 

   // Rotation
   var angle:Vector3D = new Vector3D(Vector3D.angleBetween(_v,Vector3D.X_AXIS),Vector3D.angleBetween(_v,Vector3D.Y_AXIS),Vector3D.angleBetween(_v,Vector3D.Z_AXIS));
 
   _omega.x = angle.x;
   _omega.y = angle.y;
   _omega.z = angle.z;
 

   var deplacement:Matrix3D = new Matrix3D();
 
   deplacement.appendTranslation(_v.x,_v.y,_v.z);
   deplacement.appendRotation(_omega.x, Vector3D.X_AXIS);
   deplacement.appendRotation(_omega.y,Vector3D.Y_AXIS);
   deplacement.appendRotation(_omega.z,Vector3D.Z_AXIS);
   _matricePosition.prepend(deplacement);
   _polygon.transform.matrix3D = _matriceRota.clone();
   _polygon.transform.matrix3D.append(_matricePosition);

  }
 


Nelchael, merci pour ton aide, j'ai essayé d'adapter (comme tu le vois sur le script) ta méthode mais je crois que j'ai pas bien comprit clairement ce que tu faisais... Tu pourrais m'expliquer les étapes ?

Merci à vous !

#8 Nelchaël

  • Members
  • PipPipPipPipPipPipPipPip
  • 1900 messages

Posté 09 March 2013 - 02:04 AM

Nataly, content que ça te plaise, mais c'est plutôt simple et pas forcément la bonne méthode. ;)
charlesd, je n'aurai pas le temps d'expliquer les étapes.
Ton code est complexe et on ne peut pas le tester donc il est très difficile de savoir ce qui ne va pas.
J'ai quand même remarqué une erreur : la matrice de rotation initiale ne devrait pas correspondre aux rotations de la matrice de déplacement, mais plutôt à ses coordonnées de translation.
Trouver des rotations correspondantes peut se faire par calcul, mais j'ai vu dans l'aide une fonction qui peut simplifier la chose : Matrix3D.pointAt.
Dans mon premier exemple, il n'y avait qu'une rotation utile.
Je l'ai donc généralisé :
function animer(ev_):void
        {
        mx3D_posi.prepend(mx3D_depl);
        mc_tria.transform.matrix3D=mx3D_rota.clone();
        mc_tria.transform.matrix3D.append(mx3D_posi);
        }
var mc_tria:triangle=new triangle();
var vr3D_depl:Vector3D=new Vector3D(5,-5,10);
var mx3D_rota:Matrix3D=new Matrix3D();
mx3D_rota.pointAt(vr3D_depl,new Vector3D(0,-1,0),new Vector3D(0,0,-1));
var mx3D_posi:Matrix3D=new Matrix3D();
mx3D_posi.appendTranslation(200,500,400);
var mx3D_depl:Matrix3D=new Matrix3D();
mx3D_depl.position=vr3D_depl;
mx3D_depl.appendRotation(-5,Vector3D.Y_AXIS);
mx3D_depl.appendRotation(3,Vector3D.X_AXIS);
mx3D_depl.appendRotation(-1,Vector3D.Z_AXIS);
this.addChild(mc_tria);
this.addEventListener(Event.ENTER_FRAME,animer);
animer(null);

J'ai tenté de faire encore plus général :
function animer(ev_):void
        {
        var vr3D_prec:Vector3D=mx3D_posi.position.clone();
        mx3D_posi.prepend(mx3D_depl);
        mx3D_tria.identity();
        mx3D_tria.pointAt(mx3D_posi.position.subtract(vr3D_prec),new Vector3D(0,-1,0),new Vector3D(0,0,-1));
        mx3D_tria.position=mx3D_posi.position.clone();
        }
var mc_tria:triangle=new triangle();
var mx3D_tria:Matrix3D=mc_tria.transform.matrix3D=new Matrix3D();
var mx3D_posi:Matrix3D=new Matrix3D();
mx3D_posi.appendTranslation(200,500,400);
var mx3D_depl:Matrix3D=new Matrix3D();
mx3D_depl.position=new Vector3D(5,-5,10);
mx3D_depl.appendRotation(-5,Vector3D.Y_AXIS);
mx3D_depl.appendRotation(3,Vector3D.X_AXIS);
mx3D_depl.appendRotation(-1,Vector3D.Z_AXIS);
this.addChild(mc_tria);
this.addEventListener(Event.ENTER_FRAME,animer);
animer(null);

La seule différence avec le résultat précédent est que le triangle tournoie un peu sur son axe, ce qui serait à éviter (éventuellement en ne passant pas par pointAt qu'on ne contrôle pas).
Il y a peut-être des erreurs et certainement des maladresses, j'ai fait ça de façon assez superficielle.
nelchael.fr freelance flash CS6

#9 Nataly

    Community Jane

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 5783 messages

Posté 09 March 2013 - 13:33 PM

Voir le messageNelchaël, le 09 March 2013 - 02:04 AM, dit :

Nataly, content que ça te plaise, mais c'est plutôt simple et pas forcément la bonne méthode. ;)


Ce qui me plait c'est le côté démo sans superflu, bonne base à l'empirisme :)


@ Charles.
Ayé, je te reconnais ! ;)
Je veux dire, je me souviens du sujet d'origine. Bon sang, tu as furieusement avancé :roi:
Le savoir est le seul bien qui s'accroit quand on le partage
une tartine de tutos

#10 charlesd

    Ceinture Jaune

  • Members
  • PipPip
  • 29 messages

Posté 09 March 2013 - 14:27 PM

Salut

Merci Nataly :) !

J'ai essayé de modifier ma procédure de déplacement. Même en prenant les mêmes valeurs que Nelchael je n'ai pas le même résultat : les oiseaux sortent de l'écran.
J'ai essayé de mettre très peu d'oiseau pour l'instant pour que ce soit plus clair.
Ma procédure est la suivante:
Initialisation :

  public function Individu():void
  {
   //graphics.beginFill(uint(Math.random()*0xFFFFFF),0.3);
   /*graphics.beginFill(000000,0.3);
   graphics.drawRect(0,0,2,2);
 
   graphics.endFill();*/

 
   var pointA:Vector3D = new Vector3D(10,4,10);
   var pointB:Vector3D = new Vector3D(20,4,10);
   var pointC:Vector3D = new Vector3D(10,10,10);
   var pointD:Vector3D = new Vector3D(10,4,10);
   var pointE:Vector3D = new Vector3D(10,4,20);
   var pointF:Vector3D = new Vector3D(20,4,10);
 
   var tab:Array = new Array(pointA,pointB,pointC,pointD,pointE,pointF);
   _points = tab;
   _polygon = new Polygon3D(tab,false);
   addChild(_polygon);
   _polygon.x=(Math.random()-.5)*400;
   _polygon.y=(Math.random()-.5)*400;
   _polygon.z=(Math.random()-.5)*400;

   //_v = vecteur_alea(_vitesse);
   _v = new Vector3D(5,-5,10);
   _omega=vecteur_alea(360);
 
   _matriceRota = new Matrix3D();
   _matriceRota.pointAt(_v,new Vector3D(0,-1,0),new Vector3D(0,0,-1));
   _matricePosition = new Matrix3D();
 
   _matricePosition.appendTranslation(_polygon.x,_polygon.y,_polygon.z);
 
   _polygon.transform.matrix3D = _matriceRota.clone();
   _polygon.transform.matrix3D.append(_matricePosition);
 

 
 
 

 
  }
 

Déplacement :

public function deplacement(predateur:Predateur,meneur:Individu):void
  {
 
 
   // Translation
   var distance_predateur = (predateur.polygon.x - _polygon.x) * (predateur.polygon.x - _polygon.x) + (predateur.polygon.y - _polygon.y) * (predateur.polygon.y - _polygon.y) + (predateur.polygon.z - _polygon.z)*(predateur.polygon.z - _polygon.z);
   var peur:Vector3D = new Vector3D((_polygon.x-predateur.polygon.x) * _peur / distance_predateur, (_polygon.y-predateur.polygon.y)*_peur / distance_predateur,(_polygon.z-predateur.polygon.z)*_peur / distance_predateur);
   var ailleurs:Vector3D=vecteur_alea(_vitesse*_liberté);
 
   var destination:Vector3D= new Vector3D((_ami.polygon.x * _amitié + meneur.polygon.x * _cohésion + (ailleurs.x+_polygon.x) * _liberté) / _volonté - _polygon.x,(_ami.polygon.y * _amitié + meneur.polygon.y * _cohésion + (ailleurs.y+_polygon.y) * _liberté) / _volonté -_polygon.y,(_ami.polygon.z * _amitié + meneur.polygon.z * _cohésion + (ailleurs.z+_polygon.z) * _liberté) / _volonté - _polygon.z);
   /*_v.x = _v.x * .8 + destination.x * .01 + peur.x;
   _v.y = _v.y * .8 + destination.y * .01 + peur.y;
   _v.z = _v.z * .8 + destination.z * .01 + peur.z;*/

   var depl:Vector3D = new Vector3D(destination.x * .01 + peur.x,destination.y * .01 + peur.y,destination.z * .01 + peur.z);
   /*var axe:Vector3D = _v.crossProduct(predateur.vecteur_vitesse);
   axe.normalize();*/

   //depl = new Vector3D(0,0,10);

   // Rotation
   var angle:Vector3D = new Vector3D(Vector3D.angleBetween(depl,Vector3D.X_AXIS),Vector3D.angleBetween(depl,Vector3D.Y_AXIS),Vector3D.angleBetween(depl,Vector3D.Z_AXIS));
 
   _omega.x = angle.x;
   _omega.y = angle.y;
   _omega.z = angle.z;
 

   var deplacement:Matrix3D = new Matrix3D();
   deplacement.position = depl;
   //trace(depl);
 
 
 
   //deplacement.appendTranslation(_v.x,_v.y,_v.z);
   //deplacement.pointAt(depl,Vector3D.Y_AXIS,Vector3D.Y_AXIS);
   deplacement.appendRotation(-5,Vector3D.X_AXIS);
   deplacement.appendRotation(3,Vector3D.Y_AXIS);
   deplacement.appendRotation(-1,Vector3D.Z_AXIS);
   _matricePosition.prepend(deplacement);
   //trace(_matricePosition);
   _polygon.transform.matrix3D = _matriceRota.clone();
   _polygon.transform.matrix3D.append(_matricePosition);

  }
 

Ce qui donne ça :



- Afficher le SWF -
Fichier joint  oiseauxOrient.swf   21.92 Ko   5 téléchargement(s)

C'est comme si il n'y avait aucune translation...
NB : Je n'ai pas appliqué la même procédure au prédateur (forme de couleur)

Edit :

Je pense avoir comprit pourquoi ça marchait pas.
Le calcul de déplacement n'est pas bon et ne correspond pas à mon déplacement d'origine...


En mettant :

public function deplacement(predateur:Predateur,meneur:Individu):void
  {

   // Translation
   var distance_predateur = (predateur.polygon.x - _polygon.x) * (predateur.polygon.x - _polygon.x) + (predateur.polygon.y - _polygon.y) * (predateur.polygon.y - _polygon.y) + (predateur.polygon.z - _polygon.z)*(predateur.polygon.z - _polygon.z);
   var peur:Vector3D = new Vector3D((_polygon.x-predateur.polygon.x) * _peur / distance_predateur, (_polygon.y-predateur.polygon.y)*_peur / distance_predateur,(_polygon.z-predateur.polygon.z)*_peur / distance_predateur);
   var ailleurs:Vector3D=vecteur_alea(_vitesse*_liberté);
   var destination:Vector3D= new Vector3D((_ami.polygon.x * _amitié + meneur.polygon.x * _cohésion + (ailleurs.x+_polygon.x) * _liberté) / _volonté - _polygon.x,(_ami.polygon.y * _amitié + meneur.polygon.y * _cohésion + (ailleurs.y+_polygon.y) * _liberté) / _volonté -_polygon.y,(_ami.polygon.z * _amitié + meneur.polygon.z * _cohésion + (ailleurs.z+_polygon.z) * _liberté) / _volonté - _polygon.z);
   _v.x = _v.x * .8 + destination.x * .01 + peur.x;
   _v.y = _v.y * .8 + destination.y * .01 + peur.y;
   _v.z = _v.z * .8 + destination.z * .01 + peur.z;
   //var depl:Vector3D = new Vector3D(destination.x * .01 + peur.x,destination.y * .01 + peur.y,destination.z * .01 + peur.z);
   /*var axe:Vector3D = _v.crossProduct(predateur.vecteur_vitesse);
   axe.normalize();*/

   //depl = new Vector3D(0,0,10);
   // Rotation
   var angle:Vector3D = new Vector3D(Vector3D.angleBetween(_v,Vector3D.X_AXIS),Vector3D.angleBetween(_v,Vector3D.Y_AXIS),Vector3D.angleBetween(_v,Vector3D.Z_AXIS));
   _omega.x = angle.x;
   _omega.y = angle.y;
   _omega.z = angle.z;

   var deplacement:Matrix3D = new Matrix3D();
   deplacement.position = _v;
   //trace(depl);
   //deplacement.appendTranslation(_v.x,_v.y,_v.z);
   //deplacement.pointAt(depl,Vector3D.Y_AXIS,Vector3D.Y_AXIS);
   deplacement.appendRotation(1,Vector3D.X_AXIS);
   deplacement.appendRotation(3,Vector3D.Y_AXIS);
   deplacement.appendRotation(-1,Vector3D.Z_AXIS);
   _matricePosition.prepend(deplacement);
   //trace(_matricePosition);
   _polygon.transform.matrix3D = _matriceRota.clone();
   _polygon.transform.matrix3D.append(_matricePosition);

  }
 

Cela donne:


- Afficher le SWF -
Fichier joint  oiseauxOrient.swf   21.95 Ko   3 téléchargement(s)

#11 Nelchaël

  • Members
  • PipPipPipPipPipPipPipPip
  • 1900 messages

Posté 09 March 2013 - 17:06 PM

Rapidement :
La matrice de rotation doit être en fonction du vecteur "_v".
Si ce vecteur est modifié dans la fonction de déplacement, la matrice de rotation doit l'être en conséquence.

Sinon, essaie plutôt mon dernier code plus général.
Je te remets la fonction avec quelques commentaires :

//On mémorise la position précédente
        var vr3D_prec:Vector3D=mx3D_posi.position.clone();

//On calcule la nouvelle position
        mx3D_posi.prepend(mx3D_depl);

//On oriente le triangle selon le déplacement effectué
        mx3D_tria.identity();
        mx3D_tria.pointAt(mx3D_posi.position.subtract(vr3D_prec),new Vector3D(0,-1,0),new Vector3D(0,0,-1));

//On positionne le triangle sans modifier son orientation
        mx3D_tria.position=mx3D_posi.position.clone();
 
Le triangle sera orienté dans le bon sens (du moins si tu l'as dessiné pointe en haut, sinon il y aura une retouche à faire).
Le petit défaut éventuellement est qu'il tournoiera un peu sur son axe. Si besoin, tu pourras affiner ce point ensuite.
nelchael.fr freelance flash CS6

#12 charlesd

    Ceinture Jaune

  • Members
  • PipPip
  • 29 messages

Posté 09 March 2013 - 18:52 PM

à quoi correspondent les coordonnées des vecteurs dans les deux autres arguments de la fonction pointAt ? J'ai été voir dans la doc mais je pige pas bien de quoi il s'agit
Si je laisse tes valeurs je n'ai pas le même résultat que toi...

#13 Nelchaël

  • Members
  • PipPipPipPipPipPipPipPip
  • 1900 messages

Posté 09 March 2013 - 20:55 PM

Si j'ai bien compris, le deuxième paramètre correspondra à la pointe du triangle (celle qui suit le mouvement).
Par exemple, si la pointe du triangle est dessinée à droite (donc vers x positif), on mettra un vecteur (1,0,0).
Si elle est vers le bas (y positif), on mettra (0,1,0).
Pour le troisième, c'est le dessus : (0,0,1) et (0,0,-1) devraient convenir pareillement dans ton cas.
nelchael.fr freelance flash CS6

#14 charlesd

    Ceinture Jaune

  • Members
  • PipPip
  • 29 messages

Posté 09 March 2013 - 22:01 PM

Bon j'ai encore fait d'autres essais...
On dirait que certaines rotations fonctionnent bien, mais ils s'effectuent toujours des translation en particulier sans que l'oiseau se retourne et pointe vers là où il va.
En réalité je crois qu'il y a un bug dans la translation.
Je ne sais déjà pas quoi utiliser entre prependTranslation et appendTranslation.
Au paravant j'ajoutais le vecteur _v (qui est en fait un déplacement "élémentaire") à mon vecteur position. Je ne sais pas comment faire de même avec les matrices ?
Voici mon script:

  public function Individu():void
  {
   //graphics.beginFill(uint(Math.random()*0xFFFFFF),0.3);
   /*graphics.beginFill(000000,0.3);
 
   graphics.drawRect(0,0,2,2);
 
   graphics.endFill();*/

   var pointA:Vector3D = new Vector3D(-5,0,0);
   var pointB:Vector3D = new Vector3D(0,-30,0);
   var pointC:Vector3D = new Vector3D(5,0,0);
 
   var tab:Array = new Array(pointA,pointB,pointC);
   _points = tab;
   _polygon = new Polygon3D(tab,false);
   addChild(_polygon);
   _polygon.x=(Math.random()-.5)*400;
   _polygon.y=(Math.random()-.5)*400;
   _polygon.z=(Math.random()-.5)*400;
   /*_polygon.x = 0;
   _polygon.y = 0;
   _polygon.z = -400;*/

   //_v = vecteur_alea(_vitesse);
   _v = new Vector3D(5,-5,10);
   _omega = vecteur_alea(360);
 
   _matricePoly=new Matrix3D;
   _matricePoly=_polygon.transform.matrix3D;
 
   _matricePosition = new Matrix3D();
   _matricePosition.appendTranslation(_polygon.x,_polygon.y,_polygon.z);
 
   /*_matriceRota = new Matrix3D();
   _matriceRota.pointAt(_v,new Vector3D(0,-1,0),new Vector3D(0,0,-1));*/

 
 
   /*_matriceRota.appendRotation(_omega.x,Vector3D.X_AXIS);
   _matriceRota.appendRotation(_omega.y,Vector3D.Y_AXIS);
   _matriceRota.appendRotation(_omega.z,Vector3D.Z_AXIS);*/

   _matricePoly.pointAt(_v,new Vector3D(0,1,0),new Vector3D(0,0,-1));
 
   _matricePoly.position=_matricePosition.position.clone();


   /*rotationX=(Math.random()-.5)*360;
   rotationY=(Math.random()-.5)*360;
   rotationZ=(Math.random()-.5)*360;*/


  }
  public function deplacement(predateur:Predateur,meneur:Vector3D):void
  {
   var v_prec = _v;
 
   // Translation
   var distance_predateur = (predateur.polygon.x - _polygon.x) * (predateur.polygon.x - _polygon.x) + (predateur.polygon.y - _polygon.y) * (predateur.polygon.y - _polygon.y) + (predateur.polygon.z - _polygon.z)*(predateur.polygon.z - _polygon.z);
   var peur:Vector3D = new Vector3D((_polygon.x-predateur.polygon.x) * _peur / distance_predateur, (_polygon.y-predateur.polygon.y)*_peur / distance_predateur,(_polygon.z-predateur.polygon.z)*_peur / distance_predateur);
   var ailleurs:Vector3D=vecteur_alea(_vitesse*_liberté);
   var destination:Vector3D= new Vector3D((_ami.polygon.x * _amitié + meneur.x * _cohésion + (ailleurs.x+_polygon.x) * _liberté) / _volonté - _polygon.x,(_ami.polygon.y * _amitié + meneur.y * _cohésion + (ailleurs.y+_polygon.y) * _liberté) / _volonté -_polygon.y,(_ami.polygon.z * _amitié + meneur.z * _cohésion + (ailleurs.z+_polygon.z) * _liberté) / _volonté - _polygon.z);
   _v.x = _v.x * .8 + destination.x * .01 + peur.x;
   _v.y = _v.y * .8 + destination.y * .01 + peur.y;
   _v.z = _v.z * .8 + destination.z * .01 + peur.z;
   //var depl:Vector3D = new Vector3D(destination.x * .01 + peur.x,destination.y * .01 + peur.y,destination.z * .01 + peur.z);
   /*var axe:Vector3D = _v.crossProduct(predateur.vecteur_vitesse);
   axe.normalize();*/

   //depl = new Vector3D(0,0,10);
   // Rotation
   var angle:Vector3D = new Vector3D(Vector3D.angleBetween(_v,Vector3D.X_AXIS),Vector3D.angleBetween(_v,Vector3D.Y_AXIS),Vector3D.angleBetween(_v,Vector3D.Z_AXIS));
   _omega.x = angle.x;
   _omega.y = angle.y;
   _omega.z = angle.z;
 

   var deplacement:Matrix3D = new Matrix3D();
   deplacement.position = _v;
   //trace(depl);
 
 
 
   //deplacement.appendTranslation(_v.x,_v.y,_v.z);
   //deplacement.pointAt(depl,Vector3D.Y_AXIS,Vector3D.Y_AXIS);
   /*deplacement.appendRotation(2,Vector3D.X_AXIS);
   deplacement.appendRotation(2,Vector3D.Y_AXIS);
   deplacement.appendRotation(2,Vector3D.Z_AXIS);*/

   _matricePosition.prependTranslation(_v.x,_v.y,_v.z);
   _matricePoly.identity();
   _matricePoly.pointAt(_matricePosition.position.subtract(v_prec),new Vector3D(0,1,0),new Vector3D(0,0,-1));
 
 
   _matricePoly.position = _matricePosition.position.clone();
 
   //trace(meneur.polygon.x);
  }
 

ce qui donne



- Afficher le SWF -
Fichier joint  oiseauxOrient.swf   22.06 Ko   2 téléchargement(s)

Merci encore

#15 Nelchaël

  • Members
  • PipPipPipPipPipPipPipPip
  • 1900 messages

Posté 09 March 2013 - 22:31 PM

Une erreur ici :
var v_prec = _v;
Plutôt ceci :
var v_prec:Vector3D=_matricePoly.position.clone();

Citation

Au paravant j'ajoutais le vecteur _v (qui est en fait un déplacement "élémentaire") à mon vecteur position. Je ne sais pas comment faire de même avec les matrices ?
Comme tu l'as fait ici, ça paraît bien correspondre :
_matricePosition.prependTranslation(_v.x,_v.y,_v.z);

Citation

Je ne sais déjà pas quoi utiliser entre prependTranslation et appendTranslation.
Il n'est pas évident de bien se représenter la chose, le mieux est sans doute de faire des tests dans un .fla à part avec juste un clip.
nelchael.fr freelance flash CS6

#16 charlesd

    Ceinture Jaune

  • Members
  • PipPip
  • 29 messages

Posté 09 March 2013 - 22:54 PM

Génial, ça marche enfin. Je met le fichier dans 5 minute quand j'ai finit les dernières modifs
Merci beaucoup :D

#17 charlesd

    Ceinture Jaune

  • Members
  • PipPip
  • 29 messages

Posté 09 March 2013 - 23:23 PM

Et voilà, pour ceux que ça intéresse

Nelchael, tu m'auras été d'une aide précieuse ! Merci beaucoup !

#18 Nelchaël

  • Members
  • PipPipPipPipPipPipPipPip
  • 1900 messages

Posté 09 March 2013 - 23:56 PM

Oui, c'est bien orienté à présent.
Comme prévu, le triangle pivote sur son axe par moments.
Le rendu est bien sinon. :cool:
nelchael.fr freelance flash CS6



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

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

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP