Créer un jeu 3D simple en Python avec Pygame et PyOpenGL

Introduction

Bien que Pygame soit principalement conçu pour des jeux 2D, il est possible de l’étendre pour créer des jeux 3D grâce à PyOpenGL, une bibliothèque Python qui permet d’interfacer avec OpenGL, une API de rendu graphique 3D puissante. PyOpenGL offre une multitude d'outils pour dessiner des objets 3D, gérer des caméras, appliquer des textures, et rendre des scènes interactives.

Dans cet article, nous allons vous guider à travers les étapes pour créer un jeu 3D simple en Python en utilisant Pygame pour la gestion des événements et PyOpenGL pour le rendu 3D. Vous apprendrez à configurer une scène, dessiner des objets 3D, et gérer l’interaction avec l'utilisateur.

1. Pourquoi utiliser PyOpenGL avec Pygame ?

Pygame est une bibliothèque flexible qui facilite la gestion des fenêtres, des événements, et des entrées utilisateur. Cependant, il manque les fonctionnalités pour le rendu 3D. C’est là que PyOpenGL entre en jeu.

PyOpenGL est une interface Python pour OpenGL, permettant de dessiner des objets 3D, d’appliquer des transformations, et de gérer les caméras. En combinant Pygame et PyOpenGL, vous pouvez créer un moteur de jeu qui utilise Pygame pour la gestion des entrées utilisateur et PyOpenGL pour le rendu graphique 3D.


2. Installation de PyOpenGL et Pygame

Avant de commencer, assurez-vous d’avoir installé les bibliothèques nécessaires.

2.1. Installation des bibliothèques

Utilisez pip pour installer Pygame et PyOpenGL :

pip install pygame
pip install PyOpenGL

Une fois ces bibliothèques installées, vous serez prêt à créer une fenêtre Pygame et y intégrer le rendu 3D d'OpenGL.


3. Initialisation de la fenêtre avec Pygame et OpenGL

Pour commencer, nous allons initialiser une fenêtre avec Pygame et configurer OpenGL pour le rendu 3D. La fenêtre sera utilisée pour afficher une scène 3D et gérer les interactions utilisateur comme les mouvements de la caméra.

3.1. Configuration de base

Voici comment initialiser une fenêtre Pygame et configurer OpenGL :

Code : Initialisation de Pygame et OpenGL :

import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *

# Initialiser Pygame
pygame.init()

# Créer une fenêtre Pygame avec un contexte OpenGL
screen = pygame.display.set_mode((800, 600), DOUBLEBUF | OPENGL)

# Paramétrer la perspective
gluPerspective(45, (800 / 600), 0.1, 50.0)
glTranslatef(0.0, 0.0, -5)  # Position de la caméra

# Fonction pour quitter
def quit_game():
    pygame.quit()
    quit()

# Boucle principale
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
            quit_game()

    # Effacer l'écran
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    # Rendu ici

    # Mettre à jour l'affichage
    pygame.display.flip()
    pygame.time.wait(10)

Explication :

  • gluPerspective(45, (800 / 600), 0.1, 50.0) : Définit le champ de vision (FOV), le rapport d’aspect, et les plans de clipping avant et arrière.
  • glTranslatef(0.0, 0.0, -5) : Positionne la caméra à 5 unités du centre de la scène.

4. Dessiner des objets 3D : Cubes et transformations

Une fois la fenêtre et OpenGL configurés, il est temps de commencer à dessiner des objets en 3D. Nous allons commencer par un simple cube, qui est un bon point de départ pour apprendre les concepts de base comme les transformations (rotation, translation, etc.).

4.1. Dessiner un cube

Un cube est composé de 6 faces, chacune formée de deux triangles. Voici un exemple de cube 3D en OpenGL.

Code : Dessiner un cube :

def draw_cube():
    glBegin(GL_QUADS)
    # Face avant
    glColor3f(1, 0, 0)  # Rouge
    glVertex3f(-1, -1, 1)
    glVertex3f(1, -1, 1)
    glVertex3f(1, 1, 1)
    glVertex3f(-1, 1, 1)

    # Face arrière
    glColor3f(0, 1, 0)  # Vert
    glVertex3f(-1, -1, -1)
    glVertex3f(1, -1, -1)
    glVertex3f(1, 1, -1)
    glVertex3f(-1, 1, -1)

    # Autres faces...
    glEnd()

# Appeler la fonction dans la boucle de jeu
draw_cube()

4.2. Appliquer des transformations (rotation et mouvement)

Les transformations en OpenGL permettent de déplacer, tourner ou redimensionner les objets. Voici comment faire tourner le cube sur un axe.

Code : Rotation d’un objet :

angle = 0

# Dans la boucle principale
glPushMatrix()  # Sauvegarder la matrice actuelle
glRotatef(angle, 0, 1, 0)  # Rotation autour de l'axe Y
draw_cube()
glPopMatrix()  # Restaurer la matrice

angle += 1  # Incrémenter l'angle pour la rotation continue

5. Interaction avec l’utilisateur : Mouvement de la caméra

Pour rendre la scène interactive, nous allons ajouter un contrôle de caméra à l'aide des touches du clavier pour déplacer et faire tourner la caméra dans la scène.

5.1. Contrôler la caméra

Nous allons implémenter les déplacements de la caméra avec les touches W, A, S, et D pour avancer, reculer, et se déplacer latéralement.

Code : Mouvement de la caméra avec le clavier :

def handle_keys():
    keys = pygame.key.get_pressed()

    if keys[pygame.K_w]:
        glTranslatef(0, 0, 0.1)  # Avancer
    if keys[pygame.K_s]:
        glTranslatef(0, 0, -0.1)  # Reculer
    if keys[pygame.K_a]:
        glTranslatef(0.1, 0, 0)  # Gauche
    if keys[pygame.K_d]:
        glTranslatef(-0.1, 0, 0)  # Droite

Ajoutez cette fonction dans la boucle principale pour que la caméra réponde aux entrées clavier.


6. Ajouter des couleurs et des lumières à la scène

Les lumières et les couleurs rendent la scène plus réaliste et immersive. OpenGL offre plusieurs outils pour simuler l’éclairage et ajouter des ombrages à vos objets.

6.1. Lumière simple en OpenGL

Voici comment configurer une lumière simple qui éclaire la scène.

Code : Ajouter une lumière :

def setup_lighting():
    glEnable(GL_LIGHTING)
    glEnable(GL_LIGHT0)

    # Définir la position de la lumière
    light_pos = [1, 1, 1, 0]
    glLightfv(GL_LIGHT0, GL_POSITION, light_pos)

setup_lighting()  # Appeler la fonction après l'initialisation d'OpenGL

7. Exemple complet : Un jeu 3D simple avec Pygame et PyOpenGL

Voici le code complet du jeu 3D, avec un cube qui tourne et des contrôles de caméra. Vous pouvez copier-coller ce code pour l’essayer et l’étendre selon vos besoins.

Code complet : Jeu 3D avec un cube et des contrôles de caméra :

import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *

def draw_cube():
    glBegin(GL_QUADS)
    
    # Face avant
    glColor3f(1, 0, 0)  # Rouge
    glVertex3f(-1, -1, 1)
    glVertex3f(1, -1, 1)
    glVertex3f(1, 1, 1)
    glVoici la fin du programme complet pour créer un jeu 3D simple avec **Pygame** et **PyOpenGL** :

```python
import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *

# Fonction pour dessiner un cube
def draw_cube():
    glBegin(GL_QUADS)
    
    # Face avant
    glColor3f(1, 0, 0)  # Rouge
    glVertex3f(-1, -1, 1)
    glVertex3f(1, -1, 1)
    glVertex3f(1, 1, 1)
    glVertex3f(-1, 1, 1)
    
    # Face arrière
    glColor3f(0, 1, 0)  # Vert
    glVertex3f(-1, -1, -1)
    glVertex3f(1, -1, -1)
    glVertex3f(1, 1, -1)
    glVertex3f(-1, 1, -1)
    
    # Face gauche
    glColor3f(0, 0, 1)  # Bleu
    glVertex3f(-1, -1, -1)
    glVertex3f(-1, -1, 1)
    glVertex3f(-1, 1, 1)
    glVertex3f(-1, 1, -1)
    
    # Face droite
    glColor3f(1, 1, 0)  # Jaune
    glVertex3f(1, -1, -1)
    glVertex3f(1, -1, 1)
    glVertex3f(1, 1, 1)
    glVertex3f(1, 1, -1)
    
    # Face supérieure
    glColor3f(1, 0, 1)  # Magenta
    glVertex3f(-1, 1, -1)
    glVertex3f(1, 1, -1)
    glVertex3f(1, 1, 1)
    glVertex3f(-1, 1, 1)
    
    # Face inférieure
    glColor3f(0, 1, 1)  # Cyan
    glVertex3f(-1, -1, -1)
    glVertex3f(1, -1, -1)
    glVertex3f(1, -1, 1)
    glVertex3f(-1, -1, 1)
    
    glEnd()

# Fonction pour gérer les événements du clavier
def handle_keys():
    keys = pygame.key.get_pressed()

    if keys[pygame.K_w]:
        glTranslatef(0, 0, 0.1)  # Avancer
    if keys[pygame.K_s]:
        glTranslatef(0, 0, -0.1)  # Reculer
    if keys[pygame.K_a]:
        glTranslatef(0.1, 0, 0)  # Gauche
    if keys[pygame.K_d]:
        glTranslatef(-0.1, 0, 0)  # Droite

# Initialiser Pygame et OpenGL
pygame.init()
screen = pygame.display.set_mode((800, 600), DOUBLEBUF | OPENGL)
pygame.display.set_caption("Jeu 3D avec Pygame et PyOpenGL")

gluPerspective(45, (800 / 600), 0.1, 50.0)
glTranslatef(0.0, 0.0, -5)

# Variables pour la rotation
angle = 0

# Boucle principale du jeu
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    
    handle_keys()

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    # Appliquer une rotation et dessiner le cube
    glPushMatrix()
    glRotatef(angle, 0, 1, 0)  # Rotation sur l'axe Y
    draw_cube()
    glPopMatrix()

    angle += 1  # Incrémenter l'angle de rotation

    pygame.display.flip()
    pygame.time.wait(10)

pygame.quit()

Explication du code :

  1. Initialisation de la fenêtre : La fenêtre Pygame est créée avec un contexte OpenGL pour afficher des graphismes 3D.
  2. Fonction draw_cube() : Cette fonction dessine un cube avec des couleurs différentes pour chaque face. Le cube est défini par ses 6 faces composées de quadrilatères (quads).
  3. Mouvement de la caméra avec le clavier : Les touches W, A, S, et D sont utilisées pour déplacer la caméra dans la scène.
  4. Rotation du cube : La fonction glRotatef() applique une rotation continue au cube autour de l'axe Y.
  5. Boucle principale : Elle gère l'animation du cube, le rendu et les interactions utilisateur.

Comment tester le jeu :

  • Copiez-collez ce code dans un fichier Python.
  • Assurez-vous que Pygame et PyOpenGL sont bien installés.
  • Exécutez le script et utilisez les touches W, A, S, et D pour déplacer la caméra et observer le cube tourner.

Conclusion

Ce tutoriel vous a montré comment créer un jeu 3D simple en Python en utilisant Pygame pour la gestion des événements et PyOpenGL pour le rendu graphique 3D. Vous avez appris à dessiner des objets 3D comme un cube, appliquer des transformations, et contrôler la caméra avec le clavier. Vous pouvez maintenant utiliser ces concepts pour créer des jeux 3D plus complexes en Python.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *