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

Aktuelle Zeit: Sa Jul 12, 2025 09:41

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Kollisionsberechnung ...
BeitragVerfasst: Mi Mär 17, 2004 20:47 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 21, 2003 17:36
Beiträge: 141
Adios...

So, ich hab mal wieder ein WeWechen, diesmal gehts um die Kollisionsberechnung, und zwar zum überprüfen, ob ein Punkt in einer beliebig transformierten Box liegt. Dazu hab ich mir mal eben dieses Tutorial angeschaut, irgendwo in der Mitte bis unten findet man einen Absatz über das, was ich eigentlich vorhab. Im Grunde wird halt jedes Polygon der Box durchgegangen und überprüft, ob der Punkt vor oder hinter dem Polygon liegt. Liegt der Punkt bei jedem Polygon der Box hinter dahinter, so liegt der Punkt selbst auch in der Box. Nur bin ich mir da über einige Sachen noch nicht ganz im Klaren. Zumal das auch nicht klappt, mit der Überprüfung.

Hier meine Version der überprüfung, ich hab dazu sone Art Kollisions-Map erstellt, kompliziert, ich weiß, aber ich machs numal so...

Code:
  1. for i:=0 to coll_map.objects-1 do begin  //Alle Boxen der Koll.-Map durchgehen
  2.     collision := true;
  3.     for a:=0 to 5 do begin //Alle Polygone der Box durchgehen
  4.       if collision=true then
  5.         begin
  6.           v4[0]:=coll_map.Obj[i].polygon[a].normal[1]; //Vorberechnete Normalen
  7.           v4[1]:=coll_map.Obj[i].polygon[a].normal[2]; //in geeignete Variablen
  8.           v4[2]:=coll_map.Obj[i].polygon[a].normal[3]; //packen...                          
  9.  
  10.           V6[0]:=coll_map.Obj[i].vertexinfo[coll_map.Obj[i].polygon[a].usedvertex[1]].x; //Punkt #1 Des Polys
  11.          V6[1]:=coll_map.Obj[i].vertexinfo[coll_map.Obj[i].polygon[a].usedvertex[1]].y;
  12.          V6[2]:=coll_map.Obj[i].vertexinfo[coll_map.Obj[i].polygon[a].usedvertex[1]].z;
  13.  
  14.          V5[0]:=vectorsub(p, V6)[0]; // entspricht P - Boxpunkt
  15.          V5[1]:=vectorsub(p, V6)[1];  
  16.          V5[2]:=vectorsub(p, V6)[2];
  17.  
  18.  
  19.         if VectorAffineDotProduct(v4,v5) >= 0 then collision := false; // wenn Skalarprodukt aus Normalvektor und ( P - BoxPunkt ) > 0, dann Kollision...
  20.  
  21.       end;


In sofern hab ich keine Ahnung, ob das mathematisch seine Richtigkeit hat, das Skalarprodukt, worum es sich hier wohl handelt, hab ich hier das erste mal gehört.. Somit weiß ich auch nicht, ob dieses hier auch angebracht ist, ob man das damit ausrechnen kann. Ich vertraue aber mal darauf, dass das so richtig ist....

Naja, die Kollision funktioniert nicht! Der Algorithmus erscheint logisch, bis auf dein paar stellen, bspw. der, wo die Differenz aus P (dem Punkt, auf den Kollision untersucht werden soll) und dem ersten PolygonEckPunkt gebildet wird. Kann man da einfach so den ersten nehmen oder führt das zu Ungenauigkeit?

Sollte dieser Algorithmus funktionieren, theoretisch? Wenn nicht, wie müsste es richtigerweise heißen? Könnte durchaus sein, dass ich hier und da ein paar Logikfehler eingebaut hab, das habe ich so an mir...

Sorry für die vielen Umformungen, bei Gelegenheit muss ich das mal korrigieren.

Danke für die Hilfe.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 18, 2004 12:38 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
Prinzipiell ist der Algorithmus in Ordnung und funktioniert für jedes konvexe Objekt.
Voraussetzung ist aber, dass tatsächlich alle Polygone richtig herum orientiert sind (oder in deinem Fall zumindest die Normalvektoren in die richtige Richtung weisen).

Was mir bei deinem Algorithmus auffällt:
Wenn das alles ist, kollidierst du zwar gegen mehrere Boxen, collision liefert aber nur das Ergebnis der Kollision mit der letzten Box zurück (abgesehen davon, dass du die Schleife sofort abbrechen könntest, sobald collision zum ersten Mal auf false gesetzt wird).
Ausserdem solltest du mit deinen Datentypen ein wenig aufräumen: einmal hat die erste Komponente eines Vektors den Index 0, dann wieder 1 - wenn du dir einen Vektortyp pro funktionaler Einheit (etwa drei und vierdimensionale Vektoren) definierst, und dabei bleibst, sparst du dir
a) viel Schreibarbeit beim Konvertieren
b) Fehlermöglichkeiten

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 19 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.010s | 19 Queries | GZIP : On ]