Útmutató a 2d vízfelszín modellezéséhez
Ebben a cikkben a dinamikus 2D vizet a legegyszerűbb fizikával hozhatjuk létre. Rendező sorokat, hálószemeket fogunk használni. triggerek és részecskék. A végeredményt hullámokkal és permetekkel lehet hozzáadni bármelyik játékához. Feladtam, amit kaptam a Unity-nál (Unity 3D), de a cikk alapelveit felhasználva bármelyik motoron ugyanezt teheted.
Kezdjük tehát
Létrehozunk egy felsõ víz áramkört a renderelõ vonalak és sok csomópont segítségével, hogy hullámnak tûnjön.
Helyeket, sebességeket és gyorsításokat kell tárolnunk minden egyes csomópontnál, ezért tömböket használunk:
A LineRendererrel vízünk határait hozzuk létre, de még mindig vízre van szükségünk. Ehhez hálószemeket használunk. Ezek tárolásához szükségünk lesz a GameObject tömbre is:
A víz felszínével is össze kell ütni az ütközéseket:
Most több konstans:
Itt a springconstant a hullámok "merevségi tényezője" (úgy fog mozogni, mint egy rugós inga); csillapítás - a vakolat együtthatója (különben a hullám, miután lengett, soha nem fog leállni); A terjedés a hullámterjedés sebességéért felelős együttható. Ezekkel az értékekkel játszhatsz, igyekszünk olyan tulajdonságokat elérni, amelyek leginkább hasonlítanak a valódi vízhez. A z-érték (a vízszint-koordinátát a Z-tengely mentén) megváltoztathatja, attól függően, hogy melyik kell közelebb az alkalmazás előtéréhez.
Ezután tárolnunk kell vízünk helyét:
... És a megjelenése:
Az az objektum, amelyben az összes adatot tárolják, olyan, mint egy menedzser, ez is vizet hoz létre. Hozzon létre egy funkciót ehhez - SpawnWater (). Ebben fogjuk átadni a víz bal szélének koordinátáit, a víztér szélességét, valamint felső és alsó határát:
Csomópontok létrehozása
Sorolja fel a szükséges csomópontok számát:
Az egységnyi szélességben öt csomót használunk, de ennek az értéknek a megváltoztatásával megkereshetjük a teljesítmény és a víz simaságának egyensúlyát.
Itt van az ideje beállítani a LineRenderert:
A fenti változók inicializálása után:
... És töltsd be őket valós értékekkel:
A kód ezen részének végén, amint látja, a LineRenderer minden egyes csomópontját a helyére helyezzük.
Hozz magaddal a vizet
Itt kezdődik a legérdekesebb. Most van egy határa víz, de nincs víz maga. Tehát most létrehozzuk a hálót:
Most több értéket kell átvinni a hálóba. Kezdethez - a szögek koordinátáit.
Az ábrán látható az első háló, amelyre szükségünk van. Általában ez fog kinézni:
Amint láthatja, a nulla cellában a bal felső pont tárolódik, az első - a bal felső, a második - a bal alsó és a harmadik - a jobb alsó sarokban. Most meg kell választanunk, hogy melyik textúrát szeretnénk használni a hálóhoz. Mindent meg akarunk használni, ezért csak írni kell:
A hálónak háromszögből kell állnia. Szerencsére minden négyszög két csoportra osztható.
Amint láthatjuk, az A háromszög csúcsokból áll. 1. 3. és B háromszög - 3. csúcspontból 2. 0. Ezeknek a hat számnak egy külön tömbre kell írni, ugyanabban a sorrendben:
Most az általunk létrehozott három tömböt át kell vinni a hálóba:
Most már vannak hálószemek, de nincsenek GameObjects-ek, hogy megjelenítsék őket. Javítsuk meg ezt:
Mindezek a hálószékek most a menedzser leszármazottai.
Állítsa össze az ütközésérzékelőket
Itt hozunk létre több BoxColliders, hozzárendelnek nekik neveket, és azokat a menedzser leszármazottai. Azt is hozzárendeljük nekik a pozíciókat - a csomópontok közepén, a méretük meghatározása és a vízdetektorhoz való hozzáadásukhoz.
Nos, a következő funkció frissíti csomópontjaink pozícióit:
Adj hozzá egy kis fizikát
A csomópontok gyorsulásának, sebességének és új pozícióinak megtalálása érdekében szükségünk van Hooke törvényére és Euler módjára.
Így Hooke törvénye szerint F = -k * x. ahol F az az erő, amellyel a rugó visszatér eredeti állapotához (ne felejtsük el, hogy hullámaink sok kis forrásból állnak); k - a merevség koefficiense (ne feledjük, megírtuk a konstansokban); x a kiterjesztés. E képlet szerint kiszámítjuk a csomópontok gyorsulását, a nyújtás értéke az aktuális vízpozíció és az alapszint közötti különbségként kerül kiszámításra. Amellett, hogy erőt adunk, a sebességet megszorozzuk a kioltási tényezővel - így a hullámok nem végtelenek.
Amint látja, Euler módszere nagyon egyszerű - csak addig adjuk hozzá a sebességet a csomópont pozíciójához, és növeljük a sebességet a sebességhez. Természetesen pontos számításoknál a Vergier integrálása megfelelőbb lenne. de a kioltás miatt ez aligha lehetséges. Emellett Euler módszerének nagysága egyszerűbb.
Adj hozzá egy kis hullámterjedést. Létre kell hoznunk két tömböt, amelyekben a szomszédos csomópontok magasságai közötti különbséget tároljuk a szétterjedési tényezővel megszorozva:
... És töltse meg őket, a sebesség és a magasság megváltoztatásával:
Ahogy észrevetted, 8 alkalommal hajtunk végre műveleteket. Ez a nagyobb simaság érdekében történik.
Ütközés hozzáadása
Most van víz, ami nemcsak megjeleníthető, hanem öntve is. Most szükségünk van arra, hogy felkavarjuk!
Ehhez hozza létre a Splash () metódust. amely ellenőrzi a vízre gyakorolt hatás helyét és sebességét:
Először is, ellenőrizzük az átvitt koordináták helyességét az iks-ban:
Most győződjön meg arról, hogy az abszolút koordinátát nem tárolja, hanem az első csomópont távolságát:
Most ki kell számolnunk, amelyen a csomónak fújnia kell:
Itt szó szerint a következőket tesszük:
- A koordinátát az első csomóponthoz viszonyítjuk - xpos.
- Az utolsó és az első csomópont közötti különbségre osztjuk.
- Tehát egy törtszámot kapunk, amely pontosan megmondja, hogy hol ütik el a csapást.
- Szorozzuk meg a számot a szögek számával és fordítsuk az egészre.
Most a talált csomópont sebességét az impulzussebességhez hasonlítjuk:
Különböző módon járhat el, például hozzáadhatja az ütközés sebességét a csomó aktuális sebességéhez vagy a lendület megőrzésének törvényei szerint járjon el.
Add hozzá a permetet:
Lehet, hogy meglepte, hogy kétszer beállítom a kezdő sebességet. Ennek oka a beépített részecske-rendszer. amely a kezdeti sebességet véletlenszerűen adja meg két állandósor között. Sajnálatos módon nincs külön hozzáférés a szkriptek segítségével, ezért így kell eljárnunk.
Ezután hozzáadtam egy sort, de kihagyhatod:
Spray nem lehet elpusztítani egy ütközés más tárgyak, ezért sem sorolják őket egy Z koordinátája a háttérben (I - 5), vagy hogy a részecskék mindig esik vissza a víz. Én választottam valami átlagot:
Úgy tűnik, mintha minden, igaz?
Az ütközések észlelése
Nem, nem így van! Az objektumok ütközését vízzel kell nyomon követni, különben hiába írták le. Ne feledje a WaterDetector osztályt. amit fent említettünk? Most foglalkozunk velük. Csak annyit kell tőlünk tőle:
Most csak a SpawnWater () kódot kell hívnod a kódodban, és élvezni kell a csodálatos hullámokat és fröccsenést!