tween aléatoire dans l'espace

ran3d


et voici le code:
import mx.transitions.Tween;
import mx.transitions.easing.Regular;
import com.robertpenner.geom.Vector3d;
import com.robertpenner.display.Graphic3d;
var sw:Number = Stage.width;
var sh:Number = Stage.height;
var c:Number = sw/1.5;

//l'objet dont les coordonnées sont interpolées
var pt:Vector3d = new Vector3d(Math.random()*c-c/2, Math.random()*c-c/2, Math.random()*c-c/2);
var dx:Number = Math.random()*c-c/2-pt.x;
var tx:Tween = new Tween(pt, "x", Regular.easeInOut, pt.x, pt.x+dx, Math.abs(dx)/5, false);
var dy:Number = Math.random()*c-c/2-pt.y;
var ty:Tween = new Tween(pt, "y", Regular.easeInOut, pt.y, pt.y+dy, Math.abs(dy)/5, false);
var dz:Number = Math.random()*c-c/2-pt.z;
var tz:Tween = new Tween(pt, "z", Regular.easeInOut, pt.z, pt.z+dz, Math.abs(dz)/5, false);

//quand une tween est finie, on la relance
tx.onMotionFinished = function() {
var dx:Number = Math.random()*c-c/2-pt.x;
this.continueTo(pt.x+dx, Math.abs(dx)/5);
};
ty.onMotionFinished = function() {
var dy:Number = Math.random()*c-c/2-pt.y;
this.continueTo(pt.y+dy, Math.abs(dy)/5);
};
tz.onMotionFinished = function() {
var dz:Number = Math.random()*c-c/2-pt.z;
this.continueTo(pt.z+dz, Math.abs(dz)/5);
};

//code pour la visualisation de l'exemple
//ici les coordonnées du point sont copiées dans un tableau qui est actualisé dans le onChanged
var ref:MovieClip = this;
var tab:Array = new Array();
var l:Number = 100;
for (var i:Number = 0; i < l; i++) {
tab.push(pt.getClone());
}
tx.onMotionChanged = function() {
ref.clear();
//on récupèreune projection sur l'écran des points 3d
var current:Vector3d = tab[0].persProjectNew();
ref.moveTo(current.x+sw/2, current.y+sh/2);
for (var i:Number = 1; i < l; i++) {
current = tab[i].persProjectNew();
var pers = tab[i].getPerspective();
//l'épaisseur varie en fonction de la profondeur et de l'index du point
ref.lineStyle(pers*50*i/l);
ref.lineTo(current.x+sw/2, current.y+sh/2);
}

//gestion des touches
if (Key.isDown(37)) {
for (var i = 0; i < l; i++) {
tab[i].rotateY(5);
}
} else if (Key.isDown(39)) {
for (var i = 0; i < l; i++) {
tab[i].rotateY(-5);
}
}
if (Key.isDown(38)) {
for (var i = 0; i < l; i++) {
tab[i].rotateX(5);
}
} else if (Key.isDown(40)) {
for (var i = 0; i < l; i++) {
tab[i].rotateX(-5);
}
}
tab.shift();
tab.push(pt.getClone());
};

Il n’y a pas de différence majeure avec la version 2d si ce n’est qu’au moment de l’affichage il faut récupérer une projection 2d de chaque point et que l’épaisseur du trait varie avec la profondeur.
Par contre j’aurai voulu mettre des variations de couleurs en fonction de la profondeur mais il faudrait gérer l’ordre d’affichage des lineTo et là ça devient plus dur

Maintenant j’aimerai bien voir pour une adaptation en as3 si possible en utilisant la classe Point à la place de la classe Vector (ou au moins comme superclasse) histoire d’utiliser les outils proposés par flash…

4 Responses to “tween aléatoire dans l'espace”

  1. thecaptain says:

    héhé ca donne vachement bien ^^

  2. Tchup says:

    ça y est… le singe a bouffé un ver de l’espace !
    beau travail ;)

  3. jeanphilippe says:

    bravo,
    très sympa l’effet :)

  4. lambot says:

    J’ai une question concernant le code si joint, En premier temps bravo bon travail sa me plais.

    Ma question est celle ci, si je fais un clip ou dois je le mettre dans le code présenté pour qu’il réagisse à l’effet?

    Bien à vous

Leave a Reply