Experiment med Bullet

För ett tag sen snubblade jag över Bullet Physics, en öppen fysikmotor för C++. Med den kan man simulera en värld befolkad av objekt som beter sig (hyfsat) realistiskt. Som i ett bowlingspel där klotet träffar käglor som flyger omkring och kolliderar mot varandra. Eller i ett spel som handlar om en smått oetisk affärsman som kör bil hellre än bra.

Bullet används bl.a i 3D-programmet Blender och i en del kommersiella spel (GTA IV). Versionen är uppe i 2.80; version 3 ska visst innehålla en del intressanta nyheter, som bibliotek för Android. Dokumentationen är utmärkt och det kommer med många kodexempel. Exempelkoden är kanske inte alltid så organiserad och lättläst, men å andra sidan finns det ett aktivt community som gärna svarar på dumma frågor (jag har provat).

Efter att ha lekt lite med studsande bollar och fallande dominobrickor, skrev jag ett enkelt bilspel med det lagom fantasifulla namnet Racer. Det är långt ifrån ett komplett spel, men det duger till att experimentera med Bullet. Det är inte heller helt buggfritt, men låtsas bara att guppen i vägbanan är farthinder.

Kontroller
  • Piltangenter: Gasa, styr, bromsa
  • Mellanslag: Paus
  • C: Växla kameravy
  • Escape: Flytta tillbaka bilen till startläget.

Översikt

Bullet

Bullet innehåller klasser för att simulera tyg, rep, deformerbara objekt, m.m. Den här demon begränsar sig till rigid body dynamics, dvs kroppar som behåller sin form vid kollisioner. Den demonstrerar också klassen btRaycastVehicle som simuerar ett fordon bestående av flera kroppar (chassi och hjul).

Racer

Klasser

RacerApp
Applikationens huvudklass. Ärver från OpenGlApp. Några metoder att titta på är
  • InitScene() Applikationen startas. Läser in resurser och initialiserar spelvärlden.
  • OnTimer() Anropas med jämna mellanrum och uppdaterar världen.
  • RenderScene() Renderar alla objekt i spelvärlden.
  • KillScene() Anropas när applikationen avslutas. Rensar upp minnet.
OpenGlApp

Basklass för OpenGL-applikation. Gömmer undan det mesta av Win32-koden, initialisering av OpenGL och lite annat.

Track

Klass för att generera bilbanan. Banan byggs upp utifrån en spline-kurva (Spline) som används för att generera två Mesh: ovansida och undersida av banan. Den övre meshen används för att skapa en btTriangleMesh, som Bullet använder för att beräkna kollisioner mellan bilen och vägbanan. Undersidan är bara till för syns skull.

Spline

Representerar en spline-kurva. Kurvan består av ett antal noder (Spline::Node) som i sin tur har varsin position (x, y, z), ”styrka” och rotation (en glw::Quaternion).

SplineMesh

Ärver från glw::Mesh. Skapar en Mesh utifrån en Spline och ett tvärsnitt av banan. Tvärsnittet ”sveper” längs kurvan och skapar trianglar allt eftersom.

Vehicle

Kapslar in btRaycastVehicle och lite övrigt krafs som behövs för att simuera ett fordon.

VehicleCamera

En virtuell kamera som följer efter bilen.

AboutDlg

Dialogruta med About-info.

glw

glw är ett hemmagjort klassbibliotek (har glömt vad ”glw” står för) som innehåller diverse osorterade bra-att-ha-klasser för OpenGL, t.ex för att ladda texturer och 3D-objekt. En vacker dag ska jag dokumentera dem och städa upp lite i röran. De klasser som används är i alla fall:

glw::DynamicsWorld

Världen enligt Bullet. Håller bl.a ordning på alla btRigidBody i världen, alltså stela objekt som kan kollidera med varandra. Ärver från btDiscreteDynamicsWorld och kapslar in initialiseringen.

glw::RigidBody

Ärver från btRigidBody och kapslar in initialiseringen.

glw::Mesh

Beskriver geometrin för ett objekt. Består av en uppsättning vertex och trianglar som skickas till OpenGL för rendering. Äger också en glw::Surface som definierar färg, textur, reflektion osv för trianglarna.

glw::Model

En samling av glw::Mesh som hänger ihop.

glw::Lwo2Decoder

Läser in ett LightWave2-objekt (från fil eller resurs) och skapar en glw::Model.

glw::GdiTexture

Läser in en bild (med hjälp av GDI+) och skapar en OpenGL-textur av den.

Kompilera

Projektet är utvecklat i Visual Studio 2010. Det kan nog gå att kompilera med något annat också, men inte utan en del meckande.

  1. Ladda ner och installera Bullet
  2. Ladda ner och packa upp glw till någon lämplig mapp.
  3. Ladda ner källkoden till Racer och packa upp.
  4. Projektet Racer behöver följande sökvägar:
    Sökvägar för include
    • <Sökväg till Bullet>\src
    • <Sökväg till Bullet>\Demos\OpenGL
    • <Sökväg till glw>
    Sökvägar för länkning
    • <Sökväg till Bullet>\lib
    • <Sökväg till Bullet>\Glut

Länkar

Det här inlägget postades i teknik och har märkts med etiketterna , . Bokmärk permalänken.

Kommentera

E-postadressen publiceras inte. Obligatoriska fält är märkta *