Olemme vaivanneet seiniä toistaiseksi tarpeeksi, ne ovat pomppineet pallosta hyvin ja ansaitsevat mukavan pienen tauon, he ehkä haluavat nauttia kupillisen kuumaa kahvia tai teetä (maitoa, ilman sokeria) samalla kun hoidamme kahden pallon törmäyksen. Pääpallo liikkuu edelleen, samoin liikevektori, mutta toinen pallo ei liiku. Ehkä se oli naulattu lattiaan, ehkä se oli liimattu kattoon tai se voi olla liian pieni ja tyhmä eikä ole vielä oppinut liikkumaan.
Ensin nähdään kuinka tietää, törmäävätkö pallot, ja sitten mietitään mitä tehdä liikkuvalle pallolle törmäyksen jälkeen.
Kuvassa pallo1 (punainen) on törmännyt palloon2 (sininen). Molempien pallojen keskipisteiden välinen vektori on v (vihreä). Törmäys tapahtuu vain, jos vektorin v pituus on pienempi kuin molempien pallojen yhdistetyt säteet. Meidän on asetettava liikkuva pallo aivan toisen pallon viereen ja voimme tehdä sen, kun siirrämme palloa1 takaisin v:n suuntaan määrällä:
kynä=v.len-(b1.r+b2.r)
Nyt pallot on asetettu kauniisti ja siististi vierekkäin, meidän täytyy keksiä kuinka muuttaa liikevektoria. Kuvittele näkymätön seinä sijoitettuna kahden pallon väliin ja seinän suunta on täsmälleen sama kuin pallojen keskipisteiden välisen vektorin normaali.
Kuvan musta vektori on vektorin v normaali ja pallon1 liikevektori lasketaan ikään kuin pallo pomppaisi siitä seinästä.
Olen tehnyt esimerkin 1 pallosta, joka liikkuu lavalla useiden paikallaan olevien pallojen kanssa:
Yritä vetää muita palloja ympäriinsä.
Voit ladata esimerkin lähdekoodin täältä.
Pidä se sisällä
Haluat ehkä pitää pallon liikkuvan toisen (ilmeisesti suuremman) pallon sisällä.
Tässä tapauksessa iso pallo on b2 ja pieni liikkuva pallo b1. Pieni pallo on siirtynyt ulos, jos
b2.r<(b1.r+v.len)
Kun näin tapahtuu, meidän on siirrettävä se takaisin sisään, määrällä
var pen=b2.r-(b1.r+v.len)
Älä myöskään unohda kääntää vektorin v normaalin suuntaa, jota käytetään pomppimiseen:
var vbounce={dx:-v.dy, dy:v.dx, lx:-v.dx, ly:-v.dy};
Voit ladata lähdekoodin pallosta pallon sisällä pitämisestä tästä.
