Objets en 3d filaire

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

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.