Objets en 3d filaire

Soyez le premier à donner votre avis sur cette source.

Vue 9 976 fois - Téléchargée 968 fois

Description

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 / Exemple :


//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é...)

Codes Sources

A voir également

Ajouter un commentaire Commentaires
jbphp
Messages postés
61
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
14 février 2009

22 juin 2008 à 14:44
WHAO
cs_Dri
Messages postés
30
Date d'inscription
lundi 21 avril 2003
Statut
Membre
Dernière intervention
10 mars 2007

7 janv. 2005 à 22:36
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...
top30
Messages postés
1158
Date d'inscription
vendredi 21 février 2003
Statut
Membre
Dernière intervention
6 août 2010

6 janv. 2005 à 19:09
Non l'avantage de l'AS2, c est la solidité, le pratique, l'extention de Class et le l'aide aux erreurs....
cs_Dri
Messages postés
30
Date d'inscription
lundi 21 avril 2003
Statut
Membre
Dernière intervention
10 mars 2007

6 janv. 2005 à 17:44
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
Blacknight91titi
Messages postés
1732
Date d'inscription
jeudi 17 juin 2004
Statut
Membre
Dernière intervention
9 mars 2015
2
6 janv. 2005 à 17:21
tu peu l'enregistrer sous le MX normal si c'est du AS1 sa ira sinon bin tant pis pour moi
Afficher les 20 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.