Exemple VPYTHON
Exemple de code en VPython:
J'ai réalisé ce programme pour montrer aux élèves de 1 ère S les possibilités du langage Python pour l'option ISN de Terminale S. En particulier pour faire des animations 3D performantes avec peu de lignes de codes.
Voilà le code du fichier principal:
# -*- coding: cp1252 -*-
from visual import *
from random import randint
from newvaisseau import*
import pygame
### partie son ###
pygame.mixer.init()
son1 = pygame.mixer.Sound("wind-jd1-Bb.aif")
son1.set_volume(0.5)
son1.play(-1)
### partie son ###
scene.title = "invasion"
##scene.stereo = 'redcyan'
############### format 16:9 idéal pour youtoube ########################
# ou bien: 1280*720 1920*1080
scene.width = 1280
scene.height = 720
grey = (0.8, 0.8, 0.8)
#visualisation des axes
#arrow(pos=(0 ,0 ,0 ), axis=(2, 0, 0), color=color.red)
#arrow(pos=(0 ,0 ,0 ), axis=(0, 2, 0), color=color.green)
#arrow(pos=(0 ,0 ,0 ), axis=(0, 0, 2), color=color.blue)
########################## planète ###################################
s=sphere(pos=vector(-200,0,50), radius=8, color=grey, material=materials.wood)
######################################################################
########################## boule furtive ###################################
b = sphere(pos=vector(-500,0,-10), radius=0.1, color=(0,0.6,1), opacity=1, material=materials.emissive)
blum = local_light(pos=(-500,0,-10), color=color.blue)
######################################################################
########################## soleil caché ###################################
soleil1 = local_light(pos=(-400,-50,-100), color=color.red)
######################################################################
################### direction de la caméra ############################
vecteur = (-1,-0.2,0)
scene.forward = vecteur
scene.range = 15
# pour visualiser la direction de la caméra:
#arrow(pos=(10 ,5 ,5 ), axis = vecteur, color=color.white)
#######################################################################
######################## fond #########################################
import Image
### Le code pour créer une texture d'image:
name = "cosmos"
width = 2048 # doit être une puissance de 2
height = 2048 # doit être une puissance de 2
im = Image.open(name+".jpg")
# pour décaler l'image:
im = im.crop((10,10,600,600)) # (0,0) est le coin supérieur gauche
im = im.resize((width,height), Image.ANTIALIAS)
materials.saveTGA(name,im)
cosmos = materials.texture(data=materials.loadTGA("cosmos"), mapping="sign")
fond1 = box(pos=(-400, 0, 0), axis=(1,0,0), size=(1,600,600), color=grey, material=cosmos)
#######################################################################
listeframe=[0,0,0,0,0]
listevaisseaux=[0,0,0,0,0]
for i in range(5):
# chaque vaisseau est construit dans une frame différente
# regroupées dans la liste listeframe
listeframe[i]= frame()
listevaisseaux[i]= fabrik(listeframe[i])
# position de départ de la frame:
ordo=randint(-20,20)
cote=randint(-20,20)
listeframe[i].pos = (-120-i*50,ordo,cote)
vitesse=0.8
vb=0.3
j=0
a=0.005
while True:
rate(80)
s.rotate(angle=a, axis=(0,1,0), origin=(-200,0,50))
for i in range(5):
listeframe[i].pos.x = listeframe[i].pos.x + vitesse
if listeframe[j].pos.x>25:
ordo=randint(-30,30)
cote=randint(-30,30)
listeframe[j].pos = (-120-i*50,ordo,cote)
j=j+1
if j>4:
j=0
b.pos.x = b.pos.x + vb
blum.pos.x = blum.pos.x + vb
if b.pos.x > 200:
b.pos.x=-500
blum.pos.x=-500
Puis le code du module newvaisseau.py qui est importé au début comme vous l'avez remarqué! (hum...Hum... Pas si sûr!!! )
# -*- coding: cp1252 -*-
from visual import *
def fabrik(pak):
# tous les objets créés sont placés dans la frame f.
box1=box(frame = pak, size=(5,1,10))
box2=box(frame = pak, size=(3,0.5,5),pos=(2,-0.5,0))
# cylindre gauche principal et réacteur:
cyl_g1= cylinder(frame = pak,pos=(-3,0,-5),axis=(10,0,0), radius=1)
cyl_g11= cylinder(frame = pak,pos=(-6,0,-5),axis=(14,0,0), radius=0.5)
cyl_g12= cylinder(frame = pak,pos=(-3,0,-6),axis=(6,0,0), radius=0.4)
#canon gauche et laser:
cyl_g13= cylinder(frame = pak,pos=(-3,0,-5),axis=(14,0,0), radius=0.1)
ring1=ring(frame = pak, pos=(0,0.5,0), axis=(0,1,0), radius=2, thickness=0.1)
# cylindre droit principal et réacteur:
cyl2= cylinder(frame = pak,pos=(-3,0,5),axis=(10,0,0), radius=1)
cyl21= cylinder(frame = pak,pos=(-6,0,5),axis=(14,0,0), radius=0.5)
cyl22= cylinder(frame = pak,pos=(-3,0,6),axis=(6,0,0), radius=0.4)
#canon droit et laser:
cyl_d23= cylinder(frame = pak,pos=(-3,0,5),axis=(14,0,0), radius=0.1)
#les ailerons:
aileron1= faces(frame = pak, pos = [(5,0,-5.2),(-5,0,-5.2),(-5,3,-8)] )
aileron1.make_twosided()
aileron11= faces(frame = pak, pos = [(5,0,-5.2),(-5,0,-5.2),(-5,-3,-8)] )
aileron11.make_twosided()
cyl24= cylinder(frame = pak,pos=(-7,-2,-7.1),axis=(8,0,0), radius=0.05)
cyl25= cylinder(frame = pak,pos=(-7,2,-7.1),axis=(8,0,0), radius=0.05)
aileron2= faces(frame = pak, pos = [(5,0,5.2),(-5,0,5.2),(-5,3,8)] )
aileron2.make_twosided()
aileron22= faces(frame = pak, pos = [(5,0,5.2),(-5,0,5.2),(-5,-3,8)] )
aileron22.make_twosided()
cyl26= cylinder(frame = pak,pos=(-7,-2,7.1),axis=(8,0,0), radius=0.05)
cyl27= cylinder(frame = pak,pos=(-7,2,7.1),axis=(8,0,0), radius=0.05)
s1=sphere(frame = pak, pos=vector(0,0,0), radius=2 )
for obj in pak.objects:
obj.color = (0.5,0.5,0.5)
obj.material=materials.marble
Comme on le voit bien, c'est la fonction fabrik() qui fait le job...
N'oubliez pas de joindre votre fichier .aif et .jpg pour que cela fonctionne.
Attention à utiliser VPYTHON 32 bits et PYTHON 2.7 32 bits pour utiliser le module PYGAME.
Bon voyage!
Et le résultat: