Liikkuva pallo on siis luultavasti onnellisin jo siksi, että se voi liikkua ja tutkia maailman ihmeitä. Mutta mitä tapahtuu, jos toinen pallo päättää lakata seisomasta yhdessä paikassa ja myös liikkua? Sillä on täysi oikeus tehdä niin. Siinä tapauksessa törmäyksemme voi epäonnistua. Katsotaanpa joitain esimerkkejä:
Pallo1 liikkuu punaisen vektorin verran ja samalla pallo2 liikkuu sinisen vektorin määrällä. Meidän on otettava huomioon molemmat liikevektorit, jos haluamme havaita törmäyksen oikein.
Tässä kuvassa pallo1 on saavuttanut pisteen p2 ja pallo2 on saavuttanut pisteen p3, kun ne törmäävät. Olemme erittäin onnekkaita vektoreiden käyttämisessä, koska voimme laskea vektoreita helposti yhteen. Joten sen sijaan, että löydettäisiin törmäys 2 liikkuvan pallon välillä, vähennämme pallon 2 liikevektorin pallon1 liikevektorista ja voimme sitten käyttää liikkuvan pallon ja ei-liikkuvan pallon törmäyslaskelmaa edellisestä luvusta.
Etsi vektori v3 pallo1 aloituskoordinaateista, joka on pallo1 liikevektori vähennetty pallo2 liikevektori:
v3={};
v3.p0=pallo1.p0;
v3.vx=pallo1.vx-pallo2.vx;
v3.vy=pallo1.vy-pallo2.vy;
Nyt otetaan törmäyslaskelma viimeisestä luvusta, jolloin pallo1 liikkuisi vektorin v3 mukaan ja pallo2 ei liiku ollenkaan. Jos pallot törmäävät, pallo1 on pisteen p4 koordinaateissa. Löydämme uuden vektorin v4, joka on pallon1 liike siihen pisteeseen, kun pallot törmäävät:
peli.v4={p0:pallo1.p0, p1:p4};
Koska tiedämme, että molemmat pallot liikkuvat samassa ajassa, voimme löytää muuttujan “t”, joka on v4:n pituus jaettuna v3:n pituudella.
t=v4.len/v3.len;
Muuttuja “t” on välillä 0 ja 1. Kun se on 1, törmäys tapahtuu, kun molemmat pallot1 saavuttavat päätepisteensä. Jos t on 0, törmäys tapahtuu, kun pallot ovat lähtöpisteissään. Löytääksemme molempien pallojen koordinaatit, kun ne törmäävät, meidän on kerrottava niiden liikevektorit t:llä:
pallo1.p1.x=pallo1.p0.x+tpallo1.vx; pallo1.p1.y=pallo1.p0.y+tpallo1.vy;
pallo2.p1.x=pallo2.p0.x+tpallo2.vx; pallo2.p1.y=pallo2.p0.y+tpallo2.vy;
Olen tehnyt esimerkin 2 pallosta, jotka liikkuvat:
Voit vetää vektorien palloja tai päätepisteitä.
Voit ladata esimerkin lähdekoodin täältä.
Pomppivat 2 liikkuvaa palloa
Kun törmäyspaikat on löydetty, voimme muuttaa niiden liikevektoreita, kuten on selitetty kappaleissa “Pallo vs pallo” ja “Bounce”. Mutta meillä oli toistaiseksi vain 1 pallo liikkumassa ja 1 liikkuvalla pallolla se pomppi seinästä samalla nopeudella (vain liikesuunta vaihtui). Kun molemmat pallot liikkuvat, niiden liike vaikuttaa myös toiseen palloon ja tuloksena olevat liikevektorit on laskettava uudelleen molemmista liikevektoreista.
Pomppiminen riippuu molempien pallojen massasta. Elämän helpottamiseksi oletetaan, että palloilla on sama massa. Siinä tapauksessa ne vaihtavat liikevektorikomponenttinsa vektorin suunnassa keskipisteensä välillä:
vc on vektori pallojen keskipisteiden välillä, vcn on vc:n normaali. Nyt projisoimme molemmat liikevektorit v1 ja v2 vc:lle ja vcn:lle:
v1 jaetaan komponentteihin v1a ja v1b, samalla tavalla kuin v2 jakaantuu v2a:ksi ja v2b:ksi. Tuloksena olevaa liikevektoria varten v1a ja v2a vaihdetaan ja pallo1 saa uuden liikevektorin v1b:stä ja v2a:sta, kun taas pallo2 saa uuden liikkeen v1a:sta ja v2b:stä.
