Hej, håller på med spelprogrammering med openGL. Har gjort en labyrint och försöker just nu få kollisionshanteringen att fungera. Använder boken "Spelprogrammering med CDX och OpenGL". Kollisionshantering fungerar för det mesta som den ska; om man krockar med väggen får man sin position man hade innan man krockade. Men om man t.ex. går framåt och går åt sidan samtidigt kan man gå igenom väggar på vissa ställen. Hur löser man det här? Kollisionsdetektion är svårare än man kan tro. I 2D är det dock ganska ok.Kollisionshantering
konstruktor för en boundingbox
BoundingBox(int boxnr){
xmax = 0;
xmin = 0;
zmax = 0;
zmax = 0;
boxnumber = boxnr;
}
definition av vad som räknas som en krock
int Hit(int me, int totalboxes, BoundingBox boxarray[])
{
int intersect = -1;
for(int i=0;i<me;i++)
//Är mitt xmax större än den andras xmin samt
//mitt xmin mindre än den andras xmax samt
//zmax och zmin på samma sätt som xmax och xmin
//då är det en krock!
if(boxarray[me].xmax > boxarray[i].xmin && boxarray[me].xmin < boxarray[i].xmax &&
boxarray[me].zmax > boxarray[i].zmin && boxarray[me].zmin < boxarray[i].zmax)
intersect = i;
for (int i=(me+1);i<totalboxes;i++)
if(boxarray[me].xmax > boxarray[i].xmin && boxarray[me].xmin < boxarray[i].xmax &&
boxarray[me].zmax > boxarray[i].zmin && boxarray[me].zmin < boxarray[i].zmax)
intersect = i;
return intersect;
}
Spelarens krockbox och vad som händer när man krockar
boxn = 0;
BoundingBox me(boxn);
me.xmax=(eyex + 2.0);
me.xmin=(eyex - 2.0);
me.zmax=(eyez + 2.0);
me.zmin=(eyez - 2.0);
boxarray[boxn] = me;
//krockhantering
if(me.Hit(boxn, boxn, boxarray) != -1) {
eyex = oldEyeX;
eyez = oldEyeZ;
}
boxn++;
Sv: Kollisionshantering
Har du kollat på exakt vad det är som händer som gör att det blir så?
Jag antar att du gör något i stil med
me.x += ...
me.z += ...
Problemet bör då vara att du tar dig så långt utanför kanten i ett enda steg att du inte märker att det händer. Om du sätter maxhastigheten högre så kommer du få samma effekt oavsett riktning.
Lösningen heter continous collision detection, men blir automatiskt lite krånglig. Vad du gör är att du skapar en ny "bounding box" som täcker in alla punkter från början av ett steg till slutet av det. Går du rakt upp blir den alltså "h + v*t" hög, tror du fattar vad jag menar.