Grâce à un mini projet où nous rangerons des boites dans un conteneur, nous découvrirons Vpython, un outil permettant de générer une scène 3D facilement depuis python, visible sur une page Web.

Installation de Vpython
pip install vpython pip install vpython --upgrade
Objectif du jour :
Nous créerons une scène où des formes géométriques se rangent dans un conteneur au clic de l’utilisateur.
Conteneur
Afin de rendre les pièces rangés plus visible, j’ai choisi de créer un conteneur à partir de formes géométrique 2d extrudés.
Sol
Créons le sol avec le code suivant :
from vpython import shapes, extrusion, color, vector, textures def floor(): rect = shapes.rectangle(width=1, height=1) ex = extrusion(path=[vector(0, 0, 0), vector(0, 0.01, 0)], shape=rect, color=color.red, texture=textures.stucco)
Face gauche
Créons la face gauche avec le code suivant :
def leftface(): rect_side = shapes.rectangle(width=1, height=0.01) ex2 = extrusion(path=[vector(0, 0, 0), vector(0, 1, 0)], shape=rect_side, color=color.red, texture=textures.stucco) ex2.pos = vector(-0.5, 0.5, 0)
Face en face
Créons la face en face avec le code suivant :
def frontface(): rect_side_2 = shapes.rectangle(width=0.01, height=1) ex3 = extrusion(path=[vector(0, 0, 0), vector(0, 1, 0)], shape=rect_side_2, color=color.red, texture=textures.stucco) ex3.pos = vector(0, 0.5, -0.5)
Boites à ranger
Orange Box
Créons la boite avec le code suivant :
orangebox = box(color=color.orange, height=0.5)
Purple Box
Avec le code ci-dessous, créons la boite violette.
purplebox = box(color=color.purple, height=0.5, width=0.5, length=1)
Blue Box
Ici le code pour la boite bleue.>
bluebox = box(color=color.blue, height=0.5, width=0.5, length=0.5)
Yellow Box
Une dernière boite jaune pour le fun.>
yellowbox = box( color=color.yellow, height=0.5, width=0.5, length=0.5 )
Positionnement des boites
Maintenant, on crée une procédure pour initialiser la position des boites.
def init_boxes_position(): orangebox.pos = vector(2, 0.25, 2) purplebox.pos = vector(0,0.75,2.25) yellowbox.pos = vector(1.75,0.75,1.75) bluebox.pos = vector(2.25,0.75,-0.25)
Rangement des boites au clic
Pour ranger les boites lors du clic dans la fenêtre, nous créons une procédure avec les actions attendues puis l’attachons à l’évènement de clic.
def tidy_all(): while 1: # refresh every 100ms rate(100) # step velocity = 0.05 if purplebox.pos.z > 0.25: purplebox.pos.z -= velocity if bluebox.pos.x > 0.25: bluebox.pos.x -= velocity if yellowbox.pos.x > -0.25 and yellowbox.pos.z > -0.25: yellowbox.pos.x -= velocity yellowbox.pos.z -= velocity if orangebox.pos.z > 0 and orangebox.pos.x > 0: orangebox.pos.z -= velocity orangebox.pos.x -= velocity scene.bind("click", tidy_all)
Et voilà pour le code minimal fonctionnel du projet !
Le code source complet du projet est disponible ici.
J’ai ajouté une fonctionnalité qui peint le conteneur en vert quand toutes les formes rentrent sinon en rouge.