begin process at 2012 02 04 13:07:19
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

ActionScripts

 > OBJETS EN 3D FILAIRE

OBJETS EN 3D FILAIRE


 Information sur la source

Note :
9,2 / 10 - par 5 personnes
9,20 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :ActionScripts Niveau :Débutant Date de création :30/12/2004 Date de mise à jour :07/01/2005 10:18:59 Vu / téléchargé :7 738 / 903

Auteur : Dri

Ecrire un message privé
Commentaire sur cette source (20)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Pour mon premier programe en flash j'ai bricolé un bête "moteur 3D" filaire...
Il s'agit juste d'afficher un objet et de le faire tourner... L'objet est sélectionné dans une liste d'objets à définir... Pour ajouter un objet il suffit d'ajouter un calque dans le dossier des objets 3D et de reprendre le code Action Script d'un autre calque  'Objet 3D' et de définir ses sommets et ses arrêtes...
Les calques fil de fer et affichage sont à conserver respectivement en première et dernière position pour que cela fonctionne... Comme je débute en flash je n'ai pas vraiment s gérer les images des calques alors j'ai procédé comme ca...
Le dernier point :
Comme je l'ai fait avant tout pour moi (et aussi parce que je ne sais pas faire), c'est prévu pour fonctionner en 150*100 pixels... je ne sais pas récupérer la résolution du calque en cours...

Source

  • //Surface de dessin
  • this.createEmptyMovieClip("surface3D", 0);
  • //Les dimensions du calque
  • largeur = 600;
  • hauteur = 400;
  • //Classe Point3D
  • //Constructeur
  • function Point3D(x, y, z)
  • {
  • this.x = x;
  • this.y = y;
  • this.z = z;
  • this.rx = x; //rotated x
  • this.ry = y; //rotated y
  • this.rz = z; //rotated z
  • }
  • //Méthode Point3D::rotate
  • Point3D.prototype.rotate = function(cax, sax, cay, say, caz, saz)
  • {
  • var x, y, z, tx, ty, tz;
  • x = this.x; y = this.y; z = this.z;
  • //rotation autour de l'axe x
  • ty = y; tz = z;
  • y = cax * ty - sax * tz;
  • z = sax * ty + cax * tz;
  • //rotation autour de l'axe y
  • tx = x; tz = z;
  • x = say * tz + cay * tx;
  • z = cay * tz - say * tx;
  • //rotation autour de l'axe z
  • tx = x; ty = y;
  • x = caz * tx - saz * ty;
  • y = saz * tx + caz * ty;
  • //Mise à jour
  • this.rx = x; this.ry = y; this.rz = z;
  • };
  • //Classe Ligne3D
  • //Constructeur
  • function Ligne3D(p1, p2)
  • {
  • this.p1 = p1;
  • this.p2 = p2;
  • }
  • //Méthode Ligne3D::draw
  • Ligne3D.prototype.draw = function()
  • {
  • var x1, y1, x2, y2
  • var l = largeur / 2,
  • h = hauteur / 2;
  • var distance_focale = 0.577350269189626 * l;
  • // 0.577350269189626 = tangeante(60/2)
  • // 60 est l'angle du champ de vision (en degrés)
  • x1 = l + distance_focale * this.p1.rx / (this.p1.rz+50);
  • y1 = h - distance_focale * this.p1.ry / (this.p1.rz+50);
  • x2 = l + distance_focale * this.p2.rx / (this.p2.rz+50);
  • y2 = h - distance_focale * this.p2.ry / (this.p2.rz+50);
  • with(surface3D)
  • {
  • moveTo(x1, y1);
  • lineTo(x2, y2);
  • }
  • };
  • //Classe Objet3D
  • function Objet3D(nb_points, nb_lignes, couleur, epaisseur)
  • {
  • this.points = new Array(nb_points);
  • this.lignes = new Array(nb_lignes);
  • this.couleur = couleur;
  • this.epaisseur = epaisseur;
  • }
  • Objet3D.prototype.rotate = function(ax, ay, az)
  • {
  • var i;
  • var cax = Math.cos(ax*Math.PI/180), // cos(ax)
  • sax = Math.sin(ax*Math.PI/180), // sin(ax)
  • cay = Math.cos(ay*Math.PI/180), // cos(ay)
  • say = Math.sin(ay*Math.PI/180), // sin(ay)
  • caz = Math.cos(az*Math.PI/180), // cos(az)
  • saz = Math.sin(az*Math.PI/180); // sin(az)
  • for(i=0; i<this.points.length; i++)
  • this.points[i].rotate(cax, sax, cay, say, caz, saz);
  • };
  • Objet3D.prototype.draw = function(ax, ay, az)
  • {
  • var i;
  • for(i=0; i<this.lignes.length; i++)
  • this.lignes[i].draw();
  • };
  • objets = new Array();
//Surface de dessin
this.createEmptyMovieClip("surface3D", 0);

//Les dimensions du calque
largeur = 600;
hauteur = 400;

//Classe Point3D

//Constructeur
function Point3D(x, y, z)
{
  this.x = x;
  this.y = y;
  this.z = z;
  this.rx = x; //rotated x
  this.ry = y; //rotated y
  this.rz = z; //rotated z
}

//Méthode Point3D::rotate
Point3D.prototype.rotate = function(cax, sax, cay, say, caz, saz)
{
  var x, y, z, tx, ty, tz;
  
  x = this.x; y = this.y; z = this.z;
  
  //rotation autour de l'axe x
  ty = y; tz = z;
  y = cax * ty - sax * tz;
  z = sax * ty + cax * tz;
  
  //rotation autour de l'axe y
  tx = x; tz = z;
  x = say * tz + cay * tx;
  z = cay * tz - say * tx;
  
  //rotation autour de l'axe z
  tx = x; ty = y;
  x = caz * tx - saz * ty;
  y = saz * tx + caz * ty;
  
  //Mise à jour
  this.rx = x; this.ry = y; this.rz = z;
};

//Classe Ligne3D

//Constructeur
function Ligne3D(p1, p2)
{
  this.p1 = p1;
  this.p2 = p2;
}

//Méthode Ligne3D::draw
Ligne3D.prototype.draw = function()
{
  var x1, y1, x2, y2
  var l = largeur / 2,
      h = hauteur / 2;
  var distance_focale = 0.577350269189626 * l;
  // 0.577350269189626 = tangeante(60/2)
  // 60 est l'angle du champ de vision (en degrés)
  
  x1 = l + distance_focale * this.p1.rx / (this.p1.rz+50);
  y1 = h - distance_focale * this.p1.ry / (this.p1.rz+50);
  
  x2 = l + distance_focale * this.p2.rx / (this.p2.rz+50);
  y2 = h - distance_focale * this.p2.ry / (this.p2.rz+50);
  
  with(surface3D)
  {
	moveTo(x1, y1);
    lineTo(x2, y2);
  }
};

//Classe Objet3D

function Objet3D(nb_points, nb_lignes, couleur, epaisseur)
{
  this.points = new Array(nb_points);
  this.lignes = new Array(nb_lignes);
  this.couleur = couleur;
  this.epaisseur = epaisseur;
}

Objet3D.prototype.rotate = function(ax, ay, az)
{
  var i;
  var cax = Math.cos(ax*Math.PI/180), // cos(ax)
      sax = Math.sin(ax*Math.PI/180), // sin(ax)
      cay = Math.cos(ay*Math.PI/180), // cos(ay)
      say = Math.sin(ay*Math.PI/180), // sin(ay)
      caz = Math.cos(az*Math.PI/180), // cos(az)
      saz = Math.sin(az*Math.PI/180); // sin(az)
  
  for(i=0; i<this.points.length; i++)
    this.points[i].rotate(cax, sax, cay, say, caz, saz);
};

Objet3D.prototype.draw = function(ax, ay, az)
{
  var i;
  
  for(i=0; i<this.lignes.length; i++)
    this.lignes[i].draw();
};

objets = new Array();

 Conclusion

Compatible MX 2004 uniquement (désolé...)

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

30 décembre 2004 16:39:51 :
05 janvier 2005 08:05:22 :
Ajouts : Un objet d'exemple (pyramide) Corrections : Un code un peu plus propre, une gestion des calques un peu plus propre...
07 janvier 2005 10:11:17 :
Ajouts : des boutons pour les rotations un bouton pour changer d'objet
07 janvier 2005 10:17:09 :
07 janvier 2005 10:18:59 :

 Sources de la même categorie

Source avec Zip ZOOM SUR UNE IMAGE par yasdar
Source avec Zip Source avec une capture UN PEU DE MATH par yasdar
Source avec Zip Source avec une capture PARTICULE SYSTEM par yasdar
Source avec Zip Source avec une capture GALLERIE PHOTO AVEC XML par yasdar
Source avec Zip Source avec une capture MP3 LAYER NICE &SMALL par yasdar

Commentaires et avis

Commentaire de top30 le 31/12/2004 20:09:04

Simplet et efficace.. J aime la clairté.

[8/10] et bonne année...

Commentaire de Dri le 01/01/2005 22:01:23

Merci beaucoup
Ca motive pour faire mieux :D

Commentaire de WhiteMagus le 02/01/2005 12:47:20

C'est super clair, commenté et le code est optimisé. Rien en trop, une méthode simple et pourtant efficace (on le voit ici). Pour un premier programme c'est pas mal du tout.
En plus, si top30 t'as mis 8, c'est que c'est presque parfait.
@+ et bone année.

Commentaire de WhiteMagus le 02/01/2005 12:49:07

PS. : 8 aussi. Mais top30, au moment où j'ai voté, il y avait "pas de note". Tu as oublié ? Enfin. ça fait pareille, vu que je mets la même

Commentaire de top30 le 04/01/2005 00:41:22

Je penses que y a un bug, puisque si tu as voté, ca n appareait pas non plus.

Moi perso je connais pas le principe de la 3D... Mias j aimerai me faire un package de Class MX3D. J ai commencé. c commence par une Class "basique" et maitre appelée "Object3", comprenant une attribution de "nom automatique et des propriétés "_parent", "_name", "_x",  "_y" et "_z"...
Suivi d'une interface iObject obgeant la définition de function getXposition et setXposition ( pareil pour Y et Z)...
Puis suivent la Class Point qui dont le getXposition ( ainsi que Y et Z sont des enregistrement de valeur x, et y et z. Class Line composée de deux point dont le getXposition est la distance intermédiare entre les deux X des points. Un clAsse Volume en cours...

Brefs, ferfant adepte de l'As2, je cherche à faire un un packge de Classes ou TOUS Serait séparés et facilement modifiables ( Point, Line, Volume, Camera et Screen ).

bref... Toutes aide de personne comme Dri.. serait la bien venue... J'aime l'idée d'essayer de former ensemble un outils communs...

toutes idéees est la bienvenue...


A plus et ...
...Bonne année à vous !

Commentaire de Dri le 04/01/2005 12:26:14

C'est tres encourageant tout ca !
Pour ce qui est du flash, c'est bien mon premier programme... J'ai d'abord essayé de faire un truc tout con avec un bouton mais ca n'a pas abouti... Alors je me suis penché là dessus.

Pour ce qui est de programmer un package 3D en AS, je ne suis pas contre mais j'apprend le flash surtout par nécessité...

Je cherche toujours à savoir comment connaitre les dimensions d'un calque ou de quoique ce soit avec l'AS par exemple...

Commentaire de top30 le 04/01/2005 13:22:29

Si tu connais illustrator, et bien Flash c est pareil, la scene principal n'a pas de dimension.
Car c est un clip quasi comme les autres, avec un _width et un _height, mais si il est vide, pas de Width, pas de Height... Donc un conseil. Créer ton object scene.

_global.maScene = {width:800, height:400} ;

Commentaire de Dri le 04/01/2005 16:21:23

Je ne connais pas du tout illustrator... En fait la seule chose que j'ai touchée en dessin vectoriel avant flash c'est Autocad (soit dit en passant, on peut importer/lire des fichiers autocad avec flash ?)

L'objet 'maScene' est celui qui doit remplacer le 'surface' que j'utilise ?

Je vais continuer ce petit projet et commencer par ajouter dans les objets même le style des traits (épaisseur et couleur). Je vais aussi chercher du côté des scènes...

Commentaire de top30 le 04/01/2005 16:29:19

Oui, par exemple...

Putain comment peut on faire de la 3D aussi claire et connaitre aussi peu Flash ???


= ))

Il faut que ton "objectFilaire" ai sa propre definition de couleur et taille de trait...

Mais que le rendu de l'object passe par exemple ar une Camera qui contiendrait ta Focale, et les methodes de rendu ainsi que celle de dessin, les attributs du tarit etant celle de chaque object...

Commentaire de Dri le 04/01/2005 16:32:53

Bah euh j'apprend :p

tient d'ailleurs pour essayer de progresser en flash je vais tenter de faire en sorte que le controle de la rotation de l'objet ne se fasse plus en boucle mais à l'aide de boutons...

J'espere avoir du concret prochainement...

Commentaire de Blacknight91titi le 04/01/2005 17:50:10

super
moi qui conni pa la 3d va falloir que je m'y mète
9/10

Commentaire de Dri le 05/01/2005 08:07:59

Voila la première mise à jour... :D
Dans la prochaine il y aura un bouton pour changer d'objet...
(c'est fait mais je l'ai pas sur moi :D =)

Commentaire de Blacknight91titi le 05/01/2005 18:23:27

c'est bien mais une chose :
pensez a ceux qui n'on pas le MX 2004 il ne peuvent pas l'ouvrir
je dit sa car je suis dans ce cas la (je l'ai quand même vu car j'était chez un ami qui a le 2004)
merci d'avance

Commentaire de top30 le 05/01/2005 19:05:14

Donc tu as bien le MX2004 Dri ???
Si oui je te ferais une source de mes Classes de Base 3D que tu pourrais toi, faire tourner....

Commentaire de Dri le 06/01/2005 07:34:44

Comme je l'ai dit j'apprend le flash...
Et mon boss m'a bien filé une version MX 2004...

Commentaire de Blacknight91titi le 06/01/2005 17:21:03

tu peu l'enregistrer sous le MX normal si c'est du AS1 sa ira sinon bin tant pis pour moi

Commentaire de Dri le 06/01/2005 17:44:43

bah je ne pense franchement pas avoir utilisé des trucs spécifiques à AS2 (en même temps je connais tellement peu que je peux pas du tout savoir...).
Dans mon prochain zip (au plus tard ce week end) j'ajouterai une version mx simple du .fla

Commentaire de top30 le 06/01/2005 19:09:13

Non l'avantage de l'AS2, c est la solidité, le pratique, l'extention de Class et le l'aide aux erreurs....

Commentaire de Dri le 07/01/2005 22:36:30

bon bah c mis à jour
et jme suis fait recaler en voulant l'enregistrer en mx normal

Au passage, niveau code ca commence à devenir l'usine à gaz
c dommage ke les variables globales des calques ne soient pas reconnues dans le code action script des boutons...

Commentaire de jbphp le 22/06/2008 14:44:32 9/10

WHAO

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,452 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales