3D-Ray-Quad-intersection-test in java
Im 3D-Raum, den ich bin versucht zu ermitteln, ob ein Strahl/Linie kreuzt, einen Platz, und wenn so, die x-und y-position auf dem Platz, die es schneidet.
Ich habe eine ray-vertreten durch zwei Punkte:
R1 = (Rx1, Ry1, Rz1) and
R2 = (Rx2, Ry2, Rz2)
Und der Platz ist vertreten durch vier Eckpunkte:
S1 = (Sx1, Sy1, Sz1),
S2 = (Sx2, Sy2, Sz2),
S3 = (Sx3, Sy3, Sz3) and
S4 = (Sx4, Sy4, Sz4).
Habe ich gefunden, viele algebraische Gleichungen, die für dieses online aber keiner zu passen scheint dieses problem genau. Idealerweise würde ich gerne die Antwort in Java-code, sondern eine Gleichung, die kann ich leicht umwandeln von code tun es auch.
Alle Hilfe wird geschätzt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist ein überblick über die Lösung:
Berechnen Sie die Gleichung der Ebene das Quadrat (vorausgesetzt, die vier Punkte sind coplanar),
Tun ray /ebenenschnitt, diese gibt Ihnen entweder nichts (ray, die parallel zu dem Platz und ich ignorieren den Fall, wo der Strahl ist eingebettet in der Ebene) oder ein Punkt,
Sobald Sie den Schnittpunkt, Projekt auf einem lokalen 2D-basis in der Ebene des Quadrates, wird diese 2D-Koordinaten (u, v) der Punkt auf der Ebene,
Prüfen Sie, ob der 2D-Koordinaten (u, v) im Quadrat (vorausgesetzt, die vier Punkte bilden ein Parallelogramm, und Sie wählte zwei benachbarten Kanten für den lokalen 2D-basis), wenn ja, dann gibt es Kreuzung (und die u/v-Koordinaten).
Nun mit der eigentlichen Gleichungen, vorausgesetzt, die vier quadratischen Eckpunkte sind wie folgt platziert:
Durch die normale der Ebene ist: n = (S2 - S1) x (S3 - S1)
Einen Punkt M gehört zu dieser Ebene iff-es erfüllt die folgende Gleichung: n . ( M - S1 ) = 0
Einen Punkt M gehört die ray-iff, geschrieben werden kann: M = R1 + t * dR mit dR = R2 - R1
Berechnen Sie die ray - /ebenenschnitt (gleichsetzen der beiden vorherigen Gleichungen):
n . ( M - S1 ) = 0 = n . ( R1 + t * dR - S1 ) = n . (R1 - S1) + t * n . Dr.
Wenn n ein . dR ist 0, dann ist die Ebene ist nicht parallel zu dem Strahl, und es gibt keinen Schnittpunkt (wieder ignoriert den Fall, wo der Strahl ist eingebettet in der Ebene).
Else t = -n . (R1 - S1) /n . Dr. und Sie dieses Ergebnis in die Vorherige Gleichung M = R1 + t * dR gibt die 3D-Koordinaten der Schnittpunkt M.
Projekt der Vektor M - S1 auf die beiden Vektoren S2 - S1 S3 - S1 (die eckigen Kanten ab S1), dies gibt beiden zahlen (u, v):
u = (M - S1) . (S2 - S1)
v = (M - S1) . (S3 - S1)
Wenn 0 <= u <= |S2 - S1|^2 und 0 <= v <= |S3 - S1|^2 ist, dann ist der Schnittpunkt M liegt innerhalb des Quadrats, sonst ist es außerhalb.
Und schließlich ein Beispiel für ein Java-Implementierung von der vorherigen Gleichungen (optimiert für das Lesen erleichtern...):