Objets en 3d filaire

Soyez le premier à donner votre avis sur cette source.

Vue 10 168 fois - Téléchargée 972 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

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.