javascript, javascripts, js, jscript, scripts, script, html, dhtml, dynamic, cookies, menu, frames, formulaire, source, code, gratuit, exemple, developper, html, php4, php3, php, mysql, liens, php2, forum, livre d'or, pages, web, dynamiques, programmation, webmasters, webmestres, tutorial, tutoriel, annuaires, espace, membres, banniéres, caddies, chats, compteurs, formulaires, forums, gestion, documentations, news, mailing, list, newsletter, moteurs, recherche, sondages, votes, statistiques, autres, agendas, calendriers, mail, annonces, audio, outils, réseaux, graphique, recommandation, site, sécurité, portail, creation, actualité, moteur de recherche, moteur, trucs, astuces, services, flash, action script, actionscript Tutoriaux : Flash - ActionScript
Script Masters : Javascript, Php, Mysql, html pour Webmasters!
 
    Script Masters
 
    Espace membre
 
    Langages
 
    Autres ressources
 
    Ressources graphiques
 
    Recherche
 
    Kit graphique
 
    Liens
 
    Statistiques


 


Télécharger les sources de cet article


Untitled Document
Flash : Rotation 3D


Tutorial écrit par : Keith Peters - www.bit-101.com
Traduction : Gasp - Oui-oui.org


   Introduction

 

 

Voici un tutorial sur la rotation d'objets dans Flash. Nous devrions plutôt utiliser les termes "tourner" ou "mettre en orbite" qui s'avèrent plus appropriés. Les objets eux-même ne vont pas pas tourner mais bougeront autour d'un point central.

 

Intéressons nous tout d'abord aux fondements de la 3D


Largeur : Gauche à droite
Hauteur : Haut à bas
Et la profondeur : Proche à loin.
Un écran ne représente que deux dimensions : Largeur et Hauteur.
Pour représenter la profondeur, nous devrons user de différentes astuces, la plus évidente étant celle de la perpective : Tant que les objets s'éloignent, plus ils rapetissent. Ils se déplacent vers un point central invisible, s'effacent selon un degré d'atmosphère. Tous ces effets peuvent être crées facilement dans Flash.
En informatique, la hauteur est représentée par Y, ou bien dans flash avec les propriétés :_y, _yscale et _height.
La largeur est représentée par X et les propriétés _x,_xscale et _width.
La profondeur est représentée par Z mais flash est un programme 2D et n'a pas de propriété _y, néammoins nous pouvons en créer une !


La rotation
 

Maintenant, parlons de la rotation. Il existe 3 façons de faire tourner un objet.

La rotation Z. C'est comme une horloge ou un volant. L'objet ne se rapproche pas de vous ou ne s'éloigne pas, mais sa position X et Y change.

La rotation Y. Pensez à un manège ou bien un radio-cassette. La hauteur ne change pas mais l'ordonnée (X) (gauche à droite) et z ,eux, changent.

La rotation X. Pensez à une scie circulaire. La hauteur (Y) et profondeur changent mais pas de gauche à doite (X).


Flash supporte la rotation Z pour les movie clips grâce à la propriété _rotation. Mais c'est une rotation droite - tourne autour de son propre centre. Si nous voulons mettre en orbite un clip comme une planète autour du soleil, nous devrons appronfondir notre processus.

Le problème basique est comment mouvoir quelque chose autour d'un point central. La distance de ce point central devra toujours être la même, allez... disons 100 pixels.
Bien, nous avons un radius de 100 et un angle qui s'étend de 0 à 360. A partir de ça, nous devons calculer la position _x et _y. Voici la formule !

Script :
_x=Math.cos(angle)*radius+xcenter;
_y=Math.sin(angle)*radius+ycenter;

 

Radians
 

Je ne vais pas rentrer dans les détails de la trigonométrie maintenant mais c'est très simple. Sachez juste que ça marche ! Cependant l'angle doit être en radians. C'est un système différent des degrés. Vous devrez donc convertir les degrés en radians.Utilisez donc cette formule :

Script :
rad=degree*Math.PI/180;

Maintenant nous avons juste besoin d 'une boucle qui incrémente (augmente) l'angle de 0 à 360 et vous aurez un mouvement circulaire.
Créez donc un movieclip, placez-le sur la scène et insérez le code suivant dessus :

Script :
onClipEvent(load){
speed=5;
radius=100;
xcenter=250;
ycenter=200;
angle=0;
}

onClipEvent(enterFrame){
_x=Math.cos(angle*Math.PI/180)*radius+xcenter;
_y=Math.sin(angle*Math.PI/180)*radius+ycenter;
angle+=speed;
if(angle>359){
angle-=360;
}
}

Testez et vous devriez avoir votre clip bougeant autour d'un cercle. Ce n'est pas de la 3D encore mais c'est une étape importante.

 

Rotation Y
 

Essayons la rotation Y.

Imaginez le cercle que vous aviez avant, mais tirez le haut vers vous et poussez le bas au loin jusqu'à ce qu'il devienne plat. Y est devenue Z mais X reste le même.
Nous devons donc substituer Z pour _y;

Script :
onClipEvent(load){
y=0;
speed=5;
radius=100;
xcenter=250;
ycenter=200;
zcenter=100;
angle=0;
}

onClipEvent(enterFrame){
_x=Math.cos(angle*Math.PI/180)*radius+xcenter;
_y=y+ycenter;
z=Math.sin(angle*Math.PI/180)*radius+zcenter;
angle+=speed;
if(angle>359){
angle-=360;
}
}

Remarquez que j'ai ajouté une valeur zcenter dans la section (load) et changé ycenter to zcenter dans la section (enterFrame). Jouez avec cette valeur. Un nombre plus élevé éloignera l'animation de vous. Un inférieur le rapprochera de vous. J'ai aussi défini une valeur pour _y. Autrement _y aurait été à 0 et le clip entier aurait été placé en haut de l'écran.
Si vous testez maintenant, le clip ne fera que se déplacer de gauche à droite. Bien que nous ayons défini une valeur z, nous n'avons rien fait avec. Nous allons l'utiliser pour générer un redimensionnement, comme ça nous aurons un petit effet de 3D.

Comment obtenir un effet de perspective réaliste ? Croyez-moi ou non mais nous devrons user des théories optiques.

 

Focale
 

D'abord, nous devons poser une longueur de focale qui est la distance théorique du point de vue à l'écran. Nous allons la définir à 150 pour l'instant. Bien entendu rien ne vous empêche d'ajuster selon votre envie cette valeur... La focale ne changera pas, alors nous la plaçons dans la section (load) du code.

Script :
fl=150;

Nous avons besoin d'une échelle. Basée sur la focale et z. La formule est

Script :
scale=fl/(fl+z);

Elle résulte toujours avec un décimal entre 0 et 1. Quand z=0, l'échelle sera 1.0. Lorsque z augmente, l'échelle diminue jusqu'à 0. Nous pouvons donc l'utiliser pour programmer _xscale et _yscale pour notre objet.

Script :
_xscale= _yscale = scale*100;

Voici le code final :

Script :
onClipEvent(load){
y=0;
speed=5;
radius=100;
xcenter=250;
ycenter=200;
zcenter=100;
angle=0;
fl=150;
}

onClipEvent(enterFrame){
_x=Math.cos(angle*Math.PI/180)*radius+xcenter;
_y=y+ycenter;
z=Math.sin(angle*Math.PI/180)*radius+zcenter;
scale=fl/(fl+z);
_xscale= _yscale = scale*100;
angle+=speed;
if(angle>359){
angle-=360;
}
}

Testez. C'est pas mal jusqu'à présent ! Mais nous pouvons faire mieux et plus réaliste.

J'ai précisé plus tôt que lorsque un objet rétrécit dans la distance, il se dirige vers un point transparent. Dans notre exemple au dessus, nous avons y=0, qui est le niveau de l'oeil et déjà au point central (le fameux point transparent). Donc vous ne pourrez pas voir de changement.
Mais disons que y = 100. Cela serait sous nos yeux et nous devrions le voir bouger vers le haut. Pareillement, si y était inférieur à 0, le clip serait au-dessus de nous et il se déplacerait vers l'horizon en descendant, comme si il s'en allait... Reviens ! Reviens ! J'ai les mêmes à la maison !

Pour _x, nous devons d'abord calculer la position sur le cercle, l'assigner à x, l'ajuster pour la perspective et l'assigner à _x.

Script :
onClipEvent(load){
y=100;
speed=5;
radius=100;
xcenter=250;
ycenter=200;
zcenter=100;
angle=0;
fl=150;
}

onClipEvent(enterFrame){
z=Math.sin(angle*Math.PI/180)*radius+zcenter;
scale=fl/(fl+z);
x=Math.cos(angle*Math.PI/180)*radius;
_x=x*scale+xcenter;
_y=y*scale+ycenter;
_xscale= _yscale = scale*100;
angle+=speed;
if(angle>359){
angle-=360;
}
}

Notez que nous devons d'abord programmer z et l'échelle, comme ça c'est bon pour le reste du code. Essayez de changer les valeurs initiales y pour obtenir des rotation à différentes hauteurs. Essayez avec des nombres négatifs aussi.

C'est aussi réaliste que vous puissiez en termes d'échelle (redimensionnement) et positionnement. Pour la touche finale, vous pouvez ajouter une atmosphère en programmant une propriété _alpha basé sur l'échelle :

Script :
_alpha=scale*100;

En jouant avec le chiffre 100, vous pouvez varier l'atmosphère.

La prochaine étape serait d'ajouter de multiples objets se déplaçant autour du cercle. Pour les avoir espacer suffisamment, vous ajustez l'angle initial de chacun. Divisez 360 par le nombre d'objets et ajoutez-y le résultat.

Exemple :
Vous avez 10 objets. 360/10 = 36. Angle initial pour chaque objet.

Object 1: angle =36;
Object 2: angle =72;
Object 3: angle =108;
...

Faites-le soit manuellement soit à l'aide d'une boucle for()

 

Note additionnelle
 

J'ai codé tout ça avec onClipEvent's pour faciliter l'explication. Je vous recommende de mettre tout ce code à l'intérieur du clip sur sa propre timeline. Par exemple, mettez le code onClipEvent(load) (les constantes) dans la frame l, placez les actions onCLipEvent(enterFrame) dans la frame 2, et mettez dans la frame 3 une action gotoAndPlay (2);
De cette façon, le code est construit à l'intérieur de l'objet et vous n'avez plus qu'à le sortir de la librairie et faire plusieur copies, l'utiliser dans d'autres animations... sans avoir à recréer toute la programmation.

 

Conclusion
 

Pour toute question, n'hésitez pas à vous rendre sur le forum. Les sources sont disponibles ici.

GAsp

 

- Un problème? Posez vos questions sur le forum Flash/ActionScript!
- Ce tutorial a été consulté 86028 fois
- Afficher ce tutorial au format imprimable


Script Masters © Ce texte est la propriété de son auteur.
Toute reproduction est interdite.

 




 
Votre nom de domaine est-il libre?
 
Fabien Daniel - fd-web.net © 2001-2008 | Hebergement : OVH | CNIL : 796128