Programmer en 3D avec Vpython

Gazette Linux n°144 — Novembre 2007

Deny

Adaptation française

Joëlle Cornavin

Relecture de la version française

Article paru dans le n°144 de la Gazette Linux de novembre 2007.

Article publié sous Open Publication License. La Linux Gazette n'est ni produite, ni sponsorisée, ni avalisée par notre hébergeur principal, SSC, Inc.


Table des matières

1. Introduction
1.1. D'après une histoire vraie
1.2. Vpython entre en scène
2. Un « Bonjour monde » en 3D
2.1. Explorer quelques détails de la vision en 3D
2.2. Un peu de physique avec Vpython
2.3. De Mars vers le passé
3. Conclusion
4. Références

1. Introduction

« La programmation 3D pour le commun des mortels » — affirme le site web du projet Vpython. Vpython est un module python pour la programmation scientifique en 3D, particulièrement utile pour les personnes ayant une formation en physique.

1.1. D'après une histoire vraie

Il y a presque 3 ans, le Department of Computer Applications, du Government Engineering College de Thrissur (Inde) a décidé de tenir son séminaire national annuel et son concours de programmation, connu sous le nom de Renaissance 2005, au mois de novembre. Les fervents de Linux (dont je fais partie) ont convaincu les professeurs de faire de Renaissance 2005 une célébration de l'open source et du libre. Notre décision était de faire un vibrant éloge de Linux. Presque tous les programmes concernaient les technologies liées à Linux.

Nous avons tenu des réunions régulières pour garantir la qualité du programme. Au cours de l'une de ces réunions, nous avons abordé une petite mais importante question de l'un des participants : comment allons-nous gérer la Conférence Multimédia Introductive ? Dans notre université, la « Conférence introductive » était le moyen de montrer le talent artistique et technique du département d'accueil. La plupart des autres départements employaient des présentations flatteuses de type Flash® pour leurs introductions. Mais nous avons décidé de ne pas dépendre de technologies « non aussi ouvertes », et d'en lancer une pour nos propres besoins. Cependant, il ne nous a pas été possible d'arriver à une conclusion sur la technologie alternative à ce jour.

1.2. Vpython entre en scène

Chaque fois que nous avons eu un doute technique, nous avons toujours trouvé quelqu'un vers qui nous tourner. Notre équipe a rencontré notre estimé mentor « Mr. Pramode CE » chez lui. En soumettant notre exigence « quelque peu étrange », nous avons entendu ce que nous voulions entendre. « Vous pouvez essayer Vpython à cet effet. Vous pouvez intégrer la musique à votre application à l'aide de gamepy si vous voulez tirer partie des capacités multimédia de python ».

2. Un « Bonjour monde » en 3D

Le module visuel peut être téléchargé sur http://vpython.org. Il dépend des bibliothèques Numpy, gtkglarea et boost. Mais pour l'utilisateur Debian ou Ubuntu, une seule ligne suffit :

	
apt-get install python-visual

Installez le module gamepy si vous voulez ajouter de la musique à vos présentations. Naturellement, gamepy peut bien plus que simplement lire de la musique ! On peut l'installer à l'aide d'apt :

	
apt-get install gamepy

Python est célèbre pour sa simplicité et son élégance. Le programme vpython « Bonjour monde » se présente de la manière suivante :

from visual.text import *
# Pour le moment, VPython ne prend en charge que les nombres 
# et les caractères en majuscules. Les autres caractères seront
# affichés sous la forme "*"
# Indiquer le titre de la fenêtre
scene.title = "Bonjour monde"
# Ici on place le texte bonjour monde
text(pos=(0,3,0), string='BONJOUR MONDE', color=color.orange, depth=0.3, justify='center')

Quand vous exécutez ce programme sous le nom python bonjourmonde.py, voici à quoi la sortie ressemblera :

À présent, essayons une sinusoïde en 3D. Vous pourrez déplacer cette courbe à l'aide de votre souris :

from visual import *

"""
Ce programme va afficher la courbe sinusoïde
"""
scene.title = "Courbe sinusoïde"
scene.center = vector(0,0,0)
# Utilisation d'un objet "box" approprié comme x- axis
xaxis = box(length= 20, height=0.2, width= 0.5, color=color.blue)

# Création de l'objet courbe sinusoïde
sinecurve = curve( color = color.red, radius=0.2)
dt = 0.1

for t in arange(0,10,dt):
    dydt = vector( t,sin(t), 0 );
    sinecurve.append( pos=dydt, color=(1,0,0) )
    rate( 500 )

Si vous voulez essayer une « application réelle » comme une horloge, programmons une horloge 3D amusante :

from visual.text import *
import time

scene.title = "Horloge 3D"
while 1:
        rate(100)
        cur_time = time.localtime()
        time_string = str(cur_time[3]) +": "+ str(cur_time[4]) + ": "+ str(cur_time[5])
        timer = text(pos=(-3,0,-2), string=time_string, color= color.red, depth=0.5 )
        time.sleep(1)
        timer.makeinvisible()

2.1. Explorer quelques détails de la vision en 3D

La stéréovision offre la perception visuelle en 3D. Chaque œil humain capture sa propre vue, et les deux images distinctes sont envoyées au cerveau afin qu'il les traite. Quand les deux images arrivent simultanément dans le cerveau, elles sont réunies en une seule image. L'image résultante est une image stéréo tridimensionnelle. Cette disparité binoculaire est interprétée par le cerveau sous le terme de profondeur.

Vpython est capable de générer des objets 3D réels. La stéréovision bleu-rouge peut être activée dans vpython en réglant scene.stero='redblue' dans les programmes. Nous avons besoin de lunettes « bleu-rouge » pour voir le « spectacle » de la 3D.

2.2. Un peu de physique avec Vpython

Le but principal du module visuel est de populariser les visualisations en physique. Ainsi, analysons les secrets de la force gravitationnelle de notre terre à l'aide de la très célèbre équation Vt = V0 + at, où Vt est la vitesse au temps t, V0 est la vitesse initiale et a est l'accélération (dans le cas d'un corps en chute, l'accélération est g, l'accélération due à la pesanteur, c'est-à-dire, 9,8 m/s2).

En outre, V = d/t, c'est-à-dire la vitesse, est le taux de variation du déplacement. Réunissons l'ensemble :


from visual import *

# Un plancher est une instance d'un objet "box" comportant des attributs comme la longueur, la hauteur, la largeur, etc.
floor = box(length=4, height=0.5, width=4, color=color.blue)

# Une balle est un objet sphérique comportant des attributs comme la position, le rayon, la couleur, etc..
ball = sphere(pos=(0,4,0),radius=1, color=color.red)

# La balle se déplace dans l'axe y 
ball.velocity = vector(0,-1,0)

# Petit changement de temps 
dt = 0.01

while 1:
    # Régler le taux de la vitesse d'animation
    rate(100)
    # Changer la position de la balle en fonction de la vitesse sur l'axe y 
    ball.pos = ball.pos + ball.velocity*dt
    if ball.y < 1:
        ball.velocity.y = -ball.velocity.y
    else:
        ball.velocity.y = ball.velocity.y - 9.8*dt

Remplacez l'accélération due à la pesanteur (ici 9,8) par l'accélération due à la gravité dans Mars pour voir comment la boule rebondit sur Mars. Plus tard, on peut modifier la valeur pour voir comment la balle rebondira dans d'autres planètes. Découvrir l'accélération due à la gravité pour d'autres planètes est laissé à titre d'exercice pour le lecteur.

2.3. De Mars vers le passé

Enfin, le moment de la conférence Renaissance est arrivé. La veille de l'inauguration, je suis allé au magasin de jouets local pour acheter la « matière première » nécessaire pour les lunettes de stéréovision rouge-bleu. J'y ai acheté 25 lunettes colorées en rouge et 25 lunettes colorées en bleu. Cela ne m'a coûté qu'environ 1,38 €. À l'hôtel, nous avons créé 50 lunettes de stéréovision rouge-bleu en maintenant le verre rouge dans le cadre droit et le verre bleu dans le cadre gauche.

Après l'inauguration, j'ai mené une session interactive sur Vpython avec l'aide d'un projecteur. Mes amis ont distribué les « lunettes de stéréovision rouge-bleu » au public. Après la session, j'ai montré aux participants la véritable introduction multimédia 3D de la conférence Renaissance :

from visual.text import *
import time

#Importer pygame pour lire la musique de fond :)
#Importer pygame
#Décommentez cette ligne si vous avez des lunettes bleu/rouge
scene.stereo='redblue'

scene.title = "Renaissance"
#scene.fullscreen = 1
scene.fov = 0.001
scene.range = 0
rate(100)

#Décommentez cette ligne si vous devez passer de la musique de fond 
#pygame.mixer.init()
#intromusic=pygame.mixer.Sound("/usr/share/sounds/KDE_Startup.wav")
#pygame.mixer.Sound.play(intromusic)

def intro():
        Title= text(pos=(0,3,0), string='MCA EST FIER DE PRESENTER', color=color.red, depth=0.3, justify='center')
        for i in range(20):
                rate(10)
                scene.range = i
        Title.makeinvisible()
        scene.range = 0
        Header= text(pos=(0,3,0), string='RENAISSANCE 2005', color=color.yellow, depth=0.3, justify='center')
        for i in range(20):
                rate(10)
                scene.fov = 3
                scene.range = i
        # Jouez maintenant avec les couleurs
        Header.reshape(color= color.cyan)
        time.sleep(1)
        Header.reshape(color= color.blue)
        time.sleep(1)
        Header.reshape(color= color.green)
        time.sleep(1)
        Header.reshape(color=color.orange)
        time.sleep(1)
        Header.reshape(color= color.red)
        # On supprime maintenant l'en-tête
        Header.makeinvisible()
        scene.range = 10
        scene.fov = 0.2
        Body= text(pos=(0,3,0), string='UNE CELEBRATION DE LINUX ', color=color.red, depth=0.3, justify='center')
        Body.reshape(color=color.orange)
        #Ici on n'ajoute pas le reste du code puisqu'il n'affiche que le programme de ces journées
# Exécution de la fonction intro()
if __name__ == '__main__':
        intro()

3. Conclusion

Renaissance 2005 est devenu un des programmes les plus aboutis jamais conduit avec GEC. Mais l'impression la plus importante que j'ai ressenti est que nous avons vraiment pris du plaisir. Notre équipe a réussi a montré aux autres combien Linux peut être amusant.

4. Références

Maxin B. John travaille pour HCL Infosystems Ltd®, à Pondicherry (Inde) et il est MCA Graduate du Collège gouvernemental de Thrissur. Il aime pratiquer Python et Bash. Il remercie son gourou, Mr. Pramode C.E de l'avoir initié au monde merveilleux de Linux.

Adaptation française de la Gazette Linux

L'adaptation française de ce document a été réalisée dans le cadre du Projet de traduction de la Gazette Linux.

Vous pourrez lire d'autres articles traduits et en apprendre plus sur ce projet en visitant notre site : http://wiki.traduc.org/Gazette_Linux.

Si vous souhaitez apporter votre contribution, n'hésitez pas à nous rejoindre, nous serons heureux de vous accueillir.