Útmutató a 2d vízfelszín modellezéséhez

Ú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.

Útmutató a 2d vízfelszín modellezéséhez

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ó.

Útmutató a 2d vízfelszín modellezéséhez

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!

Útmutató a 2d vízfelszín modellezéséhez