Mac4Ever MacGameZone Gadget O'Mac Refurb-Store Mac-LAN : Jouez ! Forum : ...
icon
Mardi 06 Novembre 2001

La programmation Open GL sur OS X

Creation > Programmation
Dans cet article, je vais vous faire découvrir les bases de la programmation open GL sur mac OS X. Vous allez apprendre à afficher une fenêtre avec un cube et même à le faire tourner sur lui-même ! Vous allez voir, une fois que l'on connaît les bases, on peut faire très rapidement de très belles choses.

Petit avertissement...


Tout d'abord, un petit avertissement : pour programmer en Open GL, il faut utiliser le langage C. Si vous n'en connaissez pas les bases, vous allez vous sentir un peu perdu. Toutefois, cet article est plutôt simple à comprendre, et vous pouvez toujours faire un simple copier coller et suivre les instructions. Sachez seulement qu'il faut respecter les majuscules et la syntaxe. Les passages situés derrière // ou entre /* et */ sont des commentaires qui ne sont pas nécessaire ni pris en charge par le compilateur mais je vous conseille fortement d'en mettre si vous voulez vous y retrouver.

Vous allez aussi devoir installer les developpers tools inclus dans la boite de Mac OS X.

Créer un projet


La programmation Open GL sur OS X
Pour commencer, vous devez créer un nouveau projet. Faites 'newproject' dans le menu file. Choisissez 'empty project' et faites next. Donnez un nom et un emplacement au nouveau projet. Une fenêtre s'ouvre: c'est votre environnement de travail. A gauche, vous pourrez voir tout les fichiers qui composent votre programme et les visualiser dans la fenêtre principale en cliquant dessus.

Faites 'new target' dans le menu project, choisissez "cocoa application" et faites next. Donnez lui un nom et ajoutez la à votre projet. Elle apparaîtra à gauche dans l'onglet targets.

Vous devez maintenant ajouter les librairies glut à votre programme. Faite add framework dans le menu project et sélectionnez "GLUT.framework", "AppKit.framework" et "OpenGL.framework". Ajoutez le à votre projet. Il devrait apparaître dans l'onglet files.

Faites maintenant new file dans le menu file et sélectionnez "C file". Appelez le fichier "source.c".

Vous devriez normalement avoir quelquechose qui ressemble à la copie d'écran ci-dessus (attention ! le point à gauche de source.c et des trois ".framework" doit être présent, sinon cliquez à leur gauche pour qu'il apparaisse).

Le programme


Cliquez sur source.c dans l'onglet files. Son contenu apparaît au centre.
Rajoutez "#include ‹GLUT/glut.h›" en dessous de "#include ‹CARBON/carbon.h›" afin d'établir un lien entre les librairies openGL et votre programme.

Nous avons maintenant besoin de définir quelques valeurs:
tapez ces 2 lignes :

#define kWWidth 500
#define kWHeight 500


Le programme se compose pour l'instant de 3 fonctions: une d'initialisation, une pour donner des instructions (en l'occurrence, dessiner quelque chose) et une pour exécuter le tout.

Voici la première qui se contente d'initialiser les fonctions openGL :

GLvoid initialisation(GLvoid) { // n'oubliez pas l'accolade pour ouvrir et fermer la fonction
glClearColor(0.0f,0.0f,0.0f,0.0f); /* les f après les valeurs sont nécessaires pour indiquer qu'il s'agit de décimaux*/
glClearDepth(1.0);

// Ça, c'est juste pour tout remettre à 0
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(GLfloat)kWWidth/(GLfloat)kWHeight,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW);
/*et tout ça, c'est des histoires de modes de projections. On va pas rentrer dans les details, Vous les mettez, sans vous en occuper.
N'oubliez pas l'accolade pour signaler au programme la fin de votre fonction.*/
}


La prochaine étape consiste à écrire une fonction qui va créer des polygones

Pour cela, il faut définir les coordonnées de chaque point dans l'espace. On peut régler 3 valeurs par point : x,y et z: respectivement la longueur, la hauteur et la profondeur. Le plus difficile est de se représenter les points dans l'espace. Je vous conseille pour cela de faire un petit schéma. Les points sont calculés à partir du centre que l'on peut déplacer avec la fonction "translatef(x,y,z)". On utilise la fonction glVertex3f(x,y,z) pour définir la position des points.

Par exemple, un simple carré aura donc besoin de 4 points :
1er point: en haut à droite -> glVertex3f(1.0f,1.0f,0.0f);
c'est à dire 1 unité au dessus du centre et une unité à droite du centre.
2e point: en haut à gauche -> glVertex3f(-1.0f,1.0f,0.0f);
c'est à dire 1 unité au dessus du centre et une unité à gauche du centre.
3e point: en bas à gauche -> glVertex(-1.0f,-1.0f,0.0f);
c'est à dire 1 unité en dessous du centre et une unité à gauche du centre.
4e point: en bas à droite -> glVertex3f(1.0f,1.0f,0.0f);
c'est à dire 1 unité en dessous du centre et une unité à droite du centre.

Note: il est impératif de suivre cet ordre sinon vous allez vous retrouver avec des formes bizarres n'ayant rien à voir avec votre carré.

Mais ce n'est pas tout, il faut aussi définir une couleur sinon, vous ne verrez pas vos polygones. On utilise la fonction glColor3f(r,g,b) où r,g et b sont red green et blue. En mélangeant ces 3 trois couleurs, vous pouvez obtenir toutes les couleurs. Pour trouver à quelles couleurs correspondent les valeurs, utilisez n'importe quel logiciel de dessin (graphic converter par exemple) et choisissez le mode rgb, faites des essais et une fois la couleur trouvée, retenez les valeurs pour le rouge le bleu et le vert (100 % correspond à1.0f et 50% correspond à 0.5f). Le moyen le plus simple est d'utiliser seulement le bleu, le rouge ou le vert : il suffit de mettre 1.0f pour la couleur désirée et 0.0f pour les autres.

La programmation Open GL sur OS X


Exemple : pour du bleu, on donnera les valeurs suivantes "glColor3f(0.0f,0.0f,1.0f);" -> 0% de rouge, 0% de vert et 100% de bleu mais pour du violet, il faudra utiliser plusieurs couleurs :

"glColor3f(0.5f,0.0f,1.0f);" -> 50% de rouge, 0% de vert et 100% de bleu

Sachez aussi que 100% de chaque couleur donne du blanc et 0 % de chaque couleur donne du noir.

Voici donc la fonction de dessin :

GLvoid creation(GLvoid) {

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // le signe | s'obtient avec shift alt l
glLoadIdentity();
glTranslatef(0.0f,0.0f,-5.0f); // recule le centre de 5
glBegin(GL_QUADS); // mode de dessin : carrés

/*face frontale*/

glColor3f(0.0f,0.0f,1.0f); // couleur: bleu
glVertex3f(-1.0f,1.0f,0.0f);
glVertex3f(1.0f,1.0f,0.0f);
glVertex3f(1.0f,-1.0f,0.0f);
glVertex3f(-1.0f,-1.0f,0.0f);

/*face arrière*/

glColor3f(1.0f,0.0f,0.0f);
glVertex3f(-1.0f,1.0f,-1.0f);
glVertex3f(1.0f,1.0f,-1.0f);
glVertex3f(1.0f,-1.0f,-1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);

/*dessus du cube*/

glColor3f(0.0f,1.0f,0.0f);
glVertex3f( 1.0f, 1.0f,-1.0f);
glVertex3f(-1.0f, 1.0f,-1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glVertex3f( 1.0f, 1.0f, 1.0f);

/*dessous du cube */

glColor3f(1.0f,0.0f,0.0f);
glVertex3f( 1.0f,-1.0f, 1.0f);
glColor3f(1.0f,1.0f,1.0f);
glVertex3f(-1.0f,-1.0f, 1.0f);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glColor3f(0.0f,0.0f,1.0f);
glVertex3f( 1.0f,-1.0f,-1.0f);

La programmation Open GL sur OS X
/*côté gauche du cube*/

glColor3f(0.0f,0.5f,1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f,-1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glVertex3f(-1.0f,-1.0f, 1.0f);

/*côté droit du cube */

glColor3f(0.5f,0.0f,1.0f);
glVertex3f( 1.0f, 1.0f,-1.0f);
glVertex3f( 1.0f, 1.0f, 1.0f);
glVertex3f( 1.0f,-1.0f, 1.0f);
glVertex3f( 1.0f,-1.0f,-1.0f);

glEnd(); // fin du mode carré
glPushMatrix(); //valider le tout
glutSwapBuffers(); // afficher
}


Et enfin, la fonction principale, qui va faire appel à toutes les autres :

int main(int argc,char** argv) {
glutInit(&argc, argv); //initialisation ...
glutInitDisplayMode(GLUT_DEPTH | GLUT_RGB | GLUT_DOUBLE); // encore de l'initialisation
glutInitWindowSize(kWWidth,kWHeight); // initialisation de la taille d la fenetre du programme
glutInitWindowPosition(250,250); // initialisation de la position de la fenêtre du programme
glutCreateWindow("mac4ever"); // création de la fenêtre du programme avec le nom mac4ever
initialisation(); // appel à la fonction initialisation
glutDisplayFunc(creation); // le programme se sert de la fonction creation pour afficher le contenu
glutMainLoop();
return 0; // cette instruction est requise par l' ANSI C
}


Voilà ! Une fois que vous avez écrit tout ça, compilez et lancez le programme (ou faites directement pomme R).
C'est bien beau me direz vous, mais on voit qu'un côté. Logique !

Nous allons donc rajouter de quoi faire tourner notre cube:
Tout d'abord, rajoutez la variable "GLfloat r = 0.0f;" après "#define kWHeight 500" au début du fichier:

Puis il nous faut une 4e fonction :

GLvoid Idle(GLvoid) {
r += 0.5f; // augmente la vitesse de 0.5
glutPostRedisplay(); // redessine l'objet
}


Dans la fonction main(),
après "glutDisplayFunc(creation);" , ajoutez à la ligne "glutIdleFunc(Idle);"
puis ajoutez "r=0;" avant "return 0;"

Ensuite, dans la fonction creation() rajoutez juste ceci avant "glBegin(GL_QUADS)"
"glRotatef(r,1.0f,1.0f,0.0f);" où r indique la vitesse de rotation, les 3 autres valeurs correspondant
aux trois axes. Dans ce cas-ci, le cube tourne autour d'un axe vertical et horizontal.

La source complète en une seule partie


#include ‹GLUT/glut.h›

#define kWWidth 500
#define kWHeight 500

GLfloat r = 0.0f;

GLvoid initialisation(GLvoid) {

glClearColor(0.0f,0.0f,0.0f,0.0f);
glClearDepth(1.0);
/* Ca, c'est juste pour tout remettre à 0 */
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(GLfloat)kWWidth/(GLfloat)kWHeight,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW);

/*N'oubliez pas l'accolade pour signaler au programme la fin de votre fonction.*/
}

GLvoid Idle(GLvoid) {

r += 0.5f; // augmente la vitesse de 0.5
glutPostRedisplay(); // redessine l'objet
}

GLvoid creation(GLvoid) {

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0f,0.0f,-5.0f); // recule le centre de 5
glRotatef(r,1.0f,1.0f,0.0f); /*r indique la vitesse de rotation, les 3 autres valeurs correspondant
aux trois axes. Dans ce cas-ci, le cube tourne autour d'un axe vertical et horizontal. */
glBegin(GL_QUADS); // mode de dessin : carrés

/*face frontale*/

glColor3f(0.0f,0.0f,1.0f); // couleur: bleu
glVertex3f(-1.0f,1.0f,1.0f); // en haut àgauche
glVertex3f(1.0f,1.0f,1.0f); // en haut à droite
glVertex3f(1.0f,-1.0f,1.0f); // en bas à droite
glVertex3f(-1.0f,-1.0f,1.0f); // en bas à gauche

/*face arrière*/

glColor3f(1.0f,0.0f,0.0f); rouge
glVertex3f(-1.0f,1.0f,-1.0f); // en haut à gauche
glVertex3f(1.0f,1.0f,-1.0f); // en haut à droite
glVertex3f(1.0f,-1.0f,-1.0f); // en bas à droite
glVertex3f(-1.0f,-1.0f,-1.0f); // en bas à gauche

La programmation Open GL sur OS X
/*dessus du cube*/

glColor3f(0.0f,1.0f,0.0f); vert
glVertex3f( 1.0f, 1.0f,-1.0f);
glVertex3f(-1.0f, 1.0f,-1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glVertex3f( 1.0f, 1.0f, 1.0f);

/*dessous du cube */

glColor3f(1.0f,0.0f,0.0f); rouge
glVertex3f( 1.0f,-1.0f, 1.0f);
glColor3f(1.0f,1.0f,1.0f);
glVertex3f(-1.0f,-1.0f, 1.0f);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glColor3f(0.0f,0.0f,1.0f);
glVertex3f( 1.0f,-1.0f,-1.0f);

/*côté gauche du cube*/

glColor3f(0.0f,0.5f,1.0f); orange
glVertex3f(-1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f,-1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glVertex3f(-1.0f,-1.0f, 1.0f);

/*côté droit du cube */

glColor3f(0.5f,0.0f,1.0f); violet
glVertex3f( 1.0f, 1.0f,-1.0f);
glVertex3f( 1.0f, 1.0f, 1.0f);
glVertex3f( 1.0f,-1.0f, 1.0f);
glVertex3f( 1.0f,-1.0f,-1.0f);

glEnd(); // fin du mode carrés
glPushMatrix(); //valider le tout
glutSwapBuffers(); // afficher
}

int main(int argc,char** argv) {

glutInit(&argc, argv); //initialisation ...
glutInitDisplayMode(GLUT_DEPTH | GLUT_RGB | GLUT_DOUBLE); // encore de l'initialisation
glutInitWindowSize(kWWidth,kWHeight); /* initialisation de la taille de la fenêtre du programme */
glutInitWindowPosition(250,250); /* initialisation de la position de la fenetre du programme*/
glutCreateWindow("mac4ever"); /* création de la fenêtre du programme avec le nom mac4ever*/
initialisation(); /*appel à la fonction initialisation*/
glutDisplayFunc(creation); /*le programme se sert de la fonction creation pour afficher le contenu */
glutIdleFunc(Idle); /* appel de la fonction pour augmenter la vitesse et ainsi fair tourner le cube */
glutMainLoop();
r=0;
return 0; // cette instruction est requise par l' ANSI C
}


A vous de jouer...


Et voilà le travail ! Vous avez maintenant un joli cube qui tourne sur lui même ! Et ça sert à quoi ? A rien ! C'est juste pour faire joli ;-).

Maitenant que vous connaissez la marche à suivre pour programmer des scènes OpenGL, à vous d'étendre et de nous développer des Quake IV ou Unreal II...

@ Gaime


Les réactions à cet article
Témoignages et avis....
  • Le 14/11/2001, 22:16@ Mad Frog : Si ca vous tente....

    ... j'avais porté notre moteur 3D sur MacOS 9...si vous voulez essayer de le porter sur OS X faites moi signe ca peut être marrant.

    Note : le C n'est pas le seul langage pour faire de l'OpenGL...
  • Le 15/11/2001, 10:59@ Mathbat : Autre que C...

    Pour accéder à OpenGL, si tu fait pas du C, tu peux faire du FORTRAN ou de l'Ada... Pas très excitant !

    PS : On a pas ton email !
  • Le 15/11/2001, 18:54@ [MF]Môa : project builder

    je n'arrive pas à le lancer, à peine je double clique dessus, l'icone ds le dock s'affiche 1/5 de seconde, pas un message d'erreur. Est-ce que ça vient du fait que je l'ai installé avec un cd developer tools os x.0 sur un os x.1 ?
  • Le 15/11/2001, 19:15@ Eklecthor : Autre que c

    Zêtes sure qu'on peut pas en c++ ? Ce serait mieux... Ou bien on peut-on inclure le code opengl dans une application c++ sans problèmes ?
  • Le 16/11/2001, 10:36@ Mathbat : Autre que C -- PB

    Si, si, C ou C++, pas de différence, tu peux appeler OpenGL depuis l'un ou l'autre.

    Pour Project Builder, il faut que tu trouves les Dev Tools 10.1. Sinon, ça a peu de chance de marcher (Gaime a eu le même genre de pb je crois).
  • Le 17/11/2001, 00:42@ Gaime :

    le prob c que g pas réussi à les trouver autre part que sur l'ADC et là --> 187 mo !!!!!!!!
    En plus faut s'inscrire :-(
    je vais les D/L et voir si ça résoud le pb.
  • Le 17/11/2001, 09:51@ [MF]Môa : ADC

    ouais je sais, je m'y suis inscrit.
    et comme j'ai un 56K…

    alors si qqun veut bien me l'envoyer !
  • Le 27/11/2001, 19:10@ Neb : ET ?

    alors on les trouve ou ces dev tools 10.1 ? g le meme probleme
  • Le 07/10/2002, 11:43@ Efix : question

    A quoi servent les fonctions "glPushMatrix" et "glPopMatrix" ?
    A quel format peut on importer les images et comment faire?
    Et puis ca sera tout pour aujourd'hui
  • Le 02/01/2003, 15:58@ NONInscrit : importation

    comment importer des fichiers 3d ? Et a quel format (3dmf,3ds...)
  • Le 23/06/2003, 14:43@ Link : 2D

    on n'a besoin ou pas de #include pour faire des jeux 2D ? parceque il ne semble pas le trouver
  • Le 23/06/2003, 16:31@ Link : error

    je viens d'essayer votre prog et je me retrouve face à qque problème.
    d'abord j'ai deux fichier source: source.h et source.c
    dans source.h j'ai
    #include ‹CARBON/carbon.h›
    et dans source.c j'ai
    #include ""
    j'ai donc rajouté
    "#include ‹GLUT/glut.h›"
    dans source.h contenant et ai continué le programme dans source.c.
    lors de la compilation, j'ai 4 erreurs soit:
    undefined type,found 'GLvoid'
    illegal function call, found '500'
    undefined type, found 'GLvoid'
    no macro name given in #define directive

    je pense que cela venait du fait que j'avais un source.h qui n'avait pas lieu d'être là, mais j'ai pourtant suivi scrupuleusement vos instructions. sauriez-vous m'aider ??
  • Le 05/07/2003, 10:42@ sem : dev tools

    tout ça a l'air assez interessant mais je ne trouve pas les devteloppers tools (j'ai un iMac été 2002 avec le 10.1.4)
  • Le 24/01/2004, 15:06@ hannachi fayçal : Demande lire

    livre(adresses pour télécharger format *.pdf,Doc...) programation Open-GL C++Builder et d'autre livre sur l'animation comportementale
  • Le 16/02/2004, 15:52@ newbies : debut cahotique sur XCode

    Bonjour, j'aimerais bien faire un peu
    d'OpenGL mais je dois avoir un probleme
    de librairie, je n'arrive pas à inclure Carbon.h
    ou Cocoa.h.
    Si quelqu'un connait un truc qui marche bien,
    merci de me faire signe.
  • Le 17/02/2004, 14:53@ newbies : suite debut Cahotique

    Finalement j'avais pas décompressé tous
    les outils developpeurs, mainteneant ca marche
    tout seul.
    Trop cool
  • Le 23/03/2004, 14:45@ boumad : tracer de rayon

    comment faire le tracer de rayon avec open gl
  • Le 07/07/2004, 21:27@ zed : c'est bien

    moi ce que je cherche,,,c'est comment faire un appel d'une application en
    builder c à open GL
  • Le 29/11/2004, 13:04@ abdel : question

    voila en fait je suis nouveau ds la programmation c++ ,et mon probleme c de visualiser une fonction donnée f(x,y)=....
    en utilisant la bibloitheques glut alors s'il ya qq un ui peut m'orienter sa sera formidable merci
  • Le 07/02/2007, 10:05@ larbi : programmation

    comment crée un application d'opengl avec c++ builder
  • Le 21/11/2007, 11:36@ soumia : problème

    infographie
Donnez votre avis
Réagissez à cet article...
 
Si vous cherchez de l'aide ou si vous avez une question à poser, ne réagissez pas ici ! Redirigez-vous vers le forum !
Pseudo/Nom : Email (sera protégé contre le Spam) :
Titre :
Réaction :
Recopiez le code de l'image ci-contre :
Rubriques
  • humeurcreationmateriel
  • logicielsjeuxmacos