Ghid pentru modelarea suprafeței apei 2d

Ghid pentru modelarea suprafeței apei 2d

În acest articol vom lua în considerare crearea unei ape dinamice 2D cu cea mai simplă fizică. Vom folosi linii de render, ochiuri. declanșatoare și particule. Rezultatul final cu valuri și spray-uri puteți adăuga la oricare dintre jocurile dvs. Am postat ceea ce am primit la Unity (Unity 3D), dar folosind principiile din acest articol, puteți face același lucru pe orice motor.







Deci, să începem

Vom crea un circuit de apă superioară folosind liniile de randare și multe noduri pentru a face să pară valuri.

Va trebui să stocăm pozițiile, vitezele și accelerațiile pentru fiecare nod, astfel încât vom folosi matrice:

Cu LineRenderer vom crea o limită a apei noastre, dar mai avem nevoie de apă. Pentru aceasta vom folosi ochiuri. Pentru a le stoca, vom avea nevoie și de matricea GameObject:

De asemenea, va trebui să urmărim coliziuni cu suprafața apei:

Acum, mai multe constante:

Aici constă "factorul de rigiditate" al valurilor noastre (acestea se vor mișca ca un pendul de primăvară); amortizare - coeficient de golire (în caz contrar, valul, odată ce a început să se balanseze, nu se va opri niciodată); răspândirea este coeficientul responsabil pentru viteza de propagare a undelor. Puteți juca cu aceste valori, încercând să obțineți proprietăți care seamănă cel mai mult cu apa reală. Valoarea z (coordonatele apei de-a lungul axei Z) poate fi modificată în funcție de ceea ce ar trebui să fie mai aproape de prim-plan în aplicația dvs.

Apoi, trebuie să stocăm locația apei noastre:

... Și aspectul său:

Obiectul în care toate aceste date vor fi stocate este ceva de genul unui manager, acesta va crea și apă. Creați o funcție pentru aceasta - SpawnWater (). În ea vom transmite coordonatele marginii din stânga a apei, lățimea spațiului de apă, precum și limitele superioare și inferioare:

Creați noduri

Numără numărul de noduri de care avem nevoie:

Vom folosi cinci noduri pe unitate de lățime, dar puteți schimba această valoare în căutarea unui echilibru între performanță și netezirea apei.

Acum este momentul să configurați LineRenderer:

După inițializarea variabilelor create mai sus:

... și să le umpleți cu valori reale:

La sfarsitul acestei sectiuni de cod, dupa cum vedeti, punem fiecare nod din LineRenderer in locul lui.

Creați apa în sine

Aici începe cel mai interesant. Acum avem o limită de apă, dar nu există apă în sine. Deci, acum vom crea pentru ea mesh:

Acum trebuie să transferați mai multe valori în plasă. Pentru început - coordonatele unghiurilor sale.

Ghid pentru modelarea suprafeței apei 2d

Diagrama arată colțurile primei rețele de care avem nevoie. În general, acesta va arăta astfel:

După cum puteți vedea, în celula zero se păstrează punctul din stânga sus, în primul - în stânga sus, în cel de-al doilea - în cel din stânga jos și în al treilea - în cel din dreapta jos. Acum trebuie să alegem ce parte din textură vrem să folosim pentru această plasă. Vrem să folosim totul, așa că trebuie doar să scriem:







Rețelele trebuie să fie formate din triunghiuri. Din fericire, orice patrulater poate fi împărțit în două triunghiuri.

Ghid pentru modelarea suprafeței apei 2d

După cum puteți vedea, triunghiul A constă din nodurile 0. 1. 3. și triunghiul B - din nodurile 3. 2. 0. Aceste șase numere trebuie să scrie într-o matrice separată, în aceeași ordine:

Acum, cele trei matrice create de noi trebuie să fie transferate în plasă:

Acum avem mese, dar nu există GameObjects pentru a le face. Să rezolvăm acest lucru:

Toate aceste ochiuri sunt descendenții managerului.

Configurați detectoarele de coliziune

Aici creem mai mulți BoxColliders, le atribuim nume și le facem descendenții managerului. De asemenea le atribuim poziții - în mijlocul nodurilor, determinăm dimensiunea lor și le adăugăm la WaterDetector.

Funcția următoare va actualiza pozițiile nodurilor noastre:

Adăugați niște fizici

Pentru a găsi accelerații, viteze și noi poziții ale nodurilor, avem nevoie de legea lui Hooke și de metoda lui Euler.

Astfel, legea lui Hooke spune că F = -k * x. unde F este forța cu care arcul tinde să se întoarcă la starea inițială (nu uitați că valurile noastre vor consta din multe izvoare mici); k - coeficientul de rigiditate (amintiți-vă, am scris-o în constante?); x este extensia. Conform acestei formule vom calcula accelerația pentru noduri, valoarea întinderii va fi calculată ca diferența dintre poziția curentă a apei și nivelul de bază. În plus față de forță, vom adăuga viteza înmulțită cu factorul de stingere - astfel încât valurile să nu fie infinite.

După cum puteți vedea, metoda lui Euler este foarte simplă - pur și simplu adăugăm viteza la poziția nodului de fiecare dată și adăugăm accelerația la viteză. Desigur, pentru calcule precise, integrarea lui Vergier ar fi mai potrivită. dar din cauza utilizării de răcire, acest lucru este cu greu posibil. În plus, metoda lui Euler este un ordin de mărime mai simplă.

Acum adăugați o propagare mică a undelor. Să creăm două matrice în care vom stoca diferența dintre înălțimile nodurilor vecine înmulțite cu factorul de împrăștiere:

... Și umple-le, de-a lungul drumului schimbarea viteze și înălțimi:

După cum ați observat, efectuăm acțiuni de 8 ori. Acest lucru este făcut pentru o mai bună netezime.

Adăugați coliziuni

Acum avem apă, care nu poate fi doar afișată, ci și turnată. Acum avem nevoie de ocazia de a ne amesteca!

Pentru aceasta, creați metoda Splash (). care va verifica localizarea și viteza de impact asupra apei:

În primul rând, verificăm corectitudinea coordonatelor transmise în iks:

Acum, asigurați-vă că coordonatele absolute nu sunt stocate, ci distanța de la primul nod:

Acum trebuie să calculăm, pe care nodul trebuie să sufle:

Aici facem literalmente următoarele:

  • Luăm coordonatele relative la primul nod - xpos.
  • Îi împărțim în diferența dintre poziția ultimului și a primului nod.
  • Deci avem un număr redus care ne spune exact unde a lovit lovitura.
  • Multiplicați numărul în funcție de numărul de unghiuri și rotunjiți-l în întregime.

Acum echivalăm viteza nodului găsit la viteza de impact:

Puteți acționa diferit, de exemplu, adăugați viteza de impact la viteza actuală a nodului sau acționați în conformitate cu legea conservării impulsului.

Acum adăugați spray-ul:

S-ar putea să fiți surprins că am setat viteza de pornire de două ori. Motivul este în sistemul de particule încorporat. care atribuie viteza inițială ca număr aleator între două constante. Din păcate, nu avem acces special la ea prin scripturi, așa că trebuie să ne comportăm așa.

Apoi, am adăugat o singură linie, dar o puteți sări:

Stropirile nu vor fi distruse atunci când se colizează cu alte obiecte, așa că trebuie să le atribuiți o coordonată Z a fundalului (am 5) sau să vă asigurați că particulele intră mereu pe apă. Am ales ceva mediu:

Se pare ca totul, nu?

Detectarea coliziunilor

Nu, nu! Trebuie să urmărim coliziunea obiectelor cu apă, altfel toate acestea au fost scrise în zadar. Amintiți-vă clasa WaterDetector. care am menționat mai sus? Acum ne vom ocupa de ele. Tot ce avem nevoie de el este doar o singură metodă:

Acum, trebuie doar să numiți SpawnWater () oriunde în codul dvs. și să vă bucurați de splendide valuri și stropi!

Ghid pentru modelarea suprafeței apei 2d







Trimiteți-le prietenilor: