Archives par mot-clé : transformations

Espace 3D et formes primitive – [initiation]

L’espace tridimensionnelle cartésien est un espace assez simple à aborder. Il possède l’ensemble des propriétés de l’espace cartésien bidimensionnel à cela prêt que l’ajout d’une dimension offre une nouvelle perspective : la profondeur.

Cet espace est habituellement représenté par les axe X, Y, Z suivant :

espace3D-01

Afin de comprendre cet espace il est important de connaitre le sens des différents axes.
Nous savons que par convention, l’espace bidimensionnel de notre programme est inversé, notre point d’origine 0,0 étant en haut à gauche, les x s’incrémentant de gauche à droite et les y s’incrémentant de haut en bas. De la cas de l’axe Z, celui-ci va en se décrémentant. Ainsi un objet loin de notre point de vue aura une position z inférieur de celle d’un objet proche de notre point de vu.
Nous obtenons alors le schéma suivant :

espace3D-02

Enfin il est important de noter que la position z de notre « oeil » ou point de vue sera de 0 par défaut. Celui-ci regardant dans le sens inverse nous observons alors que notre axe z visible sera un axe inférieur à 0 et se décrémentant. Il sera donc négatif.

L’espace tridimensionnel rajoute donc un concept de point de vu qu’il sera important de maîtriser afin de déplacer son point de vue dans son espace.

Transformations de matrice afin de déplacer son point de vue

Afin de maîtriser son point de vue et donc la position dans un espace nous allons utiliser une méthode vue précédemment pour changer un système de coordonnées, les transformations de matrice.
Nous savons qu’il nous est possible de déplacer notre point d’origine où l’on souhaite dans notre programme et ce sur un axe XY. Il en est de même pour un espace 3D. Dans l’exemple suivant nous allons dessiner un rectangle de taille 20, positionner en 0,0 puis nous verrons comment en changer son point de vue à l’aide des transformations de matrices.

Lorsque nous dessinons notre rectangle en position 0,0,0 nous obtenons l’image suivante.

void setup()
{
  size(700, 350, P3D);
  smooth();
}

void draw()
{
  background(255);
  rectMode(CENTER);
  fill(127);
  stroke(0);
  rect(0,0, 100, 100);
}

Notre rectangle, de position 0,0,0 n’est visible que de moitié. Si nous souhaitons le placer au centre de notre programme tout en conservant sa position nous utiliserons une transformation de matrice. Il est est de même si nous souhaitons changer sa position sur l’axe Z. Ainsi nous pouvons obtenir les transformations suivante :

pushMatrix();
translate(x, y, z);
popMatrix();

Dans notre cas nous allons positionner notre rectangle en z -100 et au centre de notre programme.

void setup()
{
  size(700, 350, P3D);
  smooth();
}

void draw()
{
  background(255);
  rectMode(CENTER);
  fill(127);
  stroke(0);
  
  pushMatrix();
  translate(width/2, height/2, -100);
  rect(0,0, 100, 100);
  popMatrix();
}

Rotations de matrice

Nous savons, dans un espace bidimensionnel, qu’il nous est possible d’effectuer un rotation de notre objet par le biais d’une rotation de matrice. Cette transformation nous est toujours possible dans un espace 3D en devenant plus précise puisque nous pouvons désormais effectuer des rotations sur un axe choisi.

espace3D-03

Pour ce faire nous allons utiliser les méthodes suivantes

rotateX(); //angle en radians
rotateY(); //angle en radians
rotateZ(); //angle en radians

Si nous reprenons notre exemple ci-dessus et que nous appliquons à chacun des axes X,Y,Z un angle s’incrémentant respectivement de 0.01, 0.02, 0.03 radians, nous obtenons alors de notre objet rectangle, une rotation différente sur chacun de ses axes.

float angleX, angleY, angleZ;

void setup()
{
  size(700, 350, P3D);
  smooth();
}

void draw()
{
  background(255);
  rectMode(CENTER);
  fill(127);
  stroke(0);
  
  pushMatrix();
  translate(width/2, height/2, -100);
  rotateX(angleX);
  rotateY(angleY);
  rotateZ(angleZ);
  
  rect(0,0, 100, 100);
  popMatrix();
  
  angleX += 0.01;
  angleY += 0.02;
  angleZ += 0.03;
}

Formes primitives

Comme pour l’espace 2D, processing possède des formes primitives en 3D, celle-ci nous permettent d’obtenir rapidement une forme 3D sans avoir à dessiner l’ensemble de ses sommets.
Les deux principales formes primitives sont la box et la sphère.

//Box de type Cube
box(taille) // ou la taille sera une valeur identique pour la largeur, hauteur et profondeur
//ou box de type parallélépipédique
box(largeur, hauteur, profondeur)

//Sphere
sphereDetail(res); // résolution de la sphere, c'est à dire le nombre de sous division en logitude et latitude. Par defaut cette résolution et des 30
sphereDetail(resLogitude, resLatitude); //résolution par longitude ou latitude
sphere(rayon);

Nous remarquons qu’aucune de ses formes primitives ne possèdent de position x,y,z, ces dernières devant être définies par des transformations de matrice.
Certaines formes primitives 2D sont elle aussi disponible dans un espace 3D par le simple ajout d’une position z.

line(x1, y1, z1, x2, y2, z2);
point(x, y, z);
vertex(x, y, z);
text(string, x, y, z);

Enfin, comme nous l’avons vu précédemment, il nous est toujours possible d’utiliser des formes primitives 2D (rect, quad, triangle…) dans un espace 3D lorsque nous utilisons des transformations de matrice.