Jednostavna fizika: gravitacija, odbijanje i trenje

Lekcija 8 od 20 · Python i Processing

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).

Radi u oba okruženja:
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)
Zašto vraćamo y na pod?
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 g na 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