Jednostavna fizika: gravitacija, odbijanje i trenje
U igrama i simulacijama predmeti padaju, odbijaju se i usporavaju. Sve to možemo napraviti sa dve promenljive: položajem i brzinom. Ova lekcija povezuje programiranje sa fizikom iz 6. i 7. razreda (brzina, ubrzanje, sila Zemljine teže).
kod u ovoj lekciji koristi samo funkcije koje se isto zovu u Processing Python Mode-u i u py5 (
size, background, fill, ellipse, width, height), pa radi bez izmena i u Processing-u i u Thonny-ju.1. Brzina menja položaj, ubrzanje menja brzinu
U svakom frame-u: brzina se poveća za ubrzanje (gravitaciju), a položaj se pomeri za brzinu.
y = 50 # položaj lopte (piksela od vrha)
vy = 0 # brzina naniže (piksela po frame-u)
g = 0.4 # gravitacija: za koliko brzina raste svaki frame
def setup():
size(400, 400)
def draw():
global y, vy
background(230)
vy = vy + g # ubrzanje menja brzinu
y = y + vy # brzina menja položaj
fill(220, 60, 60)
ellipse(200, y, 40, 40)
Lopta pada sve brže – baš kao pravi predmet. Ali propada kroz pod. Popravićemo to.
2. Odbijanje od poda
y = 50
vy = 0
g = 0.4
odskok = 0.8 # koliko brzine ostaje posle udara (80%)
def setup():
size(400, 400)
def draw():
global y, vy
background(230)
vy = vy + g
y = y + vy
# pod je na visini height - 20 (poluprečnik lopte je 20)
if y > height - 20:
y = height - 20 # vrati loptu na pod
vy = -vy * odskok # obrni smer i izgubi deo energije
fill(220, 60, 60)
ellipse(200, y, 40, 40)
da lopta ne „uđe“ u pod. Ako to izostaviš, posle nekoliko udara lopta se zaglavi ispod poda i trese se.
3. Kretanje u stranu i trenje
Dodajemo brzinu po x osi. Trenje svaki frame malo smanji brzinu, pa lopta polako staje.
x, y = 50, 50
vx, vy = 4, 0
g = 0.4
odskok = 0.8
trenje = 0.99 # 1% brzine se izgubi svaki frame
def setup():
size(600, 400)
def draw():
global x, y, vx, vy
background(230)
vy = vy + g
vx = vx * trenje
x = x + vx
y = y + vy
if y > height - 20:
y = height - 20
vy = -vy * odskok
if x < 20 or x > width - 20: # zidovi levo i desno
vx = -vx
x = constrain(x, 20, width - 20)
fill(40, 120, 220)
ellipse(x, y, 40, 40)
4. Mnogo lopti – lista
Svaka lopta je lista [x, y, vx, vy]. Jedna petlja pomera sve lopte. Ovo je osnova za kišu, vatromet i sisteme čestica.
lopte = []
g = 0.3
def setup():
size(600, 400)
for i in range(15):
lopte.append([random(20, width - 20), random(20, 150), random(-3, 3), 0])
def draw():
background(230)
fill(40, 160, 90)
for l in lopte:
l[3] = l[3] + g # vy
l[0] = l[0] + l[2] # x
l[1] = l[1] + l[3] # y
if l[1] > height - 10:
l[1] = height - 10
l[3] = -l[3] * 0.85
if l[0] < 10 or l[0] > width - 10:
l[2] = -l[2]
ellipse(l[0], l[1], 20, 20)
Zadaci za vežbu
- Promeni
gna 0.1 – kako bi izgledalo na Mesecu? - Dodaj klik mišem koji daje loptama brzinu nagore (u py5:
mouse_pressed()). - Napravi da lopta menja boju posle svakog udara u pod.
- Izazov: senzor nagiba micro:bit-a neka menja smer gravitacije (vidi završni projekat).
Proveri znanje
Otvori kviz
Mini kviz: fizika u animaciji
1. Šta se menja svaki frame kada dodamo gravitaciju?
2. Šta znači vy = -vy * 0.8?
3. Šta radi vx = vx * 0.99?
Korisni spoljni resursi
- The Nature of Code (Daniel Shiffman) – besplatna knjiga o simulacijama prirode u kodu (na engleskom)
- PhET simulacije – fizičke simulacije, i na srpskom jeziku
