Comment utiliser PyOpenGL avec wxPython ?

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)
SwapBuffers : cette fonction est incluse dans le GLCanvas.
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)
glGenTextures : à définir au moment de l’initialisation sinon pas d’affichage de la texture.

Ce contenu a été publié dans Python, avec comme mot(s)-clé(s) , , , , . Vous pouvez le mettre en favoris avec ce permalien.