Tut [OPENGL 01] Cube3D

Généralités sur la programmation 3D
Anonyme

Tut [OPENGL 01] Cube3D

Message par Anonyme »

Voici une approche simple d'openGL sous purebasic
Son utilisation est la même qu'en C++ ou autre
ce qui fait qu'il est possible de trouver une tonne d'article sur le net.
Je ne suis pas un expert en API graphique, mais je vais vous partager mon expérience
afin d'afficher dans un premier temps un cube non texturé.
Ce cube possèdera des faces indépendantes des autres. C’est un peu le hello world de la 3D :D


1°) Les fichiers externes

Tout d'abord, vous devez avoir c'est deux fichiers dans votre répertoire de travail Opengl.pb et Windows.pb dispo à la fin du post.

Opengl.pb : ce fichier fait interface entre opengl & purebasic
Windows.pb : ce fichier va vous permettre de créer un écran opengl, de l'effacer, le détruire,etc...

ps : Windows.pb peut être améliorer par les connaisseurs en api Windows pour la gestion de la fenêtre.


2°) Création de l'écran opengl

C'est aussi simple qu'une commande PB standard

CreateScreen("OpenGL",800,600,32,#False)

il n'y a pas besoin d'explication sauf pour le flag de fin

#False = mode fenêtrer
#True = Faux plein écran :D


une fois notre écran créer, nous devons initialiser différent éléments d'openGL


3°) L’initialisation

Code : Tout sélectionner

glMatrixMode_( #GL_PROJECTION )
glLoadIdentity_()
gluPerspective_(70,1.33,1,1000)
glEnable_(#GL_DEPTH_TEST)

glMatrixMode_() Permet de choisir la matrice sur lequel nous allons projeter notre scene. (Plus d’infos sur google ^^)

glLoadIdentity_() Charge la matrice identité

Voici à quoi ressemble la matrice identité, c’est en fait une sorte de tableau 4x4 qui est beaucoup utilisé en 3D

1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

Mais OpenGL nous facilite la vie, il possède des fonctions qui nous permettent d’éviter de faire du calcul matriciel, et par la même occasion, on ne s’arrache pas les cheveux :D
Si vous voulez plus d’infos sur les matrices : http://www.mandragor.org/tutoriels/3d/13#ancre1

gluPerspective_(70,1.33,1,1000)

-Le premier paramètre et en fait le FOV
-Le second est le ratio, le ratio est généralement de 1.33, pour calculer le ratio, c’est simple : Largeur écran / Hauteur écran
640/480 = 1.33
800/600 = 1.33
1024/768 = 1.33
-Le troisième paramètre quand à lui permet en sorte de cliping, ou si vous préférer la limite longue du rendu de la camera.

glEnable_(#GL_DEPTH_TEST)

Cette commande couplée avec cette constante nous permet de cacher les faces non visibles.


Voilà pour l’initialisation, rien de compliqué ?



4°) La boucle principale

Comme toute boucle principale d’un programme, elle comporte un
Repeat & until avec une condition de sortie.
Comme nous n’avons pas d’écran fait par purebasic, nous n’avons donc pas pu initialiser le clavier.
C’est pas grave, le fichier Windows.pb nous donne une alternative :

Code : Tout sélectionner

Repeat 
Until Keys(#VK_ESCAPE) 
End

Toujours le même problème, nous allons avoir besoin d’un clearscreen() et d’un flipbuffers()
, le fichier Windows.pb nous donne encore une alternative :

Code : Tout sélectionner

Repeat 

  Event.l = ScreenEvent() 


; Dessin


 FlipAndClear()
Until Keys(#VK_ESCAPE) 
DestroyScreen() 
End
Langage Je ne pense pas qu’il faut épiloguer sur cette boucle :D

Passons au plus intéressant, le dessin du cube en lui-même.

5°) La fonction Dessin()


Procedure Dessiner()


glClear_( #GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT ) ; Efface les buffers spécifier en paramètres


glMatrixMode_( #GL_MODELVIEW ) ;Tout à l’heure nous avons déjà fait appel à cette commande, là, nous preparons la matrice de notre futur objet.

glLoadIdentity_(); on charge la matrice identité

gluLookAt_(5,5,6,0,0,0,0,1,0); les 3 premiers paramètres servent à définir la position de la caméra (x,y,z) , les trois suivant le point visé, les trois autres définissent l'axe verticale de la camera
ref : http://www.linuxgraphic.org/section3d/o ... idac1.html


glRotated_(45,0,0,1); cette commande permet une rotation, ici de 45° sur l’axe Z de notre objet, ou plutôt matrice (#GL_MODELVIEW), bref, ne vous prenez pas la tête avec les matrices :D

il est possible de mettre une valeur ailleurs que dans Z par exemple :
glRotated_(45,0.05,0.9,0.0005)



je vais vous expliquer juste pour une face, le reste est dans le code finale.

glBegin_(#GL_QUADS) ; Nous allons demander de créer un Quads (4 Vertex) pour définir une face, il y a d’autres méthodes , mais je ne vais pas épiloguer la dessus.
glVertex3d_(1,1,1); on est pas obligé d’utiliser des 1 on peut mettre des 100,250,etc...
glVertex3d_(1,1,-1);Les 4 Vertex définissent une face
glVertex3d_(-1,1,-1);
glVertex3d_(-1,1,1);
glEnd_(); intervient après un glbegin()
glFlush_() ; Vide les Buffers utilisé précédemment
EndProcedure


6°) Code finale

Voici le liens des includes :

File:1->Tut-OpenGL.rar
Image


Merci DJES ! :wink:

Code : Tout sélectionner

IncludeFile "OpenGl.Pb"
IncludeFile "Windows.pb"

Declare  Dessiner()

CreateScreen("OpenGL",800,600,32,#False)

glMatrixMode_( #GL_PROJECTION )
glLoadIdentity_()
gluPerspective_(70,1.33,1,500)
glEnable_(#GL_DEPTH_TEST)


Repeat 
  Event.l = ScreenEvent() 
  Dessiner()
  FlipAndClear()
Until Keys(#VK_ESCAPE) 
DestroyScreen() 
End



Procedure Dessiner()
  Static angle.f
  angle + 0.8

glClear_( #GL_COLOR_BUFFER_BIT )

glMatrixMode_( #GL_MODELVIEW )
glLoadIdentity_( )

gluLookAt_(5,0,0,0,0,0,0,1,0)
glRotated_(angle,0.5,0.1,1)



glBegin_(#GL_QUADS)

glColor3ub_(255,0,0)
glVertex3d_(1,1,1)
glVertex3d_(1,1,-1)
glVertex3d_(-1,1,-1)
glVertex3d_(-1,1,1)

glColor3ub_(0,255,0)
glVertex3d_(1,-1,1)
glVertex3d_(1,-1,-1)
glVertex3d_(1,1,-1)
glVertex3d_(1,1,1)

glColor3ub_(0,0,255)
glVertex3d_(-1,-1,1)
glVertex3d_(-1,-1,-1)
glVertex3d_(1,-1,-1)
glVertex3d_(1,-1,1)

glColor3ub_(255,255,0)
glVertex3d_(-1,1,1)
glVertex3d_(-1,1,-1)
glVertex3d_(-1,-1,-1)
glVertex3d_(-1,-1,1)

glColor3ub_(0,255,255)
glVertex3d_(1,1,-1)
glVertex3d_(1,-1,-1)
glVertex3d_(-1,-1,-1)
glVertex3d_(-1,1,-1)

glColor3ub_(255,0,255)
glVertex3d_(1,-1,1)
glVertex3d_(1,1,1)
glVertex3d_(-1,1,1)
glVertex3d_(-1,-1,1)
glEnd_()
glFlush_()

EndProcedure
La prochaine fois nous verrons la facon d'utiliser des textures sur notre cube, car c'est un peu particulier sous opengl.

Ps: si vous maitriser les api Windows, ca serais cool de modifier windows.pb afin d'avoir une gestion complète de la fenetre, comme les déplacement, ou la reduction de la fenetre, avec la gestion d'un vrai plein écran :wink:
Dernière modification par Anonyme le ven. 07/juil./2006 21:49, modifié 2 fois.
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

Bien sympathique, merci pour le tuto :)
dreamind
Messages : 28
Inscription : dim. 16/janv./2005 23:34
Localisation : Toulouse/FRANCE

Message par dreamind »

Sympa bientôt ton moteur 3D à ce rythme. :wink:
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

oui c'est sympa ce tut , je vais peut-être finir par me décider à en faire de l'opengl :)
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Sehka
Messages : 114
Inscription : dim. 27/févr./2005 11:41

Message par Sehka »

Ca tourne bien pour un cube :wink:
Sans rire, cela semble prometteur...
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

question bête ^^
en utilisant le subsystem opengl c'est pas plus simple ?

OpenScreen suffira à ouvrir un écran nan ?

Dri
Anonyme

Message par Anonyme »

Oui, c'est ce que je fait, mais un openscreen() plante lors de la création du contexte (DirectX). j'ai trouvé une autre méthode, on ouvre avec openwindow()
puis je colle opengl dedans et , pour le plein ecran, je cache les bordures de la fenetre :d
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Ce serait bien que tu mettes ce code sur la page d'origine... Et pourquoi pas convertir les autres? :D
http://nehe.gamedev.net/data/lessons/le ... ?lesson=01
Anonyme

Message par Anonyme »

à l'heure ou je poste , le site est offline. il sagissait de quoi exactement ?
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Euh! Ben c'est un des sites de référence sur l'opengl... http://nehe.gamedev.net
Anonyme

Message par Anonyme »

très intéresant djes les tutos dessus. je vais voir comment initialiser glsl :D
à moins que tu as des infos dessus :D
En tout cas, ce qui serait intéressant , c'est de simplifier l'utilisation d'opengl sous pure
Répondre