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 sa séminaire séminal 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, nous n'avons pas pu 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 *

"""
Ceci affichera la sinusoïde 
"""
scene.title = "Sinusoïde"
scene.center = vector(0,0,0)

# Utilisez un objet 'box' approprié comme axe de x 
xaxis = box(length= 20, height=0.2, width= 0.5, color=color.blue)

# Créez l'objet 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 (floor) est une instance d'un objet 'box' comportant des 
# attributs tels que la longueur (length), la hauteur (height), la largeur (width), etc.
floor = box(length=4, height=0.5, width=4, color=color.blue)

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

# La boule se déplace le long de l'axe y 
ball.velocity = vector(0,-1,0)

# Petit changement de temps 
dt = 0.01

while 1:
    # Réglez la vitesse du taux d'animation
    rate(100)
    # Changez la position de la boule en fonction de la vitesse le long de 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

# Importez pygame pour passer de la musique de fond :)
# import pygame
# Décommentez cette ligne si vous avez des lunettes rouge-bleu
scene.stereo='redblue'

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

# Décommentez ces lignes 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 PROUDLY PRESENTS', 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
	# À présent jouez 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)
	# À présent supprimez l'en-tête
	Header.makeinvisible()
	scene.range = 10
	scene.fov = 0.2
	Body= text(pos=(0,3,0), string='A CELEBRATION OF LINUX ', color=color.red, depth=0.3, justify='center')
	Body.reshape(color=color.orange)
        # Ici je n'ajoute pas le reste du code car il affiche simplement le 
        calendrier des programmes de ces journées
	# Invoquez 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.