Coordonnées des points d’une sphère
1st novembre, 2009 par FlozVendredi, avec des potes de promo on s’est mis en tête de transformé un exercice de flash en l’occasion de se faire une petite battle expérimentale.
En gros, chacun de nous va faire une sorte de planète qui sera intégrée un swf final. Le but étant que lorsqu’on cliquera sur cette planète, des particules (ou autres) en sortiront pour se balader dans l’écran ou attaquer les autres.
Ça peut être bien funky, et puis c’est l’occasion de mettre les mains dans un taff un peu différent de ce que je fais en règle générale.
David (un des potes participant) m’avait fait rêver en me montrant ça, que je trouve bien chouettos, et j’ai eu l’occasion de fouiller dans wonderfl pour regarder ce qui s’y trouve. Ben c’est violent. ![]()
Je suis tombé sur cette sphère en 3D dont je me suis totalement inspiré.
Cet exercice aura été l’occasion pour moi de jouer avec l’api du flash player 10, notamment les Matrix3D, Utils3D et Vector3D; qui sont des supers outils. Il va falloir que je continue à regarder de ce côté !
Le premier résultat :
Le plus chiant aura été de trouver les coordonnées des points sur une sphère. Sur un cercle, ok pas de souci, mais sur une sphère ça se complique.
Je suis arrivé sur cette page de wikipédia, qui parlait des coordonnées sphérique, le seul problème c’est que leurs formules ne sont pas appropriées au repère de flash, mais à un repère cartésien. (Le repère de flash a l’axe des z inversé).
Du coup j’ai continué de googleisé, parce que mon pauvre savoir trigonométrique s’arrête au plan, et je suis tombé sur cette page. Et là, jackpot; les sin/cos ne sont pas les même et fonctionnent parfaitement dans flash.
Résultat :
x = r * cos(phi) * cos(theta);
y = r * cos(phi) * sin(theta);
z = r * sin(phi);
“theta” doit être compris entre 0 et 360° et “phi” entre 0 et 90°, et “r” correspond au rayon de la sphère.
J’ai un peu continué pour tenté de mettre un noyau comme centre de la sphère, mais ça bougera surement par la suite.
Pour ceux qui seraient intéressés par les sources, elles sont téléchargeables ici.
A suivre !
Passer par des LinkedList pour gagner en performances
30th mai, 2009 par FlozEn ce moment, je passe pas mal de temps à feuilleter le wiki de Joa Ebert, afin de gagner en propreté de code et en performances. Dans son wiki, il y est question de LinkedList ainsi que de Pool.
En lisant l’exemple, je ne comprenais pas vraiment à quoi cela pouvait il servir (même si, sur le papier ça avait l’air cool), ni comment s’en servir…
Puis j’ai commencé à m’y intéressé plus sérieusement et à utiliser une LinkedList en partiel de Flash.
Il nous était demandé de faire un equalizer, et j’ai choisis de jouer avec du BitmapData et des modifications de pixels. En gros, une boucle plus ou moins grosse en enterFrame à manipuler.
Sachant que les LinkedList permettent de gagner en performances car :
- Passer par ce type de structures permet de stocker des objets plus rapidement,
- Itérer au sein d’une LinkedList est plus rapide que d’itérer un tableau ou autre (ce n’est plus le cas avec le FlashPlayer 10 et les Vector typé et fixes ? cf. Away3D)
Je me suis dis que c’était le moment d’essayer. Le résultat :
Cliquez pour lancer l’anim. Recliquer pour la stopper. Sachant que le swf fait 1mo (il transporte le mp3 - Boards of Canada : Diving Station).
Bref, le rendu me plait bien, et c’est fluide. Même s’il n’y a que 256 pixels par secondes à 30FPS. Vous pouvez télécharger les sources en cliquant ici.
Bossant sur un projet en parallèle, je commencais à réfléchir en terme de réorganisation de code. Et c’est là que j’en suis revenu à ces histoires de Pool (j’en parlerai dans un autre post, je n’ai pas encore assez fouillé là dessus) et de LinkedList.
Du coup, je me suis dis que j’allais tenter de les utiliser au sein de mon effet de désintégration.
Résultat avec l’ancienne version :
Résultat avec la nouvelle version :
En fonction des pcs, les différences de résultat est plus ou moins flagrant.
Les performances sont gagnées sur le fait qu’on ne passe plus par des tableaux, et que la manipulation performante au final. Cool
Bon c’est bien tout ça, mais à quoi ça ressemble une LinkedList ? Je vous invite à regarder l’explication de Joa Ebert.
Puis, pour prendre mon equalizer comme exemple, ça donne :
En l’occurence, j’ai crée un objet Particle, qui correspond à des pixels de mon bitmapdata/equalizer :
package
{
public class Particle
{
public var px:Number = 0;
public var py:Number = 0;
public var next:Particle;
}
}
Une méthode d’instanciation de tous les objets de la LinkedList :
private function createParticles():void
{
// _particles sera la variable de référence de la LinkedList.
_particles = new Particle();
var currentParticle:Particle = _particles;
var numParticles:int = NUM_PARTICLES;
while ( --numParticles != 0 )
currentParticle = currentParticle.next = new Particle();
}
Un exemple d’itération au sein d’une LinkedList :
private function setParticlesPositions():void
{
// Comme je le disais précédemment : on crée une variable dans laquelle on stocke notre objet de référence de la LinkedList (notre point de départ, en quelque sorte).
var particle:Particle = _particles;
var px:Number = stage.stageWidth * .5;
var py:Number = stage.stageHeight * .5;
while ( particle )
{
particle.px = px;
particle.py = py;
// On passe à l'élément suivant; jusqu'à ce qu'il n'y en ait plus.
particle = particle.next;
}
}
Joa Ebert en parle aussi ici avec un superbe exemple. Il disait qu’il s’en servait aussi dans son moteur de tween qui était, grâce à tout ça, plus performant que les Tweenlite ou Tweener.
Effet de désintégration en AS3 via Bitmap et BitmapData
7th mai, 2009 par FlozJ’avais une petite idée de transition pendant le développement de mon portfolio floz.fr en as3. Cette idée m’était venu d’un travail de André Michelle, sur des effets d’explosion via des manipulations sur des objets BitmapData. Il utilise notamment les méthodes getPixel() et setPixel() de BitmapData au lieu de passer par des tweens et donc de sauver des performances.
En effet, dans mon effet de désintégration (pour le moment nommé “Rain” et “RainBack”), je manipule tous les pixels de l’image afin de les faire tomber. Une sorte de pluie de pixel :
Sur des petites images, c’est fluide sans problème. Mais plus l’image sera grande, et plus les performances chuteront. Ainsi, l’effet est à utiliser avec plus ou moins de modération en fonction de l’image sur lequel on l’applique !
Les classes sont dispos sur le google code du package minuit4, et dans un .rar les contenant. Les classes sont fonctionnelles, mais sont encore sujettes à des modifications. Non pas dans leur fonctionnement en soit, mais plutôt dans l’instanciation. Je pense les réorienter vers un fonctionnement similaire à tweenlite. A suivre !
Un petit exemple d’utilisation :
import fr.minuit4.animation.rain.Rain; var r:Rain = new Rain( new Icone( 0, 0 ) ); // Icone correspond à un DisplayObject dispo dans la bibliothèque de flash. r.addEventListener( Event.COMPLETE, onComplete ); addChild( r ); r.start();
Et l’effet sur une image plus grosse, avec l’outil de contrôle des FPS du package minuit4 afin vérifier les performances de l’application. Cliquez sur la scène pour lancer l’effet.
Grosse mise à jour au niveau des performances ici.



