Pretraživanje svijeta

U Box2D Engine-u postoje mehanizmi kojima možemo saznati koja tijela su u određenom dijelu svijeta. Ovo je često jako korisno i srećom Box2D to podržava. Jedna od tehnika se zove Ray casting. Ovo radi na naćin da Box2D povuće neku vrstu linije, i zatim računa koja tijela su presječena tom linijom. Metoda koja nam omogućuje testiranje da li je neko tijelo presječeno linijom je sljedeća:

bool b2Fixture::RayCast(b2RayCastOutput* output, const b2RayCastInput& input);

Na ovaj naćin trebamo iterirati kroz sva tijela u svijetu te za svako tijelo pozvati ovu metodu i vidjeti koji rezultat vraća (true / false). No Box2D nudi sofisticiraniji način da ovo napravimo i to putem automatiziranog Ray casting-a, te AABB testiranja. Kako bi implementirali ovu vrstu postavljanja upita služimo se sljedećom metodom.

void RayCast(b2RayCastCallback* callback, const b2Vec2& point1, const b2Vec2& point2);

Drugi i treći parametar označavaju početak i kraj linije koju želimo povući, dok je drugi parametar tipa b2RayCastCallback klase čiju ReportFixture metodu moramo implementirati, a ona izgleda ovako:

float32 ReportFixture(b2Fixture* fixture, const b2Vec2& point, const b2Vec2& normal, float32 fraction);

Svaki put kada je pronadjen neki Fixture ova metoda će biti pozvana.

Druga vrsta postavljanja upita nad tijelima je AABB. Ta funkcija izgleda ovako:

void QueryAABB(b2QueryCallback* callback, const b2AABB& aabb);

Slično kao i kod Ray castinga prvi parametar je klasa koju moramo implementirati, a ima sljedeću virtualnu metodu:

bool ReportFixture(b2Fixture* fixture);

Drugi parametar QueryAABB metode je početak i kraj kocke unutar koje će se tražiti tijela. To slikovito izgleda ovako:

Sile i impulsi

Kako bi micali tijela unutar Box2D svijeta trebamo djelovati na tijela silama i impulsima. Impulsi mijenjau brzinu tijela trenutno, dok sile mijenjaju brzinu tijela konstantno kroz vrijeme. Sljedeća metoda omogućava primjenu sile na neko tijelo

body->ApplyForce(b2Vec2(0,50), body->GetWorldCenter());

Zatim možemo primjeniti linearni impuls na tijelo metodom:

body->ApplyLinearImpulse(b2Vec2(0,50), body->GetWorldCenter());

Prvi parametar označava vektor smjera impulsa. Također možemo primjeniti i neke kutne impulse na tijela, npr:

body->ApplyAngularImpulse(0);

Eksplozije

Box2D putem već spomenutih mehanizama omogućava simuliranje eksplozija. Više informacija možete čuti o tome na sljedećem videu:

Fluidi

Box2D nam omogućava i simuliranje ponašanja fluida. Za više informacija pogledajte sljedeći video: