IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Discussion :

Classe OpenGL (à peu près potable)


Sujet :

Contribuez

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    444
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 444
    Points : 428
    Points
    428
    Par défaut Classe OpenGL
    Bonjour,

    voilà la classe OpenGL de l'exemple de Windev remaniée par mes soins.
    J'ai essayé de mettre un maximum de constantes OpenGL mais il en manque surement. Je me suis basé sur cette source : http://www.khronos.org/registry/glsc/api/1.0/gl.h.

    Pour l'instant elle ne fait pas grand chose, cela permet juste d'initialiser un champ OpenGL, mais au moins cela minimise le code dans la fenêtre.
    Attention je n'utilise pas la nomenclature des types de variables de Windev.
    Code de la fenêtre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    Déclarations Globales :
     
    // ici on choisit le champ à initialiser, un champ image ou une fenêtre.
    Champ_OpengL_1 est une Classe_OpenGL(Image1..Nom)
     
    Initialisation :
     
    Champ_OpengL_1:InitPFD()
     
    Champ_OpengL_1:InitChamp()
     
    Champ_OpengL_1:InitGLScene()
     
    Champ_OpengL_1:InitGLParam()
     
    // c'est cette fameuse fonction qui permet de redessiner le champ. J'ai fixé à 25 ms pour éviter d'avoir un gros scintillement quand on redimensionne la fenêtre si le champ est ancré et cela permet de rafraichir le champ assez rapidement sans que l'on attende trop longtemps. Bien sur pour un champ qui ne sera pas redimensionné de manière manuelle (en étirant les bords ou coin de la fenêtre) vous pouvez mettre cette valeur à 0.
     
    TimerSys("Redessine", 25, 1)
     
     
    PROCEDURE Redessine()
     
    Champ_OpengL_1:Efface_et_SwapBuffers()

    Classe OpenGL V0.1

    - permet l'initialisation d'un champ image ou fenêtre
    - 2 paramètres optionnels pour la méthode InitPFD

    V0.2

    - ajout des méthodes : glBegin, glEnd, glTranslatef, glVertex3f, glColor3f, glRotatef, glLoadIdentity

    V0.3

    - ajout des textures pour les cubes. Il est possible de charger plusieurs textures (à définir dans la variable globale nb_textures). Dans l'exemple il y en a 2. Les textures sont pour l'instant limitées à des fichiers BMP de 64*64, 128*128 et 256*256 pixels en 24 bits. Les fichiers BMP sont à placer dans le sous-répertoire "EXE" du projet.

    V0.4

    - modification de la méthode InitTexture : possibilité de paramétrer les textures et les mipmaps
    - ajout des méthodes InitLumiereAmbient et InitLumiereDiffuse
    - ajout de la méthode glNormal3f
    - ajout des méthodes gluCylindre et gluSphere

    V0.4a
    - modification de la méthode InitLumiereDiffuse

    V0.5
    - ajout des méthodes glColor4f, glColor3ub, glColor4ub
    - ajout d'un paramètre optionnel à InitTexture pour le nombre de textures max (initialisé à 1)

    Cette classe est très largement inspirée de la traduction du tuto de Nehe disponible ici : http://nehe.developpez.com/
    Je vous mets aussi mes projets qui suivent le tuto pour vous permettre de comprendre les étapes.

    TODO :
    - ajouter les évènements Windows (clavier et souris surtout)
    - continuer d'intégrer des méthodes
    - ajouter d'autres classes pour chaque forme puis faire une classe pour créer un groupe de formes
    Fichiers attachés Fichiers attachés
    Mieux vaut un petit lien qu'un long discours.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    444
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 444
    Points : 428
    Points
    428
    Par défaut
    Mise à jour du projet en intégrant le cube et la pyramide.

    Pour la fonction TimerSys de Windev, la temporisation influe sur la qualité d'animation. Si jamais vous devez faire une animation dynamique il est préférable de fixer la temporisation à 0ms : TimerSys("MaScene", 0, 1)
    Mieux vaut un petit lien qu'un long discours.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    En parcourant ton superbe travail j'ai eu l'idée de créer une petite méthode qui permet d'utiliser les constantes Windev pour les couleurs.

    Ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Champ_OpengL_1:glColor(iRougeClair)
    Champ_OpengL_1:glColor(RVB(50, 105, 137))

    Voici le source très simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    PROCEDURE glColor(P_rCouleur)
     
    :glColor3f(RVBRouge(P_rCouleur),RVBVert(P_rCouleur),RVBBleu(P_rCouleur))

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    444
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 444
    Points : 428
    Points
    428
    Par défaut
    Pour l'instant je me contente d'intégrer les fonctions OpenGL de la même manière que dans le tuto de NeHe pour que cela soit plus facile en lecture parallèle du tuto.

    Bien sur il y a énormément de choses à améliorer mais je me pencherais dessus plus tard.
    Mieux vaut un petit lien qu'un long discours.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    444
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 444
    Points : 428
    Points
    428
    Par défaut
    Après quelques prises de tête j'ai rajouté une méthode à la classe pour les textures des cubes. La méthode est très différente de celle de l'exemple qui était à mon gout bien trop lourde.
    J'ai comme d'hab ajouté un exemple, avec un cube et 2 textures.
    Dans les paramètres des textures j'ai laissé le paramètre de lissage des textures pour les agrandissements et rétrécissements des textures. C'est fluide sur mon super PC de développement avec un chipset graphique intégré

    La suite au prochain épisode ...
    Mieux vaut un petit lien qu'un long discours.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    444
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 444
    Points : 428
    Points
    428
    Par défaut
    V0.4

    Pour cette mise à jour j'ai ajouté 2 petites méthodes qui permettent d'intégrer des sphères et des cylindres/cônes.

    J'ai intégré aussi les fonctions pour gérer la lumière ambiante et des lumières diffuses. Le soucis est qu'il y a pas mal de paramètres qui rentrent en compte pour le rendu des lumières.
    Dans mon exemple j'ai mis une petite lumière ambiante blanche et 2 lumières diffuses une rouge à gauche et une bleue à droite. Même si j'ai l'impression d'avoir configuré les 2 lumières de la même façon (sauf pour la couleur bien sur) le rendu sur les formes est différent. La modification des paramètres de la fonction glColorMaterial y est pour quelque chose mais pour l'instant il m'est difficile de dire exactement comment les paramètres influent sur la lumière.

    J'ai enfin intégré quelques tests histoire de savoir d'où peuvent provenir certains problèmes comme lors de la mise en place d'une texture.

    Pour le programme j'ai mis un tout petit évènement Windows (WM_KEYDOWN) que j'ai repris de l'exemple Windev.
    En ce qui concerne les évènements je ne les intégrerai pas dans la classe. La liste des évènements est tellement vaste qu'il est difficile de faire un nombre de méthodes égal au nombre d'évènements. De plus le déclenchement d'un évènement peut faire appel à un très grand nombre de fonctions. Si j'intègre les évènements à la classe, quel serait un maximum acceptable de paramètres (rotation, translation, effacement de la scène, rajout d'une ou X formes, animation, ...) ?
    Je ne les intègrerai pas aussi car j'essaye de me tenir aux principes de la POO où les méthodes d'une classe ne doivent pas être modifiées toutes les 5 minutes, comme rajouter une touche dans la méthode toucheenfoncée.

    N'hésitez pas à faire pleins de tests pour me permettre savoir ce qui ne fonctionne pas. Pour l'instant je suis sous XP mais il est par exemple possible que certaines méthodes ne fonctionnent pas sous Vista ou 7.
    Mieux vaut un petit lien qu'un long discours.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    444
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 444
    Points : 428
    Points
    428
    Par défaut
    Petit up pour la modification de la méthode InitLumiereDiffuse. En effet pour les lumières diffuses il faut activer une constante GL_LIGHTX par lumière diffuse. Selon les cartes graphiques il semblerait que ce nombre de lumières diffuses soit différent. J'ai mis 8 constantes, de GL_LIGHT0 à GL_LIGHT7, et il faut préciser l'indice de la lumière dans les paramètres de la méthode.
    Mieux vaut un petit lien qu'un long discours.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    444
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 444
    Points : 428
    Points
    428
    Par défaut V0.5, NeHe : I-9 - Déplacer un bitmap en 3D
    Pas de changements extraordinaires pour cette mise à jour mais le petit programme vaut le détour. En effet on commence à pouvoir faire de jolies choses avec OpenGL (oui mais aussi grace à Windev ).

    Niveaux changements, j'ai modifié la méthode InitTexture. Dans son code elle faisait appel à la variable globale du nombre maximum de textures de la fenêtre 1 : pas bon niveau POO . Du coup j'ai mis un paramètre optionnel à la méthode pour définir le nombre max de textures sans à avoir à modifier la méthode. Par défaut je l'ai mis à 1.

    Il y a aussi les méthodes glColor4f, glColor3ub et glColor4ub. Les méthodes glColor4 rajoutent la composante alpha.
    Par contre en ce qui concerne le ub, certains seront content puisque ces méthodes permettent de fixer les couleurs avec des entiers allant de 0 à 255.

    Reste que j'ai buté sur un pbm avec ce programme à cause des paramètres. Je suis toujours embêté avec le grand nombre de paramètres d'OpenGL puisqu'il a fallu que j'en modifie certains pour que le programme fonctionne correctement. Je pense peut-être alléger certaines méthodes d'initialisation mais les lignes du coup se retrouveront dans l'initialisation du programme (hé oui faudra mettre les mains un peu plus dans le cambouis).

    Comme d'hab si vous avez des remarques, suggestions, (donations), je suis preneur.
    Mieux vaut un petit lien qu'un long discours.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    444
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 444
    Points : 428
    Points
    428
    Par défaut Charger et se déplacer dans un univers 3D
    Bon j'ai réussi à le boucler avant le week-end.

    On va commencer par les côtés pratiques : les flèches servent à se déplacer, pageup et pagedown pour regarder en haut et en bas, B pour activer la transparence F pour modifier la qualité des textures, et espace pour donner du cash aux filles des bars et dire "Shake It Baby" (ah bah non je l'ai pas encore mis ça ).

    Pour le programme pas de changement dans la classe puisque tout les modifications sont faites dans le programme principal.
    Vous remarquerez le travail extraordinaire que j'ai fait sur les tableaux et structures . C'est une façon personnelle de coder, si ça vous plait pas vous n'êtes absolument pas obligés de faire pareil et vous pouvez toujours essayer des tableaux à plusieurs dimensions.

    Y a juste une petite modif dans le fichier texte par rapport au tuto de NeHe, c'est que la première valeur désigne le nombre de triangles mais sans le nom de la variable devant. Par contre j'ai mis un commentaire au dessus pour ne pas que vous soyez chamboulé par cette énorme modification.

    Sinon je vais peut-être commencer à faire un vrai tuto (dans la partie tutoriels de Windev). Ça sera plus simple pour détailler et expliquer les lignes de code mais aussi ces satanés paramètres qu'on retrouve un peu partout et dans tous les sens.
    Je dis peut-être car il y a 2 choses :
    - faut que je fasse un logiciel pour l'entreprise dans laquelle je fais mon stage donc bon faut que j'avance un peu, j'ai suivi le tutoriel de NeHe pour pouvoir me familiariser avec OpenGL et Windev en même temps.
    - actuellement je vis chez mes beaux-parents car je déménage (je fais l'état des lieux de mon appart cette aprem) et les travaux de mon futur appart sont loins d'être finis (une semaine que j'ai pas pu allumer mon petit PC ).

    J'installerai la version express chez moi pour reprendre le code et commenter tout ça dès que je pourrais.
    Mieux vaut un petit lien qu'un long discours.

Discussions similaires

  1. Classe OpenGL : quelques soucis avec un champ image
    Par sphynxounet dans le forum WinDev
    Réponses: 14
    Dernier message: 08/01/2010, 09h58
  2. Réponses: 4
    Dernier message: 10/12/2009, 00h45
  3. [POO] Exemple de classe un peu tordue
    Par daddiz dans le forum Langage
    Réponses: 13
    Dernier message: 11/10/2008, 19h31
  4. 1er terme d'une suite aléatoire, toujours le même a peu près
    Par _Michel dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 06/04/2008, 12h03
  5. Réponses: 1
    Dernier message: 23/11/2006, 16h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo