Mielőtt tovább mennénk, röviden ismételjük kicsit át a fizikai mennyiségeket, amiket kinematika és dinamika témakörében megismerhettünk az általános és középiskolás fizika tanulmányainkban. Ezek megértése elengedhetetlen a Unity vagy bármilyen egyéb szimulált fizika hatékony és akkurátus használatához.
A klasszikus mechanika a fizikának azon ága, ami a fizikai testek mozgását és a rajtuk ható erők hatását vizsgálja.
A kinematika a mechanika azon részterülete, ami pusztán a testek mozgásával foglalkozik.
Ezzel szemben a dinamika számításba veszi a fizikai objektumok tömegét is. A dinamika a testeken ható erők tudománya függetlenül attól, hogy ezen erők mozgást eredményeznek-e.
Fizikai mennyiségek és mértékegységek
A C#-ban nem tudunk mértékegységet rendelni egy primitív szám típushoz. Ezért a mértékegységek mindig konvenció, megegyezés tárgyát képezik és a dokumentáció kell, hogy tartalmazza őket. Gyakran a változó vagy függvényparaméter neve is árulkodik a mértékről.
Az informatika egyik leghírhedtebb bug-ja is a programozás azon hiányosságából fakadt, hogy a legtöbb nyelvben egy beépített (integer, fix- vagy lebegőpontos) szám típushoz nem tudunk egyszerűen hozzárendelni egy fizikai mértékegységet.
1998-ban a NASA sikeresen a világűrbe juttatott egy műholdat, aminek a feladata az volt, hogy a Mars körül keringve éghajlati adatokat gyűjtsön a vörös bolygóról.
Egy évvel később azonban a műhold pályára állítása sikertelen volt. Szeptember 15-én az űrügynökség minden kapcsolatát elvesztette az egységgel és jelenleg senki nem tudja mi történt vele. A két lehetséges forgatókönyv szerint a műhold vagy elveszett az űrben és most valahol kering a naprendszeren belül, vagy pedig a Mars atmoszférájába lépve darabokra hullott. Utóbbi eset a valószínűbb.
Az incidenst követő kivizsgálás megállapította, hogy a hiba egy számítási tévedésből adódott. A projekten közreműködő Lockheed Martin cég Amerikai egységekben számolt, míg a NASA a tudományos közösségben még az USA-ban is bevett SI mértékegység-rendszert használta. Az átváltás nem történt meg, így az eszköz bolygó körüli pályáját a műhold hibátlanul működő hardware-e értelmetlen adatok alapján próbálta korrigálni.
A projekttel az űrügynökség (akkori árfolyamon) 125 millió dollárt és mérnökök százainak számtalan befektetett munkaóráját bukta el. Ironikus belegondolni, hogy a hiba kiküszöbölhető lett volna egyetlen sor kóddal.
A klasszikus fizika három alapvető mértéke, az, idő, távolság és tömeg.
Fizikai mennyiség | Angol név | Jelölés | SI mértékegys. | Unity mértékegys. |
Idő | Time | |||
Út | Distance | |||
Tömeg | Mass |
A Unity, ha időről van szó mindig másodpercben kezeli a számokat. Ez fizika témakörén kívül is igaz. Gondoljunk csak a Time osztály lekérdezéseire: Time.deltaTime
, Time.time
, stb. Ezek mind másodpercben adják vissza az értékeiket.
A távolságra, vagy megtett útra nincs fix mértékegység Unity-ben. Egyszerűen csak egységként (unity) szoktunk hivatkozni rá. Ezen névtelen távolság-egység megjelenik a világkoordinátarendszer egyes tengelyein. Tehát a Transform komponens position
paraméterében is ebben az egységben értendők az értékek.
Az az oka annak, hogy nincsen előre megszabva egy valós világ beli mértékegység a távolságméréshez, mint például a méter vagy a yard, mert játéktól függően hasznos lehet egyedi értéket választani. Ha például egy négyzetrács alapú játékot készítek, mondjuk sakkot, akkor sokkal kényelmesebb egy négyzetrács oldalát egy egységnek kezelni, mint folyamatosan átváltogatni a méter és a négyzetrácsméret közt. Ekkor nem érdekelne, hogy egy sakkbábú mérete, hogy aránylik a méterhez, és minden bábú állhatna egész számú pozíción.
Ezért minden olyan mérték, ami leszármazik a hosszból, az szintén ezzel az egyedileg választott egységgel számolandó. Pl.: A sebesség nem méter/szekundum mértékegységben értendők, hanem egység/szekundum-ban.
Mindazonáltal, a legtöbb játék esetén javasolt egy egységet pontosan egy méternek megfeleltetni. Ez főleg akkor igaz, ha a tárgyaink és karaktereink a hétköznapi életben megszokott “emberi” mérettartományban mozognak.
A Unity is méterrel számol alapesetben, ha fizikát használunk. Pl.: A játékmotorban a kezdeti beállítás a szimulált gravitáció gyorsulására 9,81 egység lefelé. Ez persze a Unity beállításai közt mértékegység nélkül szerepel, de nem nehéz rájönni, mi alapján választották az értéket: A default gravitációs gyorsulás a földön SI mértékegységben kifejezve hozzávetőlegesen 9,81 .
Persze nem muszáj mindezt megtartani. Ha jó okunk van rá, eltérhetünk az SI rendszertől és, választhatunk saját távolságegységet. A fontos, hogy ezeket minden projekt esetén fejben vagy saját dokumentációban tisztázzuk. Ezáltal elkerülhetjük, hogy egyes mértékeket csak kísérletezés alapján tudjunk beállítani. Ehelyett a valós élet megszokása alapján már lesz a fejünkben egy intuitív megközelítő érték.
A hosszmértékhez hasonlóan működik a tömeg is. A Unity kilogrammban javasolja a használatát, de ettől eltérhetünk. Viszont ezt is csak akkor tegyük, ha jó okunk van rá.
Hasonlóan fontos, hogy saját mértékeink gondos megválasztásával elkerüljük, hogy szükségtelenül nagy és szükségtelenül alacsony számokat kelljen használnunk.
Például ha nem tudjuk, hány méternek felel meg egy térbeli egység a játékunkban, akkor nem fogjuk tudni fejből megmondani, hogy mondjuk mi számít reális futási sebességnek egy emberi karakter számára. Lehet, hogy száz millió, del lehet egy-százmilliomod is. Ha nem tudjuk a saját mértékeinket, el vagyunk veszve.
A Unity-ban beépített 2D és 3D fizikai szimuláció is úgy működik a legjobban, ha a beállított értékeink egy középtartományban mozognak, se nem túl nagyok, se nem túl alacsonyak. Ez a középtartomány az 1-es szám környékén lévő körülbelül 5-10 nagyságrendet jelenti.
Vektormennyiségek a lineáris fizikában
Az alábbi táblázat tartalmazza a legfontosabb mértékeket, amikre a játékfizikához szükségünk lesz, valamint azok mértékegységeit.
Fizikai mennyiség | Angol név | Jelölés | SI mértékegység | Hasznos képlet |
Sebesség | Velocity | (Egyenletes mozgás) | ||
Sebesség változás | Velocity Change | |||
Gyorsulás | Acceleration | (Egyenletes vált. m.) | ||
Lendület | Momentum | |||
Lendület változás | Impulse | |||
Erő | Force | (Newton II.) |
A fentiek mindegyike egy úgynevezett vektormennyiség. Ez azt jelenti, hogy nem csak értékük, de irányuk is van. A vektormennyiségeket általában úgy ábrázoljuk, hogy egy kis nyilat teszünk a szimbólum fölé:
Az irányt általában egy egység hosszú irányvektor tárolja. Jelölése: A hosszat másképp a vektor abszolút értékének is nevezzük: Jelölése
Nem véletlen, hogy ez a nevük: “vektormennyiség”. Ahogy a fenti mennyiségeknek, úgy egy vektornak is van egy iránya és egy hossza. Ez azt jelenti, hogy a fenti fizikai mennyiségeket ideálisan tudjuk tárolni egy Vector2
vagy Vector3
típusú változóban.
Emlékezzünk vissza, így tettünk akkor is, amikor egyenletes mozgást kódoltunk le. A sebességet egy velocity
nevű sebességvektorban tároltuk. Ezen sebességvektort egy egység hosszú vektor és egy skalár (float szám) szorzatából kaptuk meg, ahol a vektor az irányt a skalár pedig a sebesség mértékét adta meg.
Vector3 direction = Vector3.right; // Sebesség iránya (Egység hosszú vektor)
float speed = 5; // Sebesség mértéke
//...
Vector3 velocity = direction * speed;
Ehhez hasonlóan egy sebességvektort fel is tudunk bontani irányvektorra és skalár értékre, a normalizálás és a hossz lekérdezés függvényekkel.
Vector3 velocity = new Vector3(1,2,3);
Vector3 direction = velocity.normalized; // Egység hosszú
float speed = velocity.magnitude;
A fentiek hasonlóan alkalmazhatók minden egyéb vektormennyiségre 3 és 2 dimenzióban egyaránt.
Vektormennyiség Irányvektor (egység hosszú) Vektor abszolút értéke (hossza)
Vegyük most át egyenként a fenti mennyiségeket és a hozzájuk kötődő fontosabb törvényeket!
- Egy objektum pozíciója egy helyvektor a 2D vagy 3D Descartes koordináta rendszerben.
- Egy objektum sebesség-vektora, megadja, hogy egységnyi idő alatt mennyivel módosul annak pozíciója.
- Newton I. törvénye szerint minden test megtartja álló helyzetét vagy egyenes vonalú egyenletes mozgását mindaddig, amig ebben valami külső hatás nem befolyásolja. Pl.: ütközés, erőtér.
- Egy objektum gyorsulás-vektora megadja, hogy egységnyi idő alatt mennyivel módosul annak sebesség-vektora.
- Egy objektum lendület-e megegyezik a sebességének és tömegének szorzatával.
- A Lendület fogalom azért fontos, mert egy zárt rendszerben mozgó objektumok összes lendülete állandó. Ezt nevezzük a lendületmegmaradás törvényének.
- Erőnek nevezzük azt a hatást, ami tömeggel rendelkező testet gyorsítani képes.
- Newton II. törvénye szerint a test gyorsulása egyenesen arányos az arra ható erővel, míg fordítottan arányos a tömegével. Tehát:
Forgómozgás
A következőkben egy testnek a saját tömegközéppontja körüli forgását tárgyaljuk.
A forgómozgás fizikájában sok minden megfeleltethető a lineáris (fent tárgyalt) mechanikával.
Például ahogy az első newton törvény szerint egy tárgy egy helyben áll vagy egyenletesen mozog, ha semmi hatás nem éri, úgy a test forgása is hasonlóan állandó valami külső behatás nélkül.
A forgómozgás kinematikájában a mennyiségek megfeleltethetők lineáris párjaikkal, ha kicseréljük a megtett utat az elfordulás-ra és ezután ebből származtatjuk le a többi mennyiséget.
Fizikai mennyiség | Angol név | Jelölés | SI mértékegység | Hasznos képlet |
Elfordulás | Rotation |
kis fi |
alt: fok | |
Szögsebesség | Angular
velocity |
kis omega |
(Egyenletes forgás) | |
Gyorsulás | Angular acceleration |
kis beta |
(Egyenletes változó forgás) |
Az elfordulásra SI-ben a radiánt használjuk. Ha egy kör sugarával megegyező hosszú fonalat a kör oldalára feszítünk, akkor a fonál pont 1 radián szöget fog lefedni. Mivel a kör átmérője és a kerülete közti arányszám a (Pi), ezért egy teljes környi elfordulás pontosan 2⋅ radiánnak felel meg.
Az elfordulás egy mértékegység nélküli mennyiségnek tekinthető és SI-ben egy egységnyi elfordulás pontosan egy radiánnyit jelent.
Felmerülhet a kérdés, hogy miért pont egy radián-t tekintjük az alap elfordulás egységnek.
Először is a radian egy természetes mérték, nincs szükség hozzá semmilyen megegyezésre. Vegyük például a hosszmértéket. Ebben az esetben a méter az alapegységünk. Hogy ez a méter miért pont olyan hosszú, mint amilyen, annak nem túl sok oka van, csak egy megegyezés kérdése. Más mértékegységrendszerek más alaphosszt használnak és használtak. Ezzel szemben a radián a puszta geometriából levezethető természetes mértéke a foknak.
Ez azt jelenti, hogy ha egy földön kívüli fejlett civilizációval kapcsolatba lépnénk, semmi okunk nem lenne feltételezni, hogy hosszmérésre a métert használnák. Az viszont lehetséges (vagy talán inkább valószínű) lenne, hogy fokmérésre ők is radiánt használnának.
Alternatíva lehet a radiánra a fok, amiből 360 ad ki, egy teljes kört. Ez valamivel intuitívabb mérték a legtöbbek számára és kényelmesebb gondolkodni benne, mindaddig, amíg nem végzünk bonyolultabb trigonometriai számításokat.
Azt talán könnyű megérteni, hogy a 360 miért nem olyan természetes fokmérték, mint a radián, de az kevésbé intuitív, hogy miért pont egy sugárnyi az alap elfordulásmértékünk és miért nem mondjuk egy teljes körbefordulás.
Ennek az az oka, hogy a matematika, amiben radiánt használunk, az szebb, egyszerűbb elegánsabb összefüggésekhez vezet, mint bármi más egyéb elfordulás mértékkel.
Például a szinusz függvény deriváltja a koszinusz függvény, és a koszinusz függvény deriváltja a szinusz függvény. Ezzel így nagyon kényelmes számolni, de csak akkor lesz igaz mindez, ha radiánt használunk.
A Unity és más egyéb matematikai könyvtárak is néhol a radiánt használják, máshol meg a fokot. Mindig figyeljünk rá, hogy mikor melyikkel kell számolnunk. Ezt mindig ellenőrizhetjük a dokumentációban.
Gyakran át szeretnénk térni egyik mértékből a másikba, ekkor ell kell végezni az átváltást:
Sem a Pi-t sem a fok és radián közti arányszámot nem kell fejből megjegyezni a programozáshoz. Ezek mind lekérdezhetők a Unity matematikai könyvtárából:
float rad, deg, pi;
//...
deg = rad * Mathf.Rad2Deg; // Átváltás radiánból fokba (180 / π)
rad = deg * Mathf.Deg2Rad; // Átváltás fokból radiánba (π / 180)
pi = Mathf.PI; // Pi lekérdezése
A 360-as szám a kör felbontására még az ősi Mezopotámiából származik. Már a legelső ismert civilizációban, a sumér matematikában a 6-os és a 10-es számrendszer egy fajta hibridét használták. Ezek szorzataként állt elő a 360-as szám (6*6*10). Ezt az ó-babyloniai asztronómiában találjuk meg először körülbelül 4000 éve. Ezt vették át az egyiptomiak is.
Habár a 360-as szám egy önkényes felosztása a körnek, (és nem olyan természetes, mint a radián,) mindez nem jelenti azt, hogy ne lenne egy nagyon okos ötlet. Nem véletlen, hogy ezt használjuk a mai napig is. Talán ez a mindennapi matematika egyik legősibb maradványa.
A szám a sokszoros oszthatósága miatt igazán hasznos. Ezt úgy is mondhatjuk, hogy a 360 egy erősen összetett szám. Ha felakarjuk osztani a kört egyenlően úgy, hogy a szeletek is egész számú fokot adjanak ki, akkor azt megtehetjük a következő osztók mindegyikével: 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 18, 20, 24, 30, 36, 40, 45, 60, 72, 90, 120, 180
A szám ezért sok ókori népnél különleges, misztikus szerepet kapott. Az egyiptomiakat például nagyon zavarta az, hogy az év nem épp 360 napos. Az ő naptárjuk pont 12 db 30 napos hónapot tartalmazott. Ez volt kiegészítve minden év végén pár hozzáadott nappal. Na de miért ez az idegesítő 5 (vagy 6) napos csúszás? Meg is volt az ősi egyiptomiak mítosza arra, hogy magyarázzák a pontatlanságot, ami szerint eredetileg valóban 360 napos volt egy év. Ezt toldotta meg Thot, az írás és tudományok istene még 5 nappal, amihez a szükséges fényt a Hold istenétől, Honszutól nyerte el egy szenet nevű társasjátékban, ami leginkább a mai Ki nevet a végén?-re hasonlít.
3 dimenzióban a forgómozgás esetén is beszélhetünk vektormennyiségekről, ha egy objektum térbeli elfordulását Euler koordinátákkal ábrázoljuk. Ekkor egy Vector3 tartalmazhat egy 3D elfordulást.
Egy objektum szögsebesség (angular velocity) vektora, megadja, hogy egységnyi idő alatt mennyivel módosul annak elfordulása (Euler koordinátája).
Ez minden testre állandó addig, amig valami külső hatás nem befolyásolja azt. Pl.: ütközés, erőtér. (Ez párhuzamba vonható Newton I. törvényével.)
Egy objektum szöggyorsulás (angular acceleration) vektora megadja, hogy egységnyi idő alatt mennyivel módosul annak szögsebesség-vektora.
Fizikai mennyiség | Angol név | Jelölés | SI mértékegység | Hasznos képlet |
Elfordulás | Rotation |
kis fi |
alt: fok | |
Szögsebesség | Angular
velocity |
kis omega |
(Egyenletes forgás) | |
Gyorsulás | Angular acceleration |
kis beta |
(Egyenletes változó forgás) |
A dinamika területén is párhuzam vonható a lineáris mechanikával, ha a tömeget a tehetetlenségi nyomatékkal, kapcsoljuk össze.
Lineáris fizikában a tömeg a mozgási tehetetlenség mértéke volt. Minél nagyobb egy tárgy tömege, annál nehezebb megmozgatni, vagy pontosabban annál több erő kell ahhoz, hogy egységnyi gyorsulást eredményezzünk rajta. Ugyanígy a tehetetlenségi nyomaték szintén a tehetetlenség mértéke, csak ezúttal a forgásra nézve. Aminek nagyobb a tehetetlenséginyomatéka, azon arányosan annyival több forgatónyomatékot kell kifejteni egységnyi szöggyorsulás eléréséhez.
Fizikai mennyiség | Angol név | Jelölés | SI mértékegység | Hasznos képlet | Lineáris megfelelő |
Tehetetlenségi nyomaték | Moment of inertia | Tömeg | |||
Perdület
Impulzusnyomaték | Angular momentum | Lendület | |||
Forgatónyomaték | Torque |
kis tau |
: erőkar | Erő |
A lendületmegmaradáshoz hasonlóan alapvető fizikai tétel a perdületmegmaradás is.
Eszerint minden zárt rendszerben az összes perdület (impulzusnyomaték) eredője állandó.
Lineáris fizika | Forgómozgás | ||
Út | Distance | Elfordulás | Rotation |
Tömeg | Mass | Tehetetlenségi nyomaték | Moment of inertia |
Sebesség | Speed | Szögsebesség | Angular velocity |
Gyorsulás | Acceleration | Szöggyorsulás | Angular acceleration |
Lendület | Momentum | Perdület (Impulzusnyomaték) | Angular momentum |
Erő | Force | Forgatónyomaték | Torque |