Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Jul 10, 2025 21:05

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Problem bei Kugel-Dreieck-Kollision
BeitragVerfasst: Do Okt 30, 2003 17:38 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jun 25, 2003 12:44
Beiträge: 29
Hi!

In meinem Shooter versuch ich gerade ne Kollision hinzubekommen.
Die Wände sind einfache Quader mit 4 Seiten (oben und unten braucht man nicht). Das ganze ist Tile-basierend, also in etwa so, wie im Bomberman vom Son of Satan.

Die Matrizenoperationen sehen so aus:
Code:
  1.   glRotatef(turnx,1,0,0);
  2.   glRotatef(turny,0,1,0);
  3.   glTranslatef(-(mapsizex/2),0,-(mapsizey/2));
  4.   glTranslatef(-position.x,-position.y,-position.z);


position ist die Position,
turny ist der Y-Blickwinkel,
turnx ist der X-Blickwinkel.

Meine Kollisionsroutine sieht so aus:
Code:
  1.  
  2. procedure collision;
  3.  
  4. function MulDXVector(v1:TD3DXVector3;v2:single):TD3DXVector3;
  5. begin
  6.   result.x := v1.x*v2;
  7.   result.y := v1.y*v2;
  8.   result.z := v1.z*v2;
  9. end;
  10.  
  11. function SubDXVector(v1,v2:TD3DXVector3):TD3DXVector3;
  12. begin
  13.   result.x := v1.x-v2.x;
  14.   result.y := v1.y-v2.y;
  15.   result.z := v1.z-v2.z;
  16. end;
  17.  
  18. function AddDXVector(v1,v2:TD3DXVector3):TD3DXVector3;
  19. begin
  20.   result.x := v1.x+v2.x;
  21.   result.y := v1.y+v2.y;
  22.   result.z := v1.z+v2.z;
  23. end;
  24.  
  25. var i,j,k:integer;
  26.     pos,normal,voffset,vIntersection:TD3DXVector3;
  27.     box:TBoxAABB;
  28.     distance:single;
  29.     verts:array[1..8,1..3] of TD3DXVector3;
  30.     vTriangle:array[1..3] of TD3DXVector3;
  31. const
  32.   M_RADIUS:single = 1;
  33. begin
  34.   pos.x := position.x+(mapsizex/2);
  35.   pos.y := 1.5;
  36.   pos.z := position.z+(mapsizey/2);
  37.   for i := 0 to mapsizex-1 do
  38.     for j := 0 to mapsizey-1 do
  39.       if (map[i,j].typ = ttTile) and (map[i,j].haswall) then
  40.         box.Min := GetDXVector(i,0,j);
  41.         box.Max := GetDXVector(i+1,3,j+1);
  42.         box.Mittelpkt := GetDXVector(i+0.5,0.1,j+0.5);
  43.         if math3dCollisionSphereAABB(pos,M_RADIUS,box) then  
  44.         begin
  45.           //Vorne
  46.           verts[1,1] := GetDXVector(i,0,j);
  47.           verts[1,2] := GetDXVector(i+1,0,j);
  48.           verts[1,3] := GetDXVector(i+1,3,j);
  49.  
  50.           verts[2,1] := GetDXVector(i+1,3,j);
  51.           verts[2,2] := GetDXVector(i,3,j);
  52.           verts[2,3] := GetDXVector(i,0,j);
  53.           //Hinten
  54.           verts[3,1] := GetDXVector(i,0,j+1);
  55.           verts[3,2] := GetDXVector(i+1,0,j+1);
  56.           verts[3,3] := GetDXVector(i+1,3,j+1);
  57.  
  58.           verts[4,1] := GetDXVector(i+1,3,j+1);
  59.           verts[4,2] := GetDXVector(i,3,j+1);
  60.           verts[4,3] := GetDXVector(i,0,j+1);
  61.           //Links
  62.           verts[5,1] := GetDXVector(i,0,j+1);
  63.           verts[5,2] := GetDXVector(i,0,j);
  64.           verts[5,3] := GetDXVector(i,3,j);
  65.  
  66.           verts[6,1] := GetDXVector(i,3,j);
  67.           verts[6,2] := GetDXVector(i,3,j+1);
  68.           verts[6,3] := GetDXVector(i,0,j+1);
  69.           //Rechts
  70.           verts[7,1] := GetDXVector(i+1,0,j+1);
  71.           verts[7,2] := GetDXVector(i+1,0,j);
  72.           verts[7,3] := GetDXVector(i+1,3,j);
  73.  
  74.           verts[8,1] := GetDXVector(i+1,3,j);
  75.           verts[8,2] := GetDXVector(i+1,3,j+1);
  76.           verts[8,3] := GetDXVector(i+1,0,j+1);
  77.  
  78.           for k := 1 to 8 do
  79.           begin
  80.             vTriangle[1] := verts[k,1];
  81.             vTriangle[2] := verts[k,2];
  82.             vTriangle[3] := verts[k,3];
  83.             normal := math3dNormal(vTriangle);
  84.             if math3dClassifySphere(pos, normal, vTriangle[1], M_RADIUS, distance) = INTERSECTS then
  85.             begin
  86.                vOffset := MulDXVector(normal,distance);
  87.                vIntersection := SubDXVector(pos,vOffset);
  88.                if(math3dInsidePolygon(vIntersection, vTriangle, 3) or  /
  89.                   math3dEdgeSphereCollision(pos, vTriangle, 3, m_radius)) then
  90.                begin
  91.                  vOffset := math3dGetCollisionOffset(normal, m_radius, distance);
  92.                  pos := AddDXVector(pos,vOffset);  
  93.                  position.x := pos.x-(mapsizex/2);
  94.                  position.y := pos.y;
  95.                  position.z := pos.z-(mapsizey/2);
  96.                  //Hier von rede ich
  97.                end;
  98.             end;
  99.           end;
  100.         end;
  101.       end;
  102. end;
  103.  


1) Wie mach ich das jetzt, dass der Y-Blickwinkel um den gleichen Winkel erhöht wird, wie pos gedreht wurde (an der gekennzeichneten Stelle im Quelltext)?

2) Irgendwie "ruckelt" das, wenn ich an einer Wand entlang laufe.
Woran liegt das? Liegt das daran, wann ich die Routine aufrufe (ich rufe die immer nach einer Veränderung der Position auf)?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 30, 2003 19:20 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 01, 2003 18:59
Beiträge: 887
Wohnort: (The Netherlands)
Programmiersprache: fpc/delphi/java/c#
you set back the position to where it was before the collision so it goes over and over. And you get a bouncy screen.
I now set that when closer to a wall the amount of movement gets smaller until you collide.
It is not a good solution, but is sort of works.

Does anyone here know a nice tutorail of handling of collision. Other then the obb bounding box example on this site?

_________________
http://3das.noeska.com - create adventure games without programming


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 30, 2003 20:25 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 02, 2002 18:06
Beiträge: 299
Wohnort: Dresden
For a more complex project, i would recommend to use solid BSP trees. But if it's so easy, you could try a Line-Triangle Intersection. The Player consists of 3 Lines in any direction (x, y, z) and have to test these Lines with every polygon in your scene. There is an example at www.sulaco.co.za. This method is easy but very slow.

_________________
"Ich würde ja gern die Welt verändern, aber Gott gibt mir den Quelltext nicht"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 30, 2003 23:37 
Offline
DGL Member
Benutzeravatar

Registriert: Do Mär 06, 2003 15:27
Beiträge: 281
Wohnort: Bochum
www.gamedev.net
....gibts alle möglichen kollisiontests

_________________
www.extrawurst.org


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 14 Queries | GZIP : On ]