Animacija


Animacija krogle

Pri risankah dosežemo animacijo tako, da vrsto sličic dovolj hitro zamenjujemo, da dobimo vtis gibanja. Podobno je v Vpythonu. Vzpostaviti moramo zanko, v kateri spreminjamo nekatere atribute objektov (verjetno njihov položaj) in zanko ponavljamo dovolj hitro (tipično nekaj 10 krat v sekundi).

Funkcija rate() pove programu, kako pogosto mora osveževati prikaz. Na primer  rate(1) bi osveževala prikaz vsako sekundo, rate(1000), pa bi ga osveževala 100 krat na sekundo.

Kot primer si poglejmo spodnji program:

GlowScript 3.0 VPython
	  
planet =sphere(color=color.orange, radius=1) #ni vazno, kako damo krogli ime
planet.hitrost=vector(.01,0,0) #hitrost je usmerjena, je vektor

dt=0.01 #casovni korak (Eulerjeve integracije)

rate(1/dt) #kolikokrat naj bo slika osvezevana (100 krat na sekundo)

#Primer zanke v Pythonu:
while planet.pos.x<10: #ponavljamo, dokler ne dosežemo te oddaljenosti
planet.pos+=planet.hitrost*dt #zamik stavkov v bloku
if planet.pos.x > 9.0:



Za animacijo planeta smo uporabili hitrost (velocity), ki je časovni odvod položaja. Za majhne časovne korake  Dt, velja

Dx = v Dt
kar pomeni, da moramo osveževati  položaj planeta po naslednji formuli
x(novi)=x(stari)+Dx = x(stari) + vDt

Zanka in s tem animacija se zaključi, ko položaj planeta v smeri x preseže 10.

Domača naloga: Predelaj program tako, da se bo planet premikal v smeri osi y in to s pospeškom  -10 m /s2.



Krogla med dvema stenama

Steni ponazorimo z dvema zelo tankima kvadroma. Pri trku z njima mora krogla spremeniti smer oziroma hitrost.

GlowScript 3.0 VPython
scene2 = canvas(title='Dve plosci in krogla',
     width=300, height=200,
     center=vector(0,0,0), background=color.black)
krogla = sphere(pos=vector(-5,0,0), radius=0.5, color=color.red)
desnaStena = box(pos=vector (6,0,0), size=vector(0.2,4,4), color=color.green)
levaStena = box(pos=vector(-6,0,0), size=vector(0.2,4,4), color=color.green)
dt = 0.05
krogla.hitrost = vector(2,0,0)
while (1==1):      #neskoncna zanka
    rate(100)
    krogla.pos = krogla.pos + krogla.hitrost*dt
    if krogla.pos.x > desnaStena.pos.x:
        krogla.hitrost.x = -krogla.hitrost.x
    if krogla.pos.x < levaStena.pos.x:
        krogla.hitrost.x = -krogla.hitrost.x 

Krogla v škatli


Za konec še bolj zanimiv in poučen  ter lepo sprogramiran primer, ki že kar meji na igrico . Oglej si kodo :

side = 4.0
thk = 0.3
s2 = 2*side - thk
s3 = 2*side + thk

wallR = box (pos=vector( side, 0, 0), size=vector(thk, s2, s3), color = color.red)
wallL = box (pos=vector(-side, 0, 0), size=vector(thk, s2, s3), color = color.red)
wallB = box (pos=vector(0, -side, 0), size=vector(s3, thk, s3), color = color.blue)
wallT = box (pos=vector(0, side, 0), size=vector(s3, thk, s3), color = color.blue)
wallBK = box(pos=vector(0, 0, -side), size=vector(s2, s2, thk), color = color.gray(0.7))

ball = sphere (color = color.green, radius = 0.4, make_trail=True, retain=200)
ball.mass = 1.0
ball.p = vector (-0.15, -0.23, +0.27)

side = side - thk*0.5 - ball.radius

dt = 0.3
def move():
rate(200, move)
ball.pos = ball.pos + (ball.p/ball.mass)*dt
if not (side > ball.pos.x > -side):
ball.p.x = -ball.p.x
if not (side > ball.pos.y > -side):
ball.p.y = -ball.p.y
if not (side > ball.pos.z > -side):
ball.p.z = -ball.p.z

move()