VPython to pakiet, który wyposaża Pythona w ekran 3D i szereg obiektów, które można na nim realizować. Pierwotnym zamysłem była wizualizacja różnych zjawisk z zakresu fizyki i chemii. Urzekająca łatwość obsługi skłania do zabawy pakietem, warto jednak już na początku zwrócić uwagę na brak dźwięku i grafiki bitmapowej. Mimo tych ograniczeń można bardzo szybko tworzyć interesujące prezentacje, a nawet proste gierki.
2. Skąd wziąć VPythona?
Pakiet VPython można pobrać ze strony http://www.vpython.org/, bądź znaleźć go w dziale "Download".
3. Możliwości VPythona.
Poniżej prezentuję przykłady unaoczniające prostotę tworzenia programów operujących w przestrzeni 3D. Na koniec przedstawiam zaawansowane demko pokazujące, co tak naprawdę jest możliwe...
exampel1.py
Przykład ten pokazuje jak wygląda prosty program w VPythonie, animujący dwie kostki. W tym przykładzie dwa obiekty box zostały połączone w obiekt typu frame i jako całość są obracane. Dodatkowo kamera jest odsuwana parametrem range.
#!/usr/bin/python from visual import * from string import * #okienko o wymiarach 450 na 450... skrin=display(x=0, y=0, width=450, height=450, range=1) #grupujemy dwa obiekty box w jeden obiekt frame... frejm=frame() box(pos=[-10,10,-10], length=10, width=10, height=10, frame=frejm) box(pos=[10,-10,-10], length=10, width=10, height=10, frame=frejm) i=1 while i<120: # 50 klatek na sekunde rate(50) # obracanie obiektu frame frejm.rotate(axis=(1,1,1), angle=0.1) # odsuwanie kamery i=i+1 skrin.range=iexampel2.py
W tym przykładzie również dwa obiekty box zostały połączone w obiekt typu frame i jako całość są obracane, ale tym razem parametrem origin zadano punkt wokół którego się obracają. Dodatkowo obiekt frame jest poruszany po płaszczyźnie trajektorii danej wzorami sin i cos (w przykładzie okrąg).
from visual import * from string import * #okienko o wymiarach 450 na 450... skrin=display(x=0, y=0, width=450, height=450, range=100) #grupujemy dwa obiekty box w jeden obiekt frame... frejm=frame() box(pos=[-10,10,-10], length=10, width=10, height=10, frame=frejm) box(pos=[10,-10,-10], length=10, width=10, height=10, frame=frejm) i=1 while i<500: # 50 klatek na sekunde rate(50) #obracanie wzgledem punktu zadanego przez origin frejm.rotate(axis=(1,1,1), origin=[-10,-10,-10], angle=0.1) # przesuwanie obiektu frame po okregu i=i+1 p=int(60*sin(0.01*i)) q=int(60*cos(0.01*i)) frejm.pos=(p,q,0)musicdemo.py
Ten przykład jest bardziej złożony. Pokazuje jak połączyć animację VPythona z muzyką odtwarzaną w tle. Program składa się z dwóch procedur. Procedura aplayer odpowiada za odtwarzanie muzyki (mp3 lub wav), natomiast procedura zoomer animuje obiekt typu label manipulując parametrem height oraz iksową składową położenia. Jak widać procedura aplayer jest uruchamiana funkcją tworząc nowy wątek (ang. thread). Dzięki temu w tle powstaje wątek grający muzykę, a my możemy zająć się animacją. Warto zwrócić uwagę, że w VPythonie nie trzeba kasować obiektów wystarczy ustawić ich parametr visible na zero. Jak widać na samym końcu programu ekran/okno wyświetlania należące do VPythona można w ten sposób zamknąć. Aby obejrzeć przykład potrzebujesz jakiś plik do odegrania oraz dodatek pymedia.
#!/usr/bin/env python
# -*- coding: iso-8859-2 -*-
#------------------------------------------------------------------------------
from visual import *
import thread
def aplayer( name, card= 0 ):
import pymedia.audio.acodec as acodec
import pymedia.audio.sound as sound
import time
dec= acodec.decoder( str.split( name, '.' )[ -1 ].lower() )
snds= sound.getodevices()
if card not in range( len( snds ) ):
raise 'cannot play sound to non existent device %d out of %d' %
( card+ 1, len( snds ) )
f= open( name, 'rb' )
snd= none
s= f.read( 4096 )
while len( s ):
r= dec.decode( s )
if snd== none:
snd= sound.output( r.sample_rate, r.channels, sound.afmt_s16_le, card )
if r:
snd.play( r.data )
s= f.read( 1024 )
while snd.isplaying():
time.sleep( .05 )
def zoomer(napis):
mylab=label(text="", height=40, box=0)
mylab.color=color.black
mylab.text=napis
for i in range(0,60,2):
mylab.height=i
mylab.pos[0]=mylab.pos[0]-2
rate(10)
mylab.color=color.white
for i in range(60,0,-2):
mylab.height=i
mylab.pos[0]=mylab.pos[0]+2
rate(10)
mylab.visible=0
return
#------------------------------------------------------------------------------
# prezentacja
#------------------------------------------------------------------------------
skrin=display(width=800, height=600)
skrin.fullscreen = 1
skrin.range=180
thread.start_new_thread(aplayer, ( "music.mp3" , 0))
zoomer("vpython+pymedia")
skrin.visible=0
sys.exit()
pythondemo.zipJest to już bardziej zaawansowana prezentacja możliwości VPythona (również wymaga pymedia). Prezentacja ta została wystawiona na Symphony 2005 w demo compo. Pokazuje kilka ciekawych efektów i technik. Brak grafiki bitmapowej w VPythonie został rozwiązany poprzez wektoryzację małych obrazków w formacie ppm (Portable PixelMap). Ponieważ prezentacja ta została napisana jako procedury to może być kopalnią bardziej zaawansowanych przykładów. W archiwum znajduje się skompilowana wersja oraz kod źródłowy. Wymagane przy kompilacji pliki danych można skopiować z katalogu dist, gdzie znajduje się wersja skompilowana pod Win.
To by było na tyle.
Pozdrawiam.
autor: Zbigniew Trzcionkowski









