Box2D: Un motore fisico  opensource multipiattaforma
Maurizio Moriconi <ul><li>CTO presso Mobilesoft </li></ul><ul><li>Mobile Developer  </li></ul><ul><li>Co-founder Pixmapbro...
Box2D <ul><li>Motore fisico 2d </li></ul><ul><li>Opensource (licenza zlib) </li></ul><ul><li>Creato da Erin Catto  (Blizza...
Alcune risorse <ul><li>Sito ufficiale:  http://www.box2d.org/ </li></ul><ul><li>Codice sorgente:  http://code.google.com/p...
LIVE: Installazione su iOS
Motore Fisico <ul><li>Può essere visto come un sistema di animazione (videogiochi) </li></ul><ul><li>Permette il mapping t...
Motore Fisico in Box2D <ul><li>World </li></ul><ul><ul><li>Definisce la gravità (gravity) </li></ul></ul><ul><ul><li>Muove...
Motore Fisico in Box2D <ul><li>Body </li></ul><ul><ul><li>Position / Rotation </li></ul></ul><ul><ul><li>Density / Mass (D...
Motore  Fisico in Box2D <ul><li>Shape </li></ul><ul><ul><li>Area di un body </li></ul></ul><ul><ul><li>Può essere un cerch...
Motore Fisico in Box2D <ul><li>Joint </li></ul><ul><ul><li>Connettono più corpi </li></ul></ul><ul><ul><li>Limitano il lor...
Motore Fisico in Box2D <ul><li>Le animazioni dei corpi  dinamici  avvengono tramite: </li></ul><ul><ul><li>Force (Forze) <...
Unità di misura <ul><li>MKS (meters-kilogram-second)  </li></ul><ul><li>Box2D lavora con i numeri in virgola mobile!!! </l...
Per iniziare, Conquest the World! <ul><li>b2Vec2 gravity(0.0f, -10.0f); </li></ul><ul><li>bool doSleep = true; </li></ul><...
Creazione di un body <ul><li>1. Definire un body con una posizione </li></ul><ul><li>2. Usare l'oggetto world per creare u...
 
Body statici: Ground Box <ul><li>1. Definire un body con una posizione </li></ul><ul><li>b2BodyDef groundBodyDef; </li></u...
Body statici: Ground Box <ul><li>3. Definire uno shape </li></ul><ul><li>b2PolygonShape groundBox; </li></ul><ul><li>groun...
Body Dinamici <ul><li>1. Definire un body </li></ul><ul><li>b2BodyDef bodyDef; </li></ul><ul><li>bodyDef.type = b2_dynamic...
Body Dinamici <ul><li>3. Definire uno shape </li></ul><ul><li>b2PolygonShape dynamicBox; </li></ul><ul><li>dynamicBox.SetA...
Simulating the World! <ul><li>float32 timeStep = 1.0f / 60.0f; </li></ul><ul><li>int32 velocityIterations = 6; </li></ul><...
LIVE: Hello Box2D
Rendering <ul><li>Il motore fisico da solo non basta... </li></ul><ul><li>Mappare oggetti fisici ad oggetti “reali” </li><...
Rendering con UIKit <ul><li>Physics 101 – UIKit app with Box2D for Gravity </li></ul><ul><li>http://www.cocoanetics.com/20...
Rendering con UIKit <ul><li>1) Gestione di un sistema di coordinate Box2d -> UIKit e viceversa </li></ul><ul><li>2) Creare...
Sistema di coordinate <ul><li>Posizione di partenza (0,0) </li></ul><ul><ul><li>UiKit in alto a sinistra </li></ul></ul><u...
Rappresentazione fisica <ul><li>Dimensioni </li></ul><ul><li>CGPoint boxDimensions = CGPointMake( physicalView.bounds.size...
Timer e Step <ul><li>tickTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/60.0 target:self  selector:@selector(tick:)  ...
<ul><li>world->Step(1.0f/60.0f, velocityIterations, positionIterations); </li></ul><ul><li>for(b2Body* b=world->GetBodyLis...
LIVE: Rendering con UIKit
Debug Draw <ul><li>Classe da utilizzare per debug </li></ul><ul><li>Creare una classe che estende b2DebugDraw: </li></ul><...
Debug Draw <ul><li>Attivare i flags: </li></ul><ul><li>m_world -> SetDebugDraw (& m_debugDraw ); </li></ul><ul><li>int32  ...
 
LIVE: Esempi vari
Altre caratteristiche <ul><li>Gestione dei contatti (Contact Listener) </li></ul><ul><li>Applicazione di forze, impulsi </...
Cocos 2D <ul><li>Progetto opensource </li></ul><ul><li>Scritto in Objective-C </li></ul><ul><li>Integra i motori fisici Bo...
Altre piattaforme??? <ul><li>- C# : Box2DX, Box2D.XNA,  </li></ul><ul><li>- JAVA : Jbox2D </li></ul><ul><li>- Delphi: Box2...
The End
Upcoming SlideShare
Loading in …5
×

Box2D: Un motore fisico opensource multipiattaforma

2,316 views
2,239 views

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,316
On SlideShare
0
From Embeds
0
Number of Embeds
212
Actions
Shares
0
Downloads
32
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Box2D: Un motore fisico opensource multipiattaforma

  1. 1. Box2D: Un motore fisico opensource multipiattaforma
  2. 2. Maurizio Moriconi <ul><li>CTO presso Mobilesoft </li></ul><ul><li>Mobile Developer </li></ul><ul><li>Co-founder Pixmapbrothers </li></ul><ul><li>Ubuntu member </li></ul><ul><li>bugman79 on Twitter </li></ul>
  3. 3. Box2D <ul><li>Motore fisico 2d </li></ul><ul><li>Opensource (licenza zlib) </li></ul><ul><li>Creato da Erin Catto (Blizzard Entertainment) </li></ul><ul><li>Scritto in C++ </li></ul><ul><li>Multi piattaforma </li></ul><ul><li>Usato da molti giochi tra cui: </li></ul><ul><ul><li>Angry Birds </li></ul></ul><ul><ul><li>Rolando </li></ul></ul><ul><ul><li>Crayon Physics Deluxe </li></ul></ul>
  4. 4. Alcune risorse <ul><li>Sito ufficiale: http://www.box2d.org/ </li></ul><ul><li>Codice sorgente: http://code.google.com/p/box2d/ </li></ul><ul><li>Documentazione online: </li></ul><ul><ul><li>http://www.box2d.org/manual.html </li></ul></ul><ul><li>Forum ufficiale: </li></ul><ul><ul><li>http://box2d.org/forum/ </li></ul></ul>
  5. 5. LIVE: Installazione su iOS
  6. 6. Motore Fisico <ul><li>Può essere visto come un sistema di animazione (videogiochi) </li></ul><ul><li>Permette il mapping tra “sprite” ed oggetti fisici </li></ul><ul><li>Oggetto fisico: rigid bodies ( corpi rigidi) </li></ul><ul><li>- Dynamic ( Dinamici) </li></ul><ul><ul><li>- Static (Statici) </li></ul></ul>
  7. 7. Motore Fisico in Box2D <ul><li>World </li></ul><ul><ul><li>Definisce la gravità (gravity) </li></ul></ul><ul><ul><li>Muove i corpi (s tep) </li></ul></ul><ul><ul><li>Intercetta le collisioni (contact listener) </li></ul></ul><ul><ul><li>Contiene i vari bodies (corpi fisici) </li></ul></ul>
  8. 8. Motore Fisico in Box2D <ul><li>Body </li></ul><ul><ul><li>Position / Rotation </li></ul></ul><ul><ul><li>Density / Mass (Densità / Massa) </li></ul></ul><ul><ul><li>Friction (Attrito nel contatto) </li></ul></ul><ul><ul><li>Restitution (Fattore di rimbalzo) </li></ul></ul><ul><ul><li>Contengono un puntatore void per dati aggiuntivi (User Data) </li></ul></ul><ul><ul><li>Possono avere uno o più Fixture </li></ul></ul>
  9. 9. Motore Fisico in Box2D <ul><li>Shape </li></ul><ul><ul><li>Area di un body </li></ul></ul><ul><ul><li>Può essere un cerchio, un rettangolo o un poligono </li></ul></ul><ul><ul><li>Sono usati per gestire le collisioni tra corpi </li></ul></ul><ul><li>Fixture </li></ul><ul><ul><li>Collega una Shape con un Body </li></ul></ul><ul><ul><li>Collision Filtering (permette di decidere se uno shape deve collidere o meno) </li></ul></ul><ul><ul><li>Aggiunge al body le proprietà fisiche: </li></ul></ul><ul><ul><ul><li>Density </li></ul></ul></ul><ul><ul><ul><li>Friction </li></ul></ul></ul><ul><ul><ul><li>Restitution </li></ul></ul></ul>
  10. 10. Motore Fisico in Box2D <ul><li>Joint </li></ul><ul><ul><li>Connettono più corpi </li></ul></ul><ul><ul><li>Limitano il loro movimento in vari modi: </li></ul></ul>
  11. 11. Motore Fisico in Box2D <ul><li>Le animazioni dei corpi dinamici avvengono tramite: </li></ul><ul><ul><li>Force (Forze) </li></ul></ul><ul><ul><li>Impulse (Impulsi) </li></ul></ul><ul><ul><li>Torque (Momento di torsione) </li></ul></ul>
  12. 12. Unità di misura <ul><li>MKS (meters-kilogram-second) </li></ul><ul><li>Box2D lavora con i numeri in virgola mobile!!! </li></ul><ul><li>Ottimizzato per lavorare bene con oggetti che si muovono tra 0.1 e 10 metri </li></ul><ul><li>Gli oggetti statici possono essere grandi sopra i 50 metri senza problemi. </li></ul><ul><li>Box2D usa i radianti per gli angoli. </li></ul>
  13. 13. Per iniziare, Conquest the World! <ul><li>b2Vec2 gravity(0.0f, -10.0f); </li></ul><ul><li>bool doSleep = true; </li></ul><ul><li>b2World world(gravity, doSleep); </li></ul><ul><li>b2Vec2 : vettore a 2 dimensioni (in questo caso la gravità) </li></ul><ul><li>doSleep: </li></ul><ul><ul><li>un body fermo può passare allo stato sleep </li></ul></ul><ul><ul><li>un body in sleep non richiede alcun calcolo nella simulazione fisica </li></ul></ul><ul><ul><li>un body torna attivo appena “toccato” o su richiesta (awake) </li></ul></ul>
  14. 14. Creazione di un body <ul><li>1. Definire un body con una posizione </li></ul><ul><li>2. Usare l'oggetto world per creare un body </li></ul><ul><li>3. Definire uno shape </li></ul><ul><li>4. Definire la fixture con lo shape aggiungendo friction, density... </li></ul><ul><li>5. Creare la fixture sul body </li></ul>
  15. 16. Body statici: Ground Box <ul><li>1. Definire un body con una posizione </li></ul><ul><li>b2BodyDef groundBodyDef; </li></ul><ul><li>groundBodyDef.position.Set(0.0f, -10.0f); </li></ul><ul><li>2. Usare l'oggetto world per creare un body </li></ul><ul><li>b2Body* groundBody = world.CreateBody(&groundBodyDef); </li></ul><ul><li>Di base un body è creato come statico: </li></ul><ul><ul><li>Non fa collisione con altri body statici </li></ul></ul><ul><ul><li>È inamovibile </li></ul></ul><ul><ul><li>statico per Box2D -> Massa = 0 </li></ul></ul>
  16. 17. Body statici: Ground Box <ul><li>3. Definire uno shape </li></ul><ul><li>b2PolygonShape groundBox; </li></ul><ul><li>groundBox.SetAsBox(50.0f, 10.0f); </li></ul><ul><li>In questo caso un PolygonShape </li></ul><ul><li>SetAsBox prende come parametri le grandezze / 2 </li></ul><ul><li>Quindi nell'esempio il box è 100x20 (metri si suppone) </li></ul><ul><li>5. Creare la fixture sul body </li></ul><ul><li>groundBody->CreateFixture(&groundBox,0); </li></ul><ul><li>L'oggetto b2Shape “è dentro” la fixture!!! </li></ul>
  17. 18. Body Dinamici <ul><li>1. Definire un body </li></ul><ul><li>b2BodyDef bodyDef; </li></ul><ul><li>bodyDef.type = b2_dynamicBody; </li></ul><ul><li>bodyDef.position.Set(0.0f, 4.0f); </li></ul><ul><li>In questo caso si specifica che è Dinamico! </li></ul><ul><li>2. Usare l'oggetto world per creare un body </li></ul><ul><li>b2Body* body = world.CreateBody(&bodyDef); </li></ul>
  18. 19. Body Dinamici <ul><li>3. Definire uno shape </li></ul><ul><li>b2PolygonShape dynamicBox; </li></ul><ul><li>dynamicBox.SetAsBox(1.0f, 1.0f); </li></ul><ul><li>4. Definire la fixture con lo shape aggiungendo friction, density... </li></ul><ul><li>b2FixtureDef fixtureDef; </li></ul><ul><li>fixtureDef.shape = &dynamicBox; </li></ul><ul><li>fixtureDef.density = 1.0f; </li></ul><ul><li>fixtureDef.friction = 0.3f; </li></ul><ul><li>Definiamo la fixture con densità pari a 1 e attrito pari a 0.3 </li></ul><ul><li>5. Creare la fixture sul body </li></ul><ul><li>body->CreateFixture(&fixtureDef); </li></ul>
  19. 20. Simulating the World! <ul><li>float32 timeStep = 1.0f / 60.0f; </li></ul><ul><li>int32 velocityIterations = 6; </li></ul><ul><li>int32 positionIterations = 2; </li></ul><ul><li>world.Step(timeStep, velocityIterations, positionIterations); </li></ul><ul><li>Time Step 60Hz (1/60 di secondo) </li></ul><ul><li>Iterator </li></ul><ul><ul><li>Sono i cicli in cui Box2d itera per calcolare posizione e velocità </li></ul></ul><ul><ul><li>Un valore di 10 è suggerito </li></ul></ul><ul><ul><li>Da decidere come compromesso tra velocità e precisione </li></ul></ul>
  20. 21. LIVE: Hello Box2D
  21. 22. Rendering <ul><li>Il motore fisico da solo non basta... </li></ul><ul><li>Mappare oggetti fisici ad oggetti “reali” </li></ul><ul><li>1) UIKit </li></ul><ul><li>2) OpenGL ES </li></ul><ul><li>3) Altro... </li></ul>
  22. 23. Rendering con UIKit <ul><li>Physics 101 – UIKit app with Box2D for Gravity </li></ul><ul><li>http://www.cocoanetics.com/2010/05/physics-101-uikit- app-with-box2d-for-gravity/ </li></ul>
  23. 24. Rendering con UIKit <ul><li>1) Gestione di un sistema di coordinate Box2d -> UIKit e viceversa </li></ul><ul><li>2) Creare rappresentazione fisica per ogni view </li></ul><ul><li>3) Impostare un timer per : </li></ul><ul><ul><li>Muovere il motore fisico </li></ul></ul><ul><ul><li>Aggiornare posizione ed angolo delle nostre view </li></ul></ul>
  24. 25. Sistema di coordinate <ul><li>Posizione di partenza (0,0) </li></ul><ul><ul><li>UiKit in alto a sinistra </li></ul></ul><ul><ul><li>Box2d in basso a sinistra </li></ul></ul><ul><li>Unità di misura: Pixel vs Metri!! </li></ul><ul><li>#define PTM_RATIO 16 </li></ul><ul><li>16 pixel equivalgono ad 1 metro </li></ul>
  25. 26. Rappresentazione fisica <ul><li>Dimensioni </li></ul><ul><li>CGPoint boxDimensions = CGPointMake( physicalView.bounds.size.width/PTM_RATIO/2.0, physicalView.bounds.size.height/PTM_RATIO/2.0 ); </li></ul><ul><li>Posizione </li></ul><ul><li>CGPoint p = physicalView.center; </li></ul><ul><li>bodyDef.position.Set ( </li></ul><ul><li>p.x / PTM_RATIO, </li></ul><ul><li>( 480.0 – p.y )/ PTM_RATIO ) ; </li></ul><ul><li>UserData </li></ul><ul><li>bodyDef.userData = physicalView; </li></ul>
  26. 27. Timer e Step <ul><li>tickTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/60.0 target:self selector:@selector(tick:) userInfo:nil repeats:YES]; </li></ul><ul><li>Quindi un timer che chiama la funzione tick all'infinito. </li></ul><ul><li>Mentre i parametri per l'iterator sono: </li></ul><ul><li>int32 velocityIterations = 8; </li></ul><ul><li>int32 positionIterations = 1; </li></ul>
  27. 28. <ul><li>world->Step(1.0f/60.0f, velocityIterations, positionIterations); </li></ul><ul><li>for(b2Body* b=world->GetBodyList(); b; b=b->GetNext()) </li></ul><ul><li>{ </li></ul><ul><ul><li>if (b->GetUserData() != NULL) </li></ul></ul><ul><ul><li>{ </li></ul></ul><ul><ul><li>UIView *oneView = (UIView *)b->GetUserData(); </li></ul></ul><ul><ul><li>CGPoint newCenter = CGPointMake( </li></ul></ul><ul><ul><li>b->GetPosition().x * PTM_RATIO, </li></ul></ul><ul><ul><li>self.view.bounds.size.height - b->GetPosition().y * PTM_RATIO); </li></ul></ul><ul><ul><li>oneView.center = newCenter; </li></ul></ul><ul><ul><li>CGAffineTransform transform = CGAffineTransformMakeRotation(- b->GetAngle()); </li></ul></ul><ul><li>oneView.transform = transform; </li></ul><ul><ul><li>} </li></ul></ul><ul><li>} </li></ul>
  28. 29. LIVE: Rendering con UIKit
  29. 30. Debug Draw <ul><li>Classe da utilizzare per debug </li></ul><ul><li>Creare una classe che estende b2DebugDraw: </li></ul><ul><li>class DebugDraw : public b2DebugDraw </li></ul><ul><li>{ </li></ul><ul><li>public : </li></ul><ul><li>void DrawPolygon( const b2Vec2 * vertices , int32 vertexCount, const b2Color& color); </li></ul><ul><li>void DrawSolidPolygon( const b2Vec2 * vertices , int32 vertexCount, const b2Color& color); </li></ul><ul><li>void DrawCircle( const b2Vec2 & center, float32 radius, const b2Color& color); </li></ul><ul><li>void DrawSolidCircle( const b2Vec2 & center, float32 radius, const b2Vec2 & axis, const b2Color& color); </li></ul><ul><li>… . </li></ul><ul><li>}; </li></ul>
  30. 31. Debug Draw <ul><li>Attivare i flags: </li></ul><ul><li>m_world -> SetDebugDraw (& m_debugDraw ); </li></ul><ul><li>int32 flags = 0 ; </li></ul><ul><li>flags += 1 * b2DebugDraw :: e_shapeBit ; </li></ul><ul><li>flags += 1 * b2DebugDraw :: e_jointBit ; </li></ul><ul><li>flags += 1 * b2DebugDraw :: e_coreShapeBit ; </li></ul><ul><li>flags += 1 * b2DebugDraw :: e_aabbBit ; </li></ul><ul><li>flags += 1 * b2DebugDraw :: e_obbBit ; </li></ul><ul><li>flags += 1 * b2DebugDraw :: e_pairBit ; </li></ul><ul><li>flags += 1 * b2DebugDraw :: e_centerOfMassBit ; </li></ul><ul><li>m_debugDraw . SetFlags (flags); </li></ul>
  31. 33. LIVE: Esempi vari
  32. 34. Altre caratteristiche <ul><li>Gestione dei contatti (Contact Listener) </li></ul><ul><li>Applicazione di forze, impulsi </li></ul><ul><li>Joint </li></ul><ul><li>Provare il TestBed !!! </li></ul>
  33. 35. Cocos 2D <ul><li>Progetto opensource </li></ul><ul><li>Scritto in Objective-C </li></ul><ul><li>Integra i motori fisici Box2D e Chipmunk </li></ul><ul><li>Usa OpenGL ES 1.0 </li></ul><ul><li>Supporto per videogiochi: </li></ul><ul><ul><li>Suono e musica </li></ul></ul><ul><ul><li>Sistema particellare </li></ul></ul><ul><ul><li>Tile Map e parallasse </li></ul></ul><ul><ul><li>Text rendering </li></ul></ul><ul><ul><li>Gestione menù </li></ul></ul><ul><ul><li>Gestione highscore </li></ul></ul><ul><ul><li>… . </li></ul></ul>
  34. 36. Altre piattaforme??? <ul><li>- C# : Box2DX, Box2D.XNA, </li></ul><ul><li>- JAVA : Jbox2D </li></ul><ul><li>- Delphi: Box2D Delphi </li></ul><ul><li>- Javascript : Box2DJS, box2dweb </li></ul><ul><li>- FLASH : Box2DFlash </li></ul><ul><li>- DS : Box2D for DS </li></ul>
  35. 37. The End

×