Page 1 sur 1

Tut [OPENGL 01] Cube3D

Publié : ven. 07/juil./2006 0:20
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:

Publié : ven. 07/juil./2006 10:22
par flaith
Bien sympathique, merci pour le tuto :)

Publié : ven. 07/juil./2006 11:36
par dreamind
Sympa bientôt ton moteur 3D à ce rythme. :wink:

Publié : ven. 07/juil./2006 15:16
par comtois
oui c'est sympa ce tut , je vais peut-être finir par me décider à en faire de l'opengl :)

Publié : ven. 07/juil./2006 16:08
par Sehka
Ca tourne bien pour un cube :wink:
Sans rire, cela semble prometteur...

Publié : ven. 07/juil./2006 20:23
par Dr. Dri
question bête ^^
en utilisant le subsystem opengl c'est pas plus simple ?

OpenScreen suffira à ouvrir un écran nan ?

Dri

Publié : ven. 07/juil./2006 20:50
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

Publié : sam. 08/juil./2006 17:18
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

Publié : sam. 08/juil./2006 17:36
par Anonyme
à l'heure ou je poste , le site est offline. il sagissait de quoi exactement ?

Publié : sam. 08/juil./2006 17:46
par djes
Euh! Ben c'est un des sites de référence sur l'opengl... http://nehe.gamedev.net

Publié : dim. 09/juil./2006 12:48
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