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*).
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.
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!
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.
Mitglieder in diesem Forum: 0 Mitglieder und 13 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.