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: