Discussion: [Projet] Wingraph
Afficher un message
Vieux 25/07/2009, 05h49   #6
Brunni
Super Modérateur
 
Date d'inscription: 10/11/2005
Localisation: Un pays avec beaucoup de banques
Messages: 3 229
Par défaut

J'ai modifié un peu l'exemple de Air Hockey (pas encore updaté) pour montrer que les fonctions de la lib sont plus générales que mes libs précédentes et ne limitent plus forcément votre jeu à la 2D.



Ce que je vais dire là c'est pour les utilisateurs qui maîtrisent déjà bien la lib. C'est pas super compliqué mais ça fait appel à des concepts un peu plus avancés, qu'on retrouve en 3D.
Donc pour faire ça il n'y a pas de fonction native, mais ça consiste en fait juste à définir une matrice de projection pour changer le point de vue. On se débrouille pour faire en sorte que l'observateur regarde notre plan Oxy habituel (2D) et ensuite on opère les transformations qu'on veut pour l'inclinaison et autres. Je sais que c'est du chinois dit comme ça, un exemple sera plus parlant:

Code PHP:
// Permet d'avoir une vue en perspective
void passeEn3D() {
    
// Définit une perspective 3D
    
glMatrixMode(GL_PROJECTION);
    
glLoadIdentity();
    
// Angle d'ouverture 50°, aspect ratio largeur/hauteur
    
gluPerspective(50double(screenWidth) / screenHeight0.1, -0.1);
    
// En mode 2D le plan x,y correspond au plan y,z en 3D à cause du système d'axe
    // Ainsi avec notre x,y on dessinerait au sol... on a donc défini une caméra qui
    // regarde depuis le haut (z=1) et un peu reculée (x=1)
    
gluLookAt(101,        // Pos. observateur x,y,z
              
000,        // Cible x,y,z
              
001);        // Axe Oz (vers le haut, normal)

    // On va s'arranger avec diverses transformations pour voir quelque chose à l'écran
    // Le système de coordonnée change lui aussi (x dirigé vers le bas, y vers la droite)
    
rotateScreen(PI 2);
    
scaleScreen(1, -1);
    
// Le rendu est normalement entre -1 et 1, nous on dessine entre 0 et 480
    
scaleScreen(1.0f screenHeight);
    
moveScreen(-screenWidth 2, -screenHeight 2);

Il faut savoir qu'en 3D le système d'axes est le même qu'en maths: X pointe vers soi (s'il est négatif on s'éloigne), Y va vers la droite (s'il est négatif vers la gauche) et Z vers le haut (s'il est négatif sur le bas). Le plan (x,y) actuel est en fait au sol maintenant! On crée alors une caméra qui se trouve au-dessus du plan de rendu et un peu plus loin (x positif) pour l'inclinaison. Ensuite on fait une rotation car si vous faites le test de visu avec ce système d'axes, vous verrez que ça ne joue pas: x qui vient vers soit ira donc vers le bas et y ira vers la droite. On veut x vers la droite et y vers le bas pour correspondre au rendu 2D habituel. On utilise alors une rotation de 90° (PI/2), mais là on a toujours le problème du fait que x va vers le haut comme normalement en maths. On fait alors un scaling négatif en y pour corriger ça. Ensuite il ne reste plus qu'à recentrer l'écran et à le scaler correctement pour qu'il soit à la bonne taille (ça peut aussi se régler avec l'angle d'ouverture ou avec la distance de l'observateur, c'est comme vous le souhaitez).

Ensuite on peut dessiner sur notre écran incliné comme une table de jeu! Rappelez vous que lorsque vous faites moveScreen ou autre vous n'affectez pas ce qui a déjà été dessiné sur l'écran: ce sont juste les prochains objets qui seront dessinés plus loin en l'occurence. Ces fonctions affectent la matrice nommée "screen" dans Wingraph. Cette matrice définit les calculs à réaliser pour transformer les coordonnées d'un objet sur l'écran. Ainsi même si vous avez l'impression de dessiner les objets "tout droit", les opérations (rotation, déplacement, etc.) définies par la matrice screen feront qu'ils apparaîtront en fait inclinés sur l'écran. Pareil pour la matrice projection ici.
On peut donc dessiner en 2D et dessiner par plan: par exemple pour dessiner un objet plus haut on peut faire ceci:

Code PHP:
dessineFond();
moveScreen(0015);    // monte (z) de 15
dessineTruc();           // dessine le truc plus haut 
Une possibilité pour dessiner un truc différemment pourrait être d'utiliser le fait que les objets Vertex peuvent prendre 3 coordonnées. Ainsi mettons qu'on veut ériger une barrière prenant toute la largeur de l'écran, et d'une hauteur de 100, alors on pourrait écrire ceci:

Code PHP:
drawFillRect(
    
Vertex(000),
    
Vertex(screenWidth00),
    
Vertex(00100),
    
Vertex(screenWidth0100)); 
Bref avec ça on voit qu'on peut gentiment passer à la 3D sans trop de problème même en utilisant la lib. Ca pourrait encourager certains à réaliser des effets 3D, bien pratiques dans certaines situations

Dernière modification par Brunni ; 25/07/2009 à 09h09.
Brunni est déconnecté   Réponse avec citation