Vpython, créer une animation 3d facilement avec python

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.

Upidev vpython 
 débuter 3d
Vpython, débuter en 3d

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.

Upidev vpython conteneur 3d

Sol

Upidev vpython floor 3d

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

upidev vpython leftface 3d

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

vpython frontface conteneur

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

vpython 3d orangebox

Créons la boite avec le code suivant :

orangebox = box(color=color.orange, height=0.5)

Purple Box

vpython 3d purplebox

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

vpython 3d bluebox

Ici le code pour la boite bleue.

bluebox = box(color=color.blue, height=0.5, width=0.5, length=0.5)

Yellow Box

vpython 3d yellowbox

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.

0

Laisser un commentaire