Cum simulare fizica in jocuri de pe exemplul fizicii bullet

Multe jocuri moderne folosesc de simulare fizică. Prima cunoștință cu motorul de fizica este, în general promițătoare. Mingea sare de pe cub și role la partea de jos a unui înclinat, dar în acest proces, în cazul în care proiectul este aproape gata, se pare ceva nu funcționează cum ar trebui. Aici puteți ruina o mulțime de timp.

Și dacă Nvidia Physix (Unity3D hi), nimic nu te poate face, cu excepția unei perechi de parametri, Bullet Box2D fizica și este disponibil în codul sursă, și prin bezishodnosti încep să se confrunte cu faptul că ambele funcționează pe plan intern.

Pentru a face cu modul în care lucrurile munca este foarte mare ajutor. Toate motor de fizica joc sunt foarte similare. Toți au bază de impulsuri, ceea ce înseamnă că în fiecare cadru de simulare toate (putere) se transformă în impulsuri, sunt adăugate impulsuri, împărțită la masa și se adaugă la viteza (liniară și vraschatelnoy) a obiectului, viteza, de asemenea, determină modul în care obiectul se va deplasa în cadrul curent al simulării.

Și atunci se pune întrebarea, dacă totul este atât de simplu, cum este că puteți pune în blocurile de coloane și ei sunt în pace, și nu risipi?

Voi arăta că pentru toată această magie întâlnește o mică bucată de cod!

Presupun că cititorul știe deja că motorul de fizica, există două tipuri principale de tel simulate: corp rigid (corp elastic, se mișcă și are Masa) și corp static (nemișcat corpul fix și greutatea nu are). Cinematică și corpul moale, nu merită atenție.

detectarea coliziunilor

Magia începe atunci când două corpuri atinge reciproc. În Bullet este utilizat coliziune termen fizica.

Sistemul trebuie să identifice toate organismele care se ocupă unul cu celălalt în cadrul simulării. Fiecare atingere (conflict) pot participa și mai multe 2 organisme. Căutarea este posibil touch pot fi foarte intensive în resurse.

Broadphase Coliziune de detectare

Prima fază - este de a găsi intersecția dintre casetele AABB. AABB - acestea sunt două puncte care descriu o cutie în interiorul căreia este un obiect. Ideea este că, dacă două obiecte se intersectează, și cutiile lor AABB se intersectează.

Această problemă este BulletPhysics rezolvă una dintre cele trei algoritmi. Acestea sunt puse în aplicare ca clase care implementează btBroadphaseInterface.

1. Cel mai evident și ineficient l btSimpleBroadphase, o simplă căutare toate perechile de O (n ^ 2).

2. btAxisSweep3 care lucrează în spații închise. Ai cere caseta AABB, din care în interior va fi asumat pentru toate obiectele. Acest lucru poate parea incomod, dar datorită faptului că numărul de valori în virgulă mobilă cu creșterea acurateții pierd, tot nu se poate simula nimic pe distanta de un milion de unități în așa fel ca și cum ai făcut-o la o distanță de 10 unități de origine (o unitate este de obicei considerat un metru).

3. btDbvtBroadphase organizează obiecte în două structuri de arbori, unul pentru obiecte statice, cealaltă pentru dinamică (cinematică rigidă) tel.

Narrowphase Coliziune de detectare

După ce am găsit un grup de obiecte, a cărui cutie de AABB încrucișate, se verifică dacă există intersecția în realitate.

Aici ar trebui să ne amintim că toate obiectele date de forma (forma), poate fi o sferă, cilindru, cutie, poliedru convexe pentru corp rigid sau un poliedru pentru corp static. Există, de asemenea, o formă compusă din formele enumerate fraza anterioară.

Pentru fiecare pereche definit algoritm și găsirea unor puncte de intersecție a perpendicularele.

Cum simulare fizica in jocuri de pe exemplul fizicii bullet

Excelent, toate intersecțiile sunt găsite, ce să faci în continuare? Fiecare motor în impulsul nostru bazat, este necesar să se calculeze un impuls care împinge două atingând un subiect, pentru a face să arate realist.

Apoi am promis că va exista o mică bucată de cod. Cred că acum doi ani a fost toate cele trei rânduri, dar acum se pare ca acest lucru.

La intrare avem două corpuri au fost atinse, punctul de contact cu atingere normală și ca rezultat avem două impulsuri, care ar trebui să rezolve conflictul, forța caseta în liniște și nemișcat se află unul la altul, iar cilindrul și mingea fără probleme și în mod realist rostogolească la vale.

Indiciu util în loc de rămas bun

Atingeți acest cod nu este necesar. De exemplu, dacă dezvolta un joc cu o masina de curse, iar masina va merge pe o bordură sau un perete, și se va comporta imprevizibil si nu pot fi redate, ar trebui să acorde o atenție la perpendiculara la punctul de tangenta. Că efemeritatea și predictibilitatea perpendiculara în punctul de contact este adesea determinată nu de predictibilitatea simulare.

Te-ai uitat în sufletul motorului fizicii moderne și este acum obligat să se căsătorească cu el.