Koncepti
shape - 2D geometrijski objekt, npr. krug, poligon.(rigid) body - Neka stvar koja je toliko čvrsta da je udaljenost između bilo koje dvije točke tijela konstantna.
fixture - Povezuje oblik sa tijelom, i daje mu određena svojstva, npr. gustoća, trenje.
constraint - Fizička poveznica koja uklanja neki stupanj slobode kretanja tijela. 2D tijela imaju 3 stupnja slobode. To su 2 smjera translacija i rotacija.
contact constraint - Specijalno ograničenje (eng. constraint) koje onemogućava prodor jednog tijela u drugo, a također simulira i neka svojstva tijela, npr. trenje.
joint - Ograničenje koje ima svrhu da drži dva ili više tijela zajedno. Podržano je više tipova ove vrste ograničenja, a detaljno su opisani u sekciji Joint.
joint limit - Ograničava stupanj pokreta određenih tijela. Primjer toga je ljudski lakat, jer se može micati samo do određenog stupnja.
joint motor> - Pokreće tijela u odnosu na definiran stupanj slobode kojeg imaju tijela.
world - Fizički svijet je kolekcija navedenih koncepata, odnosno bodies, fixtures i constraint koji su u međusobnoj interakciji.
solver - Razrješava definirana ograničenja definirana u svijetu.
continuous collision - Provjera kolozije i spriječavanje tunelinga.
Moduli
Box2D se sastoji od tri modula. To su Common, Collision i Dynamics.Common modul ima odgovornost nad alokaciji, matematici i postavkama. Collision modul definira oblike i kolizijske funkcije i upite. Dynamics modul omogućuje simulaciju svijeta, tijela i ostalih nabrojanih koncepata.
Mjerne jedinice
Box2D radi sa float brojevima. Box2D je napravljen da radi dobro kada miče oblike veličine od 0.1 do 10 metara. Statična tijela mogu biti i 50 metara bez ikakvih posljedica. Kada radimo sa Box2D-om moramo imati na umu da nije dobro raditi sa pikselima, jer 200 piksela u Box2D-u je zapravo 200 metara, i zbog toga može dovesti do usporavanja simulacije i artefakata. Kako bi izbjegli ovakve situacije u programima koji koriste Box2D se definiraju konstante koje označavaju stupanj skaliranja piksela, odnosno koliko piksela na ekranu predstavlja 1 metar u Box2D svijetu.Box2D koristi radijane kada radi sa kutevima.
Kreiranje osnovnih objekata
Sada kada smo se upoznali sa osnovnim konceptima i načinu na koji radi Box2D u teoriji, pogledajmo sada API koji nudi Box2D Engine.Svaki Box2D program kreće sa kreiranjem svijeta. Na njega možemo gledati kao jedan kontenjer koji sadržava različite tipove objekata, i brine se o njihovom pravilnom kreiranju, brisanju i ažuriranju.
Prvo moramo definirati gravitaciju koju će imati naš svijet.
b2Vec2 gravity(0.0f, -10.0f);
Nakon toga kreiramo svijet sa definiranom gravitacijom.
b2World world(gravity);
Kada smo definirali svijet, trebamo definirati tijela koja će sadržavati. Box2D ima par koraka pri definiranju tijela.
- Definiranje tijela sa pozicijom i ostalim svojstvima
b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
bodyDef.position.Set(0.0f, 4.0f);
Ovdje vidimo da smo ovo tijelo definirali kao dinamičko. Box2D posjeduje tri vrste tijela, a to su dinamička, statička i kinetička.
- Korištenje world objekta za kreiranje tijela
b2Body* body = world.CreateBody(&bodyDef);
- Definiranje fixture objekata sa prikladnim svojstvima, te definiraj oblik i dodaj ga u fixture.
b2PolygonShape dynamicBox;Vidimo da smo definirali svojstva density odnosno gustoća u kilogramima po kvadratnom metru, friction, odnosno trenje, te još imamo mogućnost da definiramo i restitution, odnosno da kažemo koliko će nam tijelo biti skakutavo.
dynamicBox.SetAsBox(1.0f, 1.0f);
b2FixtureDef fixtureDef;
fixtureDef.shape = &dynamicBox;
fixtureDef.density = 1.0f;
fixtureDef.friction = 0.3f;
- Kreiranje fixture objekata prema pretodnoj definiciji na tijelu, odnosno povezivanje prethodno definitanog tijela sa fixture objektom.
body->CreateFixture(&fixtureDef);
Prethodna metoda vraća fixture, no mi ga u ovom slučaju nismo nigdje spremali. Također je važno napomenuti da jedno dijelo može imati više takvih objekata, i svaki sudjeluje u ukupnoj kalkulaciji, npr. težine tijela.
Simulacija
Box2D koristi integrator algoritam za simuliranje fizike. Algoritam djeluje u pojedinim diskretnim vremenskim trenucima.Obično Engine-i za fiziku imaju vremenski korak 60Hz, odnosno 1/60 sekundi.
float32 timeStep = 1.0f / 60.0f;
Box2D koristi veći komad koda koji se zove Constraint solver. On razrješava sva ograničenja u simulaciji jedan put. Jedno ograničenje u simulaciji može biti razrješeno bez problema. No problem dolazi kada promjena jednog ograničenja djeluje na druga, a druga opet na ostala i tako u krug. Kako bi dobili dobre rezultate moramo iterirati ograničenjima određen broj puta.
Postoje dvije faze u rješavaju ovog problema. To su Velocity phase i Position phase. Svaka faza ima definiran broj iteracija.
Preporučen broj Velocity iteracija je 8 a Position iteracija 3.
Kada smo odabrali vrijednosti prethodno spomenutih parametara trebamo u metodi koja nam se konstantno poziva u igri pozvati sljedeću metodu kako bi simulaicje fizike radila.
world.Step(timeStep, velocityIterations, positionIterations);