Maintenant que nous savons comment initialiser OpenGL , nous allons aborder la 3D. Le code GFA-Basic affichera un cube en rotation comme ceci :

opengl cube

Avec le 1er exemple en 2D on avait défini une matrice de projection orthogonale comme ceci :

glMatrixMode(GL_PROJECTION)
glOrtho(0, _X, _Y, 0, -1, 2000)

Les lignes de projection étant parrallèles entre elles et perpendiculaires à l'image de l'écran. Pour la 3D les lignes de projections sont des fuyantes, il y a plusieurs manières de définir ce genre de projection. Personnellement je fait comme tout le monde, j'utilise le plus simple : gluPerspective()

Exemple : Je veux un angle de vue de 45 degrés en Y , un rapport largeur/hauteur correspondant à l'écran et une profondeur en Z allant de 0.1 à 1000 alors j'écris :

gluPerspective(45, Max(1, _X) / Max(1, _Y), 0.1, 1000)

Vraiment très pratique.

Par la suite une autre fonction très utile est la transformation de la matrice pour qu'elle corresponde à un point de vue dans l'espace tridimensionnel :  gluLookAt()

Exemple : J'opte qu'une unité est égale à 1 centimètre, que le sol de ma scène se situe à zéro en y, je veux mettre la caméra à 1 mètre du sol et à -5 mètres en z du centre de la scène qui est en (0,0,0)  et faire en sorte qu'elle point vers un objet qui est à  50 cm du sol et à 10 mètres du centre de la scène en x. De plus je veux qu'elle soit légèrement penchée vers la droite.

Position de la caméra 0,0,-5

coordonnées de l'objet : 10,0.5,0

Inclinaison de la caméra (au pif)  0.2,1,0 -> normalisé cela donne approximativement 0.2,0.98,0

Cela donne : glLookAt( 0,0,-5,   10,0.5,0,  0.2,0.98,0) 

Avant de poursuive notez que la plupart des fonctions OpenGL sont dérivées en plusieurs fonctions dont le suffixe indique comment nous passons les paramètres, chaque fonction ayant son utilité. Pour comprendre voici un exemple avec glVertex():

  • glVertex2d(x,y) // 2d = 2 nombres de type Double
  • glVertex3f(x,y) // 3f = 2 nombres de type Float ou Single
  • glVertex2d(x,y) // 2d = 2 nombres de type Double
  • glVertex3dv(Vec) // 3dv = 3 doubles dans un vecteur, autrement dit un entier qui indique l'addresse où se trouve stockés les 3 doubles

Ensuite pour dessiner des objets en 3D on dispose de beaucoup de fonctions mais elles font en fait toute la même chose : envoyer à OpenGl les coordonnées de 1 ou plusieurs triangles. En résumé je dirais que cela se passe toujours ainsi :

On démarre une séquence avec la fonction glBegin() en indiquant quels types d'assemblages de triangles nous voulons.

On lui envoie des coordonnées avec glVertex()

Et on termine la séquence avec glEnd()

Entre glBegin() et glEnd() les appels à des fonctions sur les matrices sont interdits, il ne peuvent être appellés qu'avant glBegin(), ce qui est logique.

En plus des coordonées spatiales de glVertex() on peut aussi spécifier pour chaque glVertex() le plus généralement :

  • Une couleur avec glColor()
  • Une Coordonnée dans une texture avec glTexCoord()
  • Une normale avec glNormal()

Voici donc un exemple avec un cube coloré.

OpenGL-Cube3D

Précédent

 

Comments est propulsé par CComment