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

Aktuelle Zeit: Mi Jul 16, 2025 10:42

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



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: einfache Kollision klappt nicht!
BeitragVerfasst: So Jan 25, 2004 12:23 
Offline
DGL Member

Registriert: Sa Jan 24, 2004 15:15
Beiträge: 9
Wohnort: Berlin
Hallo, habe eine ganz einfache Kollisionskontrolle einbauen wollen, aber die will einfach nicht funktionieren - ich poste hier mal, was ich gemacht habe, vielleicht findet ja einer nen Fehler - oder ihr ratet mir zu einer anderen Art der Kollisionskontrolle (im HInblick darauf, dass ich irgendwann auch mal Treppen steigen oder Schrägen hochlaufen möchte) aber nicht vergessen, dass ich relativ Newbie bin!

Zitat:
procedure TForm1.setCollision(x,y : Integer);
begin
Kollision[x+10,y+10]:=true;
end;

function TForm1.getCollision(x,y: Integer): Boolean;
begin
Result:=Kollision[x-10,y-10];
end;

var Kollision: array [0..20,0..20] of Boolean;

// Durchgang
glColor3f(0.6,0.6,0.6);
glBegin(GL_QUADS);
glVertex3f(-5,-1,6);
glVertex3f(-5,2,6);
glVertex3f(-6,2,6);
glVertex3f(-6,-1,6);
for x:= -5 to -6 do setCollision(x,6);
glVertex3f(-5,-1,3);
glVertex3f(-5,2,3);
glVertex3f(-6,2,3);
glVertex3f(-6,-1,3);
for x:= -5 to -6 do setCollision(x,3);
// Durchgang Boden
glColor3f(0.5,0.5,0.5);
glVertex3f(-5,-1,6);
glVertex3f(-5,-1,3);
glVertex3f(-6,-1,3);
glVertex3f(-6,-1,6);
glEnd;
glBindTexture(GL_TEXTURE_2D, tex2);
glBegin(GL_QUADS);
// Wand vorn
glTexCoord2f(0,0); glVertex3f(-5,-1,-10);
glTexCoord2f(0,2); glVertex3f(-5,2,-10);
glTexCoord2f(4,2); glVertex3f(2,2,-10);
glTexCoord2f(4,0); glVertex3f(2,-1,-10);
for x:=-5 to 2 do setCollision(x,-10);
// Wand rechts
glTexCoord2f(0,0); glVertex3f(2,-1,-10);
glTexCoord2f(0,2); glVertex3f(2,2,-10);
glTexCoord2f(8,2); glVertex3f(2,2,10);
glTexCoord2f(8,0); glVertex3f(2,-1,10);
for x:= -10 to 10 do setCollision(2,x);
// Wand hinten
glTexCoord2f(4,0); glVertex3f(-5,-1,10);
glTexCoord2f(4,2); glVertex3f(-5,2,10);
glTexCoord2f(0,2); glVertex3f(2,2,10);
glTexCoord2f(0,0); glVertex3f(2,-1,10);
for x:= -5 to 2 do setCollision(x,10);
// Wand links vorne
glTexCoord2f(4,0); glVertex3f(-5,-1,-10);
glTexCoord2f(4,2); glVertex3f(-5,2,-10);
glTexCoord2f(0,2); glVertex3f(-5,2,3);
glTexCoord2f(0,0); glVertex3f(-5,-1,3);
for x:= -10 to 3 do setCollision(-5,x);
// Wand links hinten
glTexCoord2f(0,0); glVertex3f(-5,-1,6);
glTexCoord2f(0,2); glVertex3f(-5,2,6);
glTexCoord2f(2,2); glVertex3f(-5,2,10);
glTexCoord2f(2,0); glVertex3f(-5,-1,10);
for x:= 6 to 10 do setCollision(-5,x);
glEnd;
glBindTexture(GL_TEXTURE_2D, tex);
glBegin(GL_QUADS);
// Boden
glTexCoord2f(0,0); glVertex3f(-5,-1,10);
glTexCoord2f(0,6); glVertex3f(-5,-1,-10);
glTexCoord2f(6,6); glVertex3f(2,-1,-10);
glTexCoord2f(6,0); glVertex3f(2,-1,10);
glEnd;

procedure TForm1.GetKeyInput;
begin
if Keys[vk_up] then begin
MoveX := MoveX - 0.1*sin(degtorad(RotateX))*timefactor/50;
if getCollision(floor(MoveX),floor(MoveZ)) then MoveX := MoveX + 0.1*sin(degtorad(RotateX))*timefactor/50;
MoveZ := Movez + 0.1*cos(degtorad(RotateX))*timefactor/50;
if getCollision(floor(MoveX),floor(MoveZ)) then MoveX := MoveX - 0.1*cos(degtorad(RotateX))*timefactor/50; end;
if Keys[vk_down] then begin
MoveX := MoveX + 0.1*sin(degtorad(RotateX))*timefactor/50;
if getCollision(floor(MoveX),floor(MoveZ)) then MoveX := MoveX - 0.1*sin(degtorad(RotateX))*timefactor/50;
MoveZ := MoveZ - 0.1*cos(degtorad(RotateX))*timefactor/50;
if getCollision(floor(MoveX),floor(MoveZ)) then MoveZ := MoveZ + 0.1*cos(degtorad(RotateX))*timefactor/50; end;
if Keys[vk_right] then begin
MoveX := MoveX + 0.1*sin(degtorad(RotateX-90))*timefactor/50;
if getCollision(floor(MoveX),floor(MoveZ)) then MoveX := MoveX - 0.1*sin(degtorad(RotateX-90))*timefactor/50;
MoveZ := MoveZ - 0.1*cos(degtorad(RotateX-90))*timefactor/50;
if getCollision(floor(MoveX),floor(MoveZ)) then MoveZ := MoveZ + 0.1*cos(degtorad(RotateX-90))*timefactor/50; end;
if Keys[vk_left] then begin
MoveX := MoveX + 0.1*sin(degtorad(RotateX + 90))*timefactor/50;
if getCollision(floor(MoveX),floor(MoveZ)) then MoveX := MoveX - 0.1*sin(degtorad(RotateX + 90))*timefactor/50;
MoveZ := MoveZ - 0.1*cos(degtorad(RotateX + 90))*timefactor/50;
if getCollision(floor(MoveX),floor(MoveZ)) then MoveZ := MoveZ + 0.1*cos(degtorad(RotateX + 90))*timefactor/50;
end;
end;


Zur Erklärung: Das Array habe ich nur so hoch gemacht, weil ich dachte, dass vielleicht der Fehler im negativen Zahlenbereich liegt! Vielleicht ist ads Problem aber auch im Zählen in der for-Schleife! Oder ich bin einfach doof 8das wahrscheinlich sowieso)!
Dass die Variante mit den gerundeten Werten nicht ganz sauber ist, ist mir klar!
Noch was: Es sind ja "unsichtbare Mauern" da, aber durch die kann man durchschlüpfen an bestimmten Stellen... dachte zuerst, dass das am Runden liegen könnte (z.B wegen der 0 oder sowas) aber die Stellen sind auch nur einseitig undicht!....
Im Prinzip soll diese Kollisionsafrage sowieso nicht die endgültige Variante sein, also wenn ihr einsteigergerechte Alternativen habt, dann her damit! (irgendwann werden andere mich dann mal so anschreiben, und ich werde ihnen zu helfen wisse *vorfreu*).

Danke im Voraus
Max


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 25, 2004 13:13 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
1.) Kollisionsabfrage hat nichts mit OpenGL zu tun. Habs deshalb ins passende Forum verschoben.

2.) Deine Methode ist eigentlich total unbrauchbar, besonders wenn du komplexere Levels hast. Such mal hier im Forum, ich hab schon mehrere Male was zum Thema Ray-Triangle-Kollision gesagt, an der du eigentlich für komplexe und genaue Kollisionsabfrage nicht vorbeikommst. Gepaart mit Boundindboxen ist das die beste Methode. Geht eigentlich recht einfach : Boundingbox um Mesh erstellen, wenn der Spieler in die Boundingbox kommt, dann prüfst du erst gegen jedes Dreieck dieses Meshes.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: TAch!
BeitragVerfasst: So Jan 25, 2004 14:10 
Offline
DGL Member

Registriert: Sa Jan 24, 2004 15:15
Beiträge: 9
Wohnort: Berlin
Kann mir mal einer n kleines Programm schicken/linken, bei dem schon ne sinnvolle Kollisionserkennung drin ist, damit ich mir das mal angucken kann...
wenns geht wirklich sehr übersichtlich... nur 1 raum... oder so!

Danke


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 25, 2004 15:04 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Eine sehr robuste,schnelle und auch einfach zu implementierende Methode ist AABB gegen Brushes. Die Brush kann man für eine AABB extruhieren und braucht dann nur einen einzigen Punkt zu testen um 100% sicherzustellen, daß sich innerhalb der AABB nichts befindet. Auch kritische Situationen wie z.B. wenn der Spieler auf einer dünnen Kante läuft usw.. gehen ohne Probleme. Außerdem testet diese Methode gleich eine ganze Menge von Dreiecken auf einmal. Genaue Erklärungen dazu gibt es eigentlich in jedem Quake3 Viewer Tutorial.


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 8 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.008s | 16 Queries | GZIP : On ]