Introduction
Utiliser pyOpenGL est relativement simple. En effet, quel que soit le langage de programmation les fonctions du module openGL sont identiques. En cherchant sur internet vous trouverez donc de nombreux exemples facilement compréhensibles. Mais si vous voulez utiliser openGL et wxPyton, les choses vont se compliquer car de nombreuses adaptations sont à faire et peu d’exemples sont disponibles.
Pour cette article, je vais utiliser les exemples du site http://www.videotutorialsrock.com/. J’ai transposé les exemples du C++ vers python puis je les ai adaptés pour les faire fonctionner avec wxPython.
Vous trouverez donc ici les programmes en python (compatible python2.7 et python3.5) et les adaptations à faire pour les rendre compatibles avec wxPython. Si vous souhaitez des explications détaillées sur leur fonctionnement, je vous invite à vous rendre sur le site cité ci-dessus ou en cliquant sur le titre de la leçon.
wxPython et PyOpenGL
Pour utiliser OpenGL et wxPython, vous devez utiliser le canevas GLCanvas pour afficher les objets 2D/3D que vous souhaitez.
Les fonctions à importer au début du programme sont les suivantes :
from wx import * from wx.glcanvas import * from OpenGL.GLUT import * from OpenGL.GLU import * from OpenGL.GL import *
Lors de l’initialisation, vous devez définir un self.context et initialiser glut en utilisant les fonctions suivantes :
self.context = GLContext(self) glutInit()
GLContext : on récupère le contexte actuel du système. Pour plus d’information, vous pouvez consulter la documentation wxPython ici.
Pour dessiner un objet, vous devez paramétrer le contexte utilisé en utilisant la fonction suivante :
self.SetCurrent(self.context)
Pour plus d’information sur cette fonction, vous pouvez consulter la documentation wxPython ici. Cette fonction est appelée avant l’initialisation et la représentation des objets mais après la création de la fenêtre. On la place dans la méthode OnPaint et on ne l’appelle qu’une fois. N’hésitez pas à consulter les exemples ci-dessous pour voir la structure du programme.
Exemples de programmes en PyOpenGL avec et sans wxPython
Les exemples ci-dessous ont été testés uniquement sous Linux.
MAJ 20/01/2018 : les exemples ci-dessous ont été testés sous Linux et Windows 8 avec python 2.7 et 3.4.
MAJ 27/01/2018 : les icônes et
indiquent si l’exemple a été testé et fonctionne sous Linux ou Windows 8 avec python 2.7 et 3.5.
Leçon | python | wxPython |
---|---|---|
Partie 1 : les bases | ||
1 : formes de base | Download ![]() ![]() |
Download ![]() ![]() |
2 : transformations et timers | Download ![]() ![]() |
Download ![]() ![]() |
3 : couleur | Download ![]() ![]() |
Download ![]() ![]() |
4 : lumière | Download ![]() ![]() |
Download ![]() ![]() |
5 : textures | Download ![]() ![]() |
Download ![]() ![]() |
6 : synthèse partie 1 | Download ![]() ![]() |
Download![]() ![]() |
Partie 2 : les sujets de la programmation 3D | ||
7 : terrain | Download ![]() ![]() |
Download ![]() ![]() |
8 : texte 3D | À venir | |
9 : animation | À venir | |
10 : détection de collision | À venir | |
11 : synthèse partie 2 | À venir | |
Partie 3 : effets spéciaux | ||
12 : transparence | Download ![]() ![]() |
Download ![]() ![]() |
13 : système de particules | Download ![]() ![]() |
Download ![]() ![]() |
14 : réflexion | Download ![]() ![]() |
Download ![]() ![]() |
15 : brouillard | Download ![]() ![]() |
Download ![]() ![]() |
Partie 4 : amélioration de la vitesse et de l’apparence | ||
16 : face arrière supprimée | Download ![]() ![]() |
Download ![]() ![]() |
17 : listes d’affichage | Download ![]() ![]() |
Download ![]() ![]() |
18 : normaliser les normales | Download ![]() ![]() |
Download ![]() ![]() |
19 : cartograhie | Download ![]() ![]() |
Download ![]() ![]() |
20 : matériaux | Download ![]() ![]() |
Download ![]() |
Partie 5 : un jeu simple : Crabe Pong | ||
21 : Crabe Pong | À venir |
Adaptations à apporter pour utiliser PyOpenGL avec wxPython
PyOpenGl | PyOpenGL + wxPython |
---|---|
Les events : OpenGL utilise ses propres event mais sont incompatibles avec wxPython. La solution est donc d’utiliser ceux de wxPython. | |
glutDisplayFunc(self.OnPaint) | self.Bind(EVT_PAINT, self.OnPaint) |
glutKeyboardFunc(self.handleKeypress) | self.Bind(EVT_KEY_DOWN, self.handleKeypress) |
glutReshapeFunc(self.OnResize) | self.Bind(EVT_SIZE, self.OnResize) |
glutSwapBuffers() | self.SwapBuffers() |
Les timers : la fonction proposée par OpenGL n’est pas compatible avec wxPython. Il existe cependant une fonction similaire dans wxPython. | |
glutTimerFunc(25, self.update, 0) | CallLater(25, self.update, 0) |
Redisplay : la fonction OpenGL pour actualiser le dessin n’est pas compatible avec wxPython. Il suffit d’appeler directement la fonction gérant l’affichage. | |
glutPostRedisplay() | self.OnPaint(0) |