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

Aktuelle Zeit: Mi Jul 16, 2025 16:42

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



Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Kollisionsprüfung von Objekten
BeitragVerfasst: Do Mär 08, 2012 17:11 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Moin,

habe mal eine Frage zur Kollisionsprüfung und damit meine ich nicht zu prüfen ob jemand gegen eine Wand läuft, sondern ob ein Objekt ein anderes trifft. Das Objekt ist hier eine Kugel, ihr Durchmesser wird außer beim Zeichnen einfach vernachlässigt.
Abgesehen von Lebewesen (kommt später noch, sollte man im Hinterkopf behalten) gibt es nichts weiter als simple Ebenen, welche einfache Quader sind. Wenn man auf diese eine Kugel ballert, soll das registriert werden. Intern hat eine Kugel die beiden Werte Richtung und Position. Die Kugel wird pro Frame ein Stück weiterbewegt, wobei der Betrag des Vektors der Kugel so angepasst ist, dass eine Addition der Position der Kugel mit dem Richtungs-Vektor die komplette Bewegung pro Frame durchführt.
Das heißt dass die Kugel nicht jeden Ort auf der Flugbahn besucht, da sie nicht lahm genug bewegt wird pro Frame, so dass das der Fall wäre. Also kann man nicht einfach sagen, okay ich prüf in jedem Frame ob die aktuelle Position eine Kollision darstellt, also in einer Menge von Kollisions-Werten enthalten ist. Außerdem klingt diese Idee nicht sehr performant, wenn sie möglich wäre. Man benötigt also andere Methoden. Ich schildere hier erstmal meine Überlegungen, ist sicher nicht alles Unfug:
  • Möchte man prüfen ob die Kugel exakt einen Punkt nicht trifft, dann kann man bei jeder Bewegung der Kugel den Punkt A vor der Verschiebung der Kugel und den Punkt B nach der Verschiebung nehmen und dann zusammen mit dem zu überprüfenden Punkt P ein Dreieck aufspannen - falls der Punkt jedoch getroffen wird, gibt es kein Dreieck sondern eine Gerade oder anders: Wenn P der zu überprüfende Punkt ist, A Start- und B-Endpunkt der Verschiebung ist, dann wären die Vektoren AP und AB kollinear. Kollinearität lässt sich schön prüfen, denke wäre performant genug. Problem ist nur, dass man nicht nur einen Punkt überprüfen will, sondern eine Ebene eingeschränkt auf einen Bereich. Daher funktioniert dieses Verfahren eher nicht, aber finde es doch recht interessant, da Kollinearitätsprüfung überhaupt nicht rechenaufwendig und schwierig zu implementieren ist.
  • Man könnte den Abstand der Kugel zum zu überprüfenden Objekt bei jeder Verschiebung pro Frame überprüfen und wenn der Abstand nicht mehr kleiner wird, muss man die Punkte zwischen dem Startpunkt A und Endpunkt B der Verschiebung genauer betrachten, falls die Distanz irgendwann 0 wird, wäre es ein Treffer, falls die Distanz auch da ab gewisser Rekursionstiefe nicht 0 wird, sondern wieder größer wird, wäre es kein Treffer. Das war aber nur so dahingesponnen, ich stelle es mir insgesamt recht umständlich und problematisch vor, kann mir unmöglich vorstellen dass das der richtige Weg ist.
  • Da es hier um Ebenen geht (zwar "begrenzte", aber Prinzip ist das gleiche), ließe sich eine Ebenengleichung dieser aufstellen, der Normalenvektor bestimmen und wenn der Normalenvektor und der Richtungsvektor der Kugel senkrecht aufeinander stehen, also Skalarprodukt der beiden gleich 0 ist, dann wird der Vektor irgendwann die Ebene treffen. Nun könnte man ermitteln, wo dieser Schnittpunkt ist und wenn dieser im Bereich der begrenzten Ebene liegt, ist es eine Kollision, sonst nicht (zu beachten ist noch, dass der Schnittpunkt nicht hinter dem Abschusspunkt liegt, denn auch wenn man in den Himmel schießt hat man einen Schnittpunkt mit der Ebene, bloß ist dieser hinter einem und irrelevant). Aber wie ermittelt man den Schnittpunkt ? Ich habe im Grunde keine Informationen außer dass ich weiß wo meine Kugel ist, wohin sie fliegt, dass sie die Ebene trifft und die Ebene selbst.
Die letzte Variante scheint recht effizient zu sein. Man muss halt während den Verschiebungen immer prüfen ob es gekracht hat, das heißt ich kann nicht im Voraus den Schnittpunkt berechnen. Das ginge zwar bei den Ebenen selbst gut, aber bei beweglichen Objekten haut das nicht hin, da diese sich noch wegbewegen könnte.
Wenn ich nun ein menschenartiges Lebewesen reinlade, dann müsste ich dieses bei der Trefferüberprüfung wohl in eine verzerrte Kugel packen. Doch da kann ich die Überlegungen an Ebenen oben nicht mehr anwenden wenn ich mich nicht täusche. Man könnte natürlich das Modell des Spielers in einzelne Teile zerlegen und diese wären näherungsweise wieder Ebenen, aber das ist doch wohl kaum der richtige Weg ? Supereffizient klingt es jedenfalls nicht, außer man prüft bei jeder Schussbewegung, welcher Bereich des Gegnerkörpers in Frage kommt und unterteilt diesen immer weiter, bis man eine ausreichend genäherte Ebene hätte. Das müsste dann hinhauen, da pro Schritt immer große Teile aus der Betrachtung fallen.

Das sind meine Überlegungen dazu. Ich habe mir die Kollisions-Tutorials hier angeschaut und auch den Quellcode von quelloffenen Ballerspielen. Doch so recht zum Ziel komme ich mit dem Wissen noch nicht. Ist die dritte Variante eine gute Idee und wenn ja, wie berechne ich den Schnittpunkt effektiv (meine Kenntnisse auf dem Gebiet würden zu einem Gleichungssystem führen, das wäre sicher nicht optimal). Gibt es abgesehen von diesen Überlegungen noch weitere sinnvolle Verfahren ?

Gruß,
Nils

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kollisionsprüfung von Objekten
BeitragVerfasst: Do Mär 08, 2012 17:34 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Mit dem letzten bist du schon einmal auf dem richtigen Weg. Deine Normalen konstruierst dabei so das sie stehts nach außen zeigen. Ist das Punktprodukt aus Normale und deinen Punkt für alle Ebenen <= 0 dann liegt der Punkt im Objekt. Bei einen Strahl trifft das zu wenn der Schnittpunkt T mit den Ebenen für Tnah kleiner als Tfern ist.

Dies gilt für alle Polyeder.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kollisionsprüfung von Objekten
BeitragVerfasst: Do Mär 08, 2012 19:20 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Schau dir mal CoolMath an. Die Klasse Plane hat eine Methode rayIntersect.

Was du aber wahrscheinlich willst ist nicht Ebene/Strahl sondern ein Test für Dreieck/Strahl. Das ist etwas komplexer, das Problem sind eben die Spezialfälle. Als ich das damals brauchte hatte ich mir was aus dem Internet zusammengesucht. Das folgende ist relativ flott, geht aber sicher effizienter.

Code:
  1. template<class T> inline bool edgeIntersectTriangle3D(
  2.     const Vector3<T>& v0, const Vector3<T>& v1, const Vector3<T>& v2,
  3.     const Vector3<T>& edge0, const Vector3<T>& edge1)
  4. {
  5.     // algorithm descrption see:
  6.  
  7.     // intersect ray with triangle plane
  8.     Vector3<T> dir = edge1-edge0;
  9.     T edgeLen = dir.length();
  10.     dir /= edgeLen;
  11.  
  12.     Vector3<T> normal = (v1-v0) % (v2-v0);
  13.     normal.normalize();
  14.     T normalDotDir = normal*dir;
  15.     if (abs(normalDotDir) < EPSILON) {
  16.         // edge and triangle are parallel
  17.         T d = -(v0*normal);
  18.         if (abs(edge0*normal + d) < EPSILON || abs(edge1*normal + d) < EPSILON) {
  19.             // edge and triangle are in the same plane
  20.  
  21.             // find and remove dominant axis
  22.             Vector3<T> absolute = normal.abs();
  23.             int dom = 0;
  24.             if (absolute[1] > absolute[dom]) { dom = 1; }
  25.             if (absolute[2] > absolute[dom]) { dom = 2; }
  26.             int axis1 = (dom + 1) % 3;
  27.             int axis2 = (dom + 2) % 3;
  28.  
  29.             // project to 2D space
  30.             Vector2<T> v0p(v0[axis1], v0[axis2]);
  31.             Vector2<T> v1p(v1[axis1], v1[axis2]);
  32.             Vector2<T> v2p(v2[axis1], v2[axis2]);
  33.             Vector2<T> edge0p(edge0[axis1], edge0[axis2]);
  34.             Vector2<T> edge1p(edge1[axis1], edge1[axis2]);
  35.  
  36.             // 2D intersection
  37.             if (pointInTriangle2D(v0p, v1p, v2p, edge0p) ||
  38.                 pointInTriangle2D(v0p, v1p, v2p, edge1p) ) {
  39.                 return true;
  40.             }
  41.             if (edgeIntersection2D(v0p, v1p-v0p, edge0p, edge1p-edge0p) ||
  42.                 edgeIntersection2D(v1p, v2p-v1p, edge0p, edge1p-edge0p) ||
  43.                 edgeIntersection2D(v2p, v0p-v2p, edge0p, edge1p-edge0p)) {
  44.                 return true;
  45.             }
  46.             return false;
  47.         }
  48.         else {
  49.             return false;
  50.         }
  51.     }
  52.     else {
  53.         // edge and triangle are NOT parallel
  54.  
  55.         // compute intersection point
  56.         T distance = (normal * (v0 -edge0)) / normalDotDir;
  57.         if (distance < 0.0 || distance > edgeLen) { return false; }
  58.         Vector3<T> point = edge0 + distance * dir;
  59.  
  60.         // find and remove dominant axis
  61.         Vector3<T> absolute = normal.abs();
  62.         int dom = 0;
  63.         if (absolute[1] > absolute[dom]) { dom = 1; }
  64.         if (absolute[2] > absolute[dom]) { dom = 2; }
  65.         int axis1 = (dom + 1) % 3;
  66.         int axis2 = (dom + 2) % 3;
  67.  
  68.         // compute barycentric coordinates
  69.         Vector2<T> b = Vector2<T>(v1[axis1] - v0[axis1], v1[axis2] - v0[axis2]);
  70.         Vector2<T> c = Vector2<T>(v2[axis1] - v0[axis1], v2[axis2] - v0[axis2]);
  71.         Vector2<T> p = Vector2<T>(point[axis1] - v0[axis1], point[axis2] - v0[axis2]);
  72.         T u = (p.y * c.x - p.x * c.y) / (b.y * c.x - b.x * c.y);
  73.         if (u < 0.0) { return false; }
  74.         T v = (p.y * b.x - p.x * b.y) / (c.y * b.x - c.x * b.y);
  75.         if (v < 0.0 || u+v > 1.0) { return false; }
  76.         return true;
  77.     }
  78. }
  79.  
  80. template<class T> inline bool edgeIntersection2D(const Vector2<T>& p1, const Vector2<T>& r1,
  81.                                                  const Vector2<T>& p2, const Vector2<T>& r2 )
  82. {
  83.     T lenr1 = r1.length();
  84.     T lenr2 = r2.length();
  85.     Vector2<T> nr1(r1.x/lenr1,r1.y/lenr1);
  86.     Vector2<T> nr2(r2.x/lenr2,r2.y/lenr2);
  87.  
  88.     Vector2<T> b = p2 - p1;
  89.     T det = nr2.x*nr1.y - nr1.x*nr2.y;
  90.     if (-EPSILON < det && det < EPSILON) {
  91.         // edges parallel
  92.         Vector2<T> br2 = b + r2;
  93.         Vector2<T> normal(-nr1.y, nr1.x);
  94.         if (abs(b * normal) > EPSILON && abs(br2 * normal) > EPSILON) {
  95.             return false;
  96.         }
  97.         T a = b*nr1;
  98.         T b = br2*nr1;
  99.         return min(a,b) <= lenr1+EPSILON && max(a,b) >= -EPSILON;
  100.     }
  101.     else {
  102.         T s = (nr2.x*b.y - b.x*nr2.y) / det;
  103.         T t = (nr1.x*b.y - b.x*nr1.y) / det;
  104.         return s > -EPSILON && s < lenr1+EPSILON && t > -EPSILON && t <= lenr2+EPSILON;
  105.     }
  106. }
  107.  
  108. /** checks if point P is inside triangle ABC. */
  109. template<class T> inline bool pointInTriangle2D(const Vector2<T>& A, const Vector2<T>& B,
  110.                                                 const Vector2<T>& C, const Vector2<T>& P)
  111. {
  112.     Vector2<T> AB = B - A;
  113.     Vector2<T> BC = C - B;
  114.     Vector2<T> CA = A - C;
  115.     bool inside  = (AB % CA)*(AB % (P-A)) <= 0;
  116.          inside &= (BC % AB)*(BC % (P-B)) <= 0;
  117.          inside &= (CA % BC)*(CA % (P-C)) <= 0;
  118.     return inside;
  119. }

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kollisionsprüfung von Objekten
BeitragVerfasst: Fr Mär 09, 2012 10:27 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Wenn ich das richtig gelsesn habe, dann willst du eine solide kollisions erkennung der kuhel und die kann man über eine entsprechend hohe abtastfrequenz erreichen.
In physiksystemen wird eigentlich die höchste geschwindigkeit genommen, die möglich sein soll, erfasst das kleinst mögliche objekt und berechnet die frequenz daraus, bei der noch eine kollision erfasst werden würde.
Die physik läuft genau aus diesem grund sehr selten mit der gleichen frequenz, wie der renderer.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kollisionsprüfung von Objekten
BeitragVerfasst: Fr Mär 09, 2012 10:49 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
TAK2004 hat geschrieben:
Wenn ich das richtig gelsesn habe, dann willst du eine solide kollisions erkennung der kuhel und die kann man über eine entsprechend hohe abtastfrequenz erreichen.
In physiksystemen wird eigentlich die höchste geschwindigkeit genommen, die möglich sein soll, erfasst das kleinst mögliche objekt und berechnet die frequenz daraus, bei der noch eine kollision erfasst werden würde.
Die physik läuft genau aus diesem grund sehr selten mit der gleichen frequenz, wie der renderer.


dann reicht es also wenn

yunharla hat geschrieben:
Deine Normalen konstruierst dabei so das sie stehts nach außen zeigen. Ist das Punktprodukt aus Normale und deinen Punkt für alle Ebenen <= 0 dann liegt der Punkt im Objekt.


hach ich liebe es wenn dinge einfacher werden :D

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kollisionsprüfung von Objekten
BeitragVerfasst: Fr Mär 09, 2012 11:50 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Früher, wo noch die CPU ein Bottleneck war, hat man Sonderbehandlungen gehabt.
Ich habe ein paar mal gelesen, dass einige Physiksysteme dynamische Abtastfrequenzen für einzelne Objekte verwendet haben.
Sehr schnelle Objekte haben dann innerhalb eines Update mehrere Updates gemacht.
Dies sorgt aber für instabile Simulationen, da ja die anderen Objekte nicht mit der gleichen Frequenz abgetastet wurden und Kollisionen unter den dynamischen Objekten aus bleiben konnten.
Ein weiterer hack sind raycasts, die zwischen den aktuellen und der nächsten position geschossen werden, hat das gleiche Problem wie der Hack zuvor.
Noch ein hack ist das raycasten, abhängig von der Geschwindigkeit, in die Umgebung und das prüfen, ob der erste Treffer innerhalb des Tolleranzbereiches liegt. Sowas sollte man heute eigentlich nur noch für die AI machen, da es bei zu spitzen Winkeln versagt(muss da leider aus Persönlicher Erfahrung sprechen :\ ).

Seit vielen Jahren langweilen sich die CPU's und man tendiert zu stabilen Physiksystemen, die einfach und möglichst keine Ausnahmenbehandlung machen. Also werden einfach alle Objekte mit höherer frequenz simuliert. Das Spiele mehrere hundert bis tausend Hz für die Physik haben ist je nach Gengre üblich. Damit hat sich das design von CPU auf Speicher optimierung umgestellt.

Ganz wichtig, der Input sollte nie Zufällig sein, also kein echtes Random, sondern eher sowas, mit fixen Seed. Dann hat man weniger sorgen, wenn man Physikabhängige Bugs sucht(auch eine Erfahrung, die ich gemacht hab).

1x1, der Optimierung, für eigene Physik :
-Software optimierungen
-Sphere-Sphere intersection sollte immer der erste Test sein(der schnellst mögliche Test)
-weitere Tests sind Objektspezifisch, z.B. Box, Plane
-verwenden von Spatial systems(z.B. Octree um die Anzahl der Tests zu reduzieren)
-Hardware optimierungen
-Parallel processing(SIMD, Threads)
-data driven design(ist einfacher und bringt mehr als alle anderen optimierungen)
-batching(dynamics, kollision, korrektur sollte nicht von den Objekten gemacht werden sondern von der physik -> Cache friendly und weniger function calls)

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Zuletzt geändert von TAK2004 am Fr Mär 09, 2012 12:05, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kollisionsprüfung von Objekten
BeitragVerfasst: Fr Mär 09, 2012 11:56 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Die Dreiecksüberprüfung gibt mir doch jederzeit an, ob es eine Kollision gibt, egal wie weit ich weg bin ? Ich habe hier eine Umsetzung des Dreiecks-Algos in "algebraischer" Variante gefunden (weil derjenige in dem Forum da schrieb, er ersetze die "algebraische" durch die gezeigte). Weil ich mich erstmal etwas näher wohl auch mit der Syntax des obigen Codes auseinandersetzen müsste, wollte ich vorher erstmal schnell die "algebraische" Variante umsetzen, um einfach mal zu schauen was passiert. Ich habe mir ein Dreieck konstruiert, was wortwörtlich nicht zu verfehlen ist, die Überprüfung sagt mir dann, dass es einen Treffer gibt. Die Distanz habe ich mir ausgeben lassen und sie geht irgendwann gegen 0, erreicht jedoch nicht exakt 0, was etwas seltsam ist, scheint ein Rundungsfehler zu sein, oder das Dreieck ist seltsam platziert. Dreieck konstruiert heißt hier einfach, dass es der Dreiecks-Kollisionsüberprüfung übergeben wurde, mehr nicht. (Algebraisch deshalb überall in Anführungsstrichen, weil alle Methoden im Endeffekt mit algebraischen Mitteln gelöst werden mit geometrischem Hintergedanken.) Die Idee mit den Dreiecken ist, dass sich ein Modell gut in Dreiecke zerlegen lässt und das Verfahren daher allgemein gut anwendbar ist, sehe ich das richtig ?

Die andere Sache mit der hohen Frequenz: Wenn die Kiste eines Benutzers zu lahm ist, wie äußert sich das dann ? Ruckelt es nur oder versagt dann die Kollisionsabfrage ?

Und damit ganz klar ist, was Sache ist: Das Ziel ist, dass jemand korrekt schießen kann, also die Kugeln nicht durch Ebenen hindurchfliegen und Gegner sollen getroffen werden können - ausreichend genau, ist immer doof wenn jemand oder etwas (Gegenstände) getroffen wird obwohl er/es nicht getroffen wurde und ist genauso doof wenn einer getroffen wird, aber nicht getroffen wird im Spiel (gut für ihn, doof für den anderen).

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kollisionsprüfung von Objekten
BeitragVerfasst: Fr Mär 09, 2012 12:15 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Nils hat geschrieben:
Die andere Sache mit der hohen Frequenz: Wenn die Kiste eines Benutzers zu lahm ist, wie äußert sich das dann ? Ruckelt es nur oder versagt dann die Kollisionsabfrage ?

Es ruckelt, weil ja die CPU weder Physik noch Renderer ausreichend schnell ausführen kann.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kollisionsprüfung von Objekten
BeitragVerfasst: So Mär 11, 2012 17:02 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Ich verschiebe derzeit durch Vektoraddition die Kugel immer weiter und prüfe ob es einen Treffer gibt. Das ganze läuft außerhalb des Rendervorgangs, eben um eine erhöhte Genauigkeit zu erzielen. Das Problem ist jedoch, dass die Werte nie gerade sind, ich habe immer hässlich krumme reelle Zahlen und muss die Toleranzen so ausdehnen, dass insgesamt die Kugeln oft korrekt als Treffer interpretiert werden, jedoch dann wegen der Toleranzen nicht ohne zusätzlichen Aufwand an die richtige Stelle geschoben werden können. Was ich aber positiv finde: Je größer der Abstand, desto größer der Fehler. Das heißt je weiter der Schütze wegsteht desto mehr schießt er daneben - das ist in der Tat ein schöner Nebeneffekt, den ich sonst anders einbauen müsste.
Aber zurück zum Problem: Ich müsste mir ausdenken, wie ich den Vektor auf den aktuellen Punkt addieren könnte um möglichst genaue Werte zum Überprüfen zu erhalten, denn ich sollte die Genauigkeit nicht erhöhen, bei Dauerfeuer packt das mein i7, auch ein Dual-Core kommt damit aus - hatte es mal erhöht und es fing an leicht Ärger zu geben. Genauere Tests muss ich noch durchführen, aber rein von der Performance her wäre es so aktuell wohl in Ordnung, wenn ich jedoch die Genauigkeit in einen tragbaren Bereich runterkriege. Derzeit verteilen sich die Kugeln etwas ungünstig im Raum, ich habe sie testweise einfach angehalten, sobald sie angeblich den Boden berühren, sieht man dann meist sehr deutlich, dass sie nicht vernachlässigbare Höhenunterschiede haben. Meine Frage hier ist daher: Gibt es da irgendwelche Tricks, die Zahlen möglichst genau zu kriegen ? Ich habe halt einen beliebigen Richtungsvektor und wenn ich mit dem von einem Punkt weggehe, kommen zu ungenaue Zahlen raus.

yunharla hat geschrieben:
Deine Normalen konstruierst dabei so das sie stehts nach außen zeigen. Ist das Punktprodukt aus Normale und deinen Punkt für alle Ebenen <= 0 dann liegt der Punkt im Objekt.

Welchen Punkt meinst Du ? Die einzigen Punkte die ich habe sind der Start- und Endpunkt des Kugel-Vektors.

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kollisionsprüfung von Objekten
BeitragVerfasst: Mo Mär 12, 2012 17:43 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Das ist lediglich die Grundlage für die Intersectiontests. Willst du das ganze für einen Strahl von Punkt A nach Punkt B umstellen dann:

Code:
  1.  
  2. Vec3 Dir = End - Start;
  3. float tnah  = 0.0f;
  4. float tfern = 1.0f;
  5. for(int i=0;i< numPlanes;i++)
  6. {
  7.    float temp = dot(plane[i].norm,Dir);
  8.    float dist = plane[i].dist - dot(plane[i].norm,start)
  9.    if(temp == 0.0f)
  10.    {
  11.       if(dist == 0) return KEIN_TREFFER;
  12.    } else {
  13.       float t = dist / temp;
  14.       if(temp < 0.0f)
  15.       {
  16.          if(t > tnah) tnah = t;
  17.       } else {
  18.          if(t < tfern) tfern = t;
  19.       }
  20.       if(tnah > tfern) return KEIN_TREFFER;
  21.    }
  22. }
  23.  
  24. return TREFFER(EINTRITT:start + dir* tnah, AUSTRITT: start + dir * tfern);
  25.  
  26.  

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kollisionsprüfung von Objekten
BeitragVerfasst: Di Mär 13, 2012 21:55 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Was für einen Abstand stellt planes[i].dist dar ?

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kollisionsprüfung von Objekten
BeitragVerfasst: Mi Mär 14, 2012 09:26 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Die Ebene ist schlicht und einfach in der Normalform.
dist = Normal * (Zero - PlanePoint) = - Normal * PlanePoint

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kollisionsprüfung von Objekten
BeitragVerfasst: Sa Mär 17, 2012 17:21 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Hm und welchen Punkt stellt PlanePoint dann dar ? Ich zerbreche mir darüber schon lange den Kopf, habe vermutlich nur ein Brett vorm Kopf, weil eigentlich denke ich müsste es offensichtlich sein, was das für ein Punkt ist.

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kollisionsprüfung von Objekten
BeitragVerfasst: So Mär 18, 2012 14:29 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
PlanePoint ist ein Ortsvektor der Ebene. Hier mal ein vollständiger Konstruktor für eine Ebene aus 3 Punkten.

Code:
  1.  
  2. plane(vec3 p1,vec3 p2, vec3 p3) {
  3.     self->normal = (p1 - p2) x (p3 - p2) ;
  4.     self->normal /= |self->normal|;
  5.     self->dist = - normal * p2;
  6. }
  7.  

_________________
Meine Homepage


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


Wer ist online?

Mitglieder in diesem Forum: Majestic-12 [Bot] und 6 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 | 15 Queries | GZIP : On ]