Fala. Ovo su ti inače poprilično zabavne vode.
Ovdje ti ne treba preveć kompleksnog programiranja, do izražaja više dolazi poznavanje matematike i nešto fizike. Ali ništa prestrašno.
Sada si me naveo baš da prokopam malo po bilješkama tih igrica, da se prisjetim čega je sve tamo bilo zanimljivoga xd.
Krenuvši od ovih puzzli, a i u većini igrica su matrice rotacije i translacije neizbježne:
Moram priznati vrlo nezgodne su bile u ovim puzzlama gdje postoji koordinatni sustav flipan oko horizontalne osi i koordinatni sustav flipan oko vertikalne osi.
Ako ništa drugo,naučio sam u ovome da koordinatni sustav koji je flipan i oko vertikalne osi i oko horizontalne osi, je isti originalnom koordinatnom sustavu zarotiranom sa 180 stupnjeva. Nekako zanimljiv mi fact.
Onda dok se prisjetim računanja odbijanja u sva četiri kvadranta:
Pa računanje koji objekti su u perspektivi kamere:
Nekad su skice poprilično šarene xd:
Pa računanje kolizije između objekata:
Inače, što se tiče kolizije objekata…to i nebi bio toliki problem izračunati da nemaš diskretnu vremensku os u igrici. Diskretna znači da imaš pauze između momenta t1 i t2 u kojem računaš stanja objekata. Moraš imati pauze, jer namaš beskonačnu procesorsku snagu koja bi to mogla računati kontinuirano za svaki moment t…kao što to svemir nekim čudom odrađuje za našu fiziku u beskonačno t momenata.
Pa tako recimo ako imaš loptu koja pada prema podu, ti ćeš njezinu poziciju izračunati u prvoj milisekundi, pa u 10milisekundi, pa u dvadesetoj…itd. Ovisi koliki interval već zadaš…
Pošto znaš početnu brzinu i poziciju lopte, te znaš i kolka je gravitacija koja djeluje na nju…onda u svakom tom momentu t možeš relativno lako izračunati njenu novu brzinu i put koji je prešla između prošlog t i trenutnog t. I tako u svakom tom intervalu računanja pronalaziš nove koordinate x,y,z lopte, te kooridnate transformiraš u 2D sustav kako bi dobio ekvivalente x,y koordinate i renderiraš loptu na toj x,y pozicji. I to je sva mudrolija za tijela koja se gibaju i na koja utječu neke sile…nije iza toga uopće neka strašna fizika.
I onda dalje kada vidiš da je lopta po visini došla ispod razine podloge, shvaćaš da dolazi do odbijanja…mijenjaš smjer brzine lopte, tako da paziš da ti je upadni kut vektora brzine isti izlaznom kutu. Također, da bi se realno odbila, dodaješ i nekakav koeficijent odbijanja…tako da iznos brzine nakon odbijanja bude umanjen prema tom koeficijentu od ulazne brzine prije odbijanja.
I tarannn…lopta se odbila od podloge i dalje ide u zrak. Zbog utjecaja gravitacije na vektor brzine, stat će u određenoj točki i opet se krenuti gibati prema dolje.
Ako koeficijent odbijanja postaviš da je 1, onda ćeš imati savršeno odbijanje…ili ti ga lopta će odskakati od poda beskonačno puta.
Probaj to složiti, baš je gušt zavrtiti tako nešto. Ne moraš s loptom…možeš napraviti npr. da naslov web stranice padne i odbije se od dna stranice i da se vrati gore…hehe. Moglo bi se svašta igrati.
Ali ima nešto strašno…čega sam se usrao kada sam shvatio koliko podiže kompleksnost za neke malo kompleksnije koolizije tijela.
Pošto imaš diskretne momente kada računaš poziciju lopte, to znači da ti nećeš računati koliziju točno u momentu kada je ona takla podlogu…nego ćeš računati njenu poziciju barem neki mali trenutak nakon što je ona trebala već taknut podlogu. A to znači da su vanjske koordinate lopte malo zašle u podlogu prije nego joj ti okreneš smjer kretanja.
U nekim jednostavnim stvarima to uopće ne stvara problem…ali stvari neće biti idealne. Recimo, gore sam spomenuo da koeficijent odbijanja ako je 1, da će se lopta odbijati neograničeno puta…svaki puta isto.
E pa zbog te male greškice ipak neće biti tako. I lopta će se svaki puta manje i manje odbiti…bez obzira što je koeficijent=1.
Izuo me iz gaća taj “bug” dok sam prvi puta shvatio što se dešava. Tu grešku za loptu i nije bilo tako teško koregirati, mada nije bilo ni jednostavno. (Sljedeća slika je izračun samo za tu grešku kako je koregirati)
No kada imaš više tijela koja mogu doći istovremeno u koliziju, stvar postaje noćna mora. Istraživao sam kako veliki igrači to rješavaju i kada sam vidio metode…zasrao sam se. Toliko "diferencijalne "matematike u životu nisam vidio.
To se zove i problem “leta metka” …jer ako želiš u tom svom t momentu kada računaš poziciju svakog tijela vidjeti da li je metak nešto pogodio…on ako je i pogodio svoju metu, vrlo vjerovatno je zbog velike brzine leta već daleko iza mete dok ti radiš kalkulaciju pozicija.
Pa ti onda više nije dovoljna pozicija metka, nego moraš računati i putanju metka da shvatiš jel bila koja meta na njegovoj putanji…što bi značilo da je pogođena.
Jednostavne stvari opet nisu problem, no što kada imaš metak koji se odbija od zidova i drugih tijela…koja se također međusobno odbijaju. E onda je fakat kompleksan problem.
Ili tri kugle koje se istovremeno sudaraju…pa ti računaj koja kugla je koju prva lupila i koji su izlazni vektori brzina.
A što tek kada imamo kugla u kontaktu kao u sljedećem videu:
(Ovo kada počmu drhtati…to je zbog ovog problema o kojem pričam. Vidiš da lik mijenja modove algoritma, svaki je drugačiji pristup problemu. A nijedan današnji pristup ovom problemu ga nije idealno riješio i svaki od pristupa nosi neke prednosti i mane. A problem je baš, da ponovim…da se zasereš u gaće )
Da se svašta izguglati o tom problemu i slike na sljedećem linku će bolje dočarati što sam rekao: