3D-Linien-Segment und ebenenschnitt
Ich versuche zu realisieren eine Linie, segment und plane intersection-test, der true oder false zurück, je nachdem, ob oder nicht, es schneidet das Flugzeug. Auch wird es wieder den Kontakt Punkt auf der Ebene, wo die Linie schneidet, wenn die Linie nicht schneidet, ist die Funktion soll noch zurück, die Kreuzung war für mich der Punkt die Linie segmenent war ray. Ich benutzte die Informationen und den code von Christer Ericson Real-time Collision Detection, aber ich glaube nicht, dass im der Umsetzung ist es korrekt.
Dem Flugzeug im mit ist abgeleitet von dem normalen und vertice eines Dreiecks. Suche nach der Lage des Schnittpunktes auf der Ebene ist das, was ich will, unabhängig davon, ob oder nicht es liegt am Dreieck, die ich verwendet, um daraus das Flugzeug.
Die Parameter der Funktion sind wie folgt:
contact = the contact point on the plane, this is what i want calculated
ray = B - A, simply the line from A to B
rayOrigin = A, the origin of the line segement
normal = normal of the plane (normal of a triangle)
coord = a point on the plane (vertice of a triangle)
Hier ist der code im Einsatz:
bool linePlaneIntersection(Vector& contact, Vector ray, Vector rayOrigin, Vector normal, Vector coord) {
//calculate plane
float d = Dot(normal, coord);
if (Dot(normal, ray)) {
return false; //avoid divide by zero
}
//Compute the t value for the directed line ray intersecting the plane
float t = (d - Dot(normal, rayOrigin)) / Dot(normal, ray);
//scale the ray by t
Vector newRay = ray * t;
//calc contact point
contact = rayOrigin + newRay;
if (t >= 0.0f && t <= 1.0f) {
return true; //line intersects plane
}
return false; //line does not
}
In meinen tests, es nie wieder wahr... irgendwelche Ideen?
dieser test ist in 3D
haben Sie sich entschlossen, in das Ende?
InformationsquelleAutor kbirk | 2011-08-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich könnte mich irren über diese, aber es gibt ein paar stellen im code, die scheinen sehr verdächtig. Um zu beginnen, betrachten Sie die folgende Zeile:
Hier, Ihr Wert
d
entspricht das Skalarprodukt zwischen der Ebene normal (Vektor) und einen Punkt im Raum (ein Punkt auf der Ebene). Dies scheint falsch. Insbesondere, wenn Sie jede Ebene durch den Ursprung und die Verwendung der Herkunft als der Koordinatenpunkt, werden Sie am Ende computingUnd sofort false zurückgeben. Ich bin mir nicht sicher, was Sie beabsichtigte, zu tun hier, aber ich bin mir ziemlich sicher, dass dies ist nicht, was Sie meinte.
Einer anderen Stelle in dem code, der verdächtige scheint ist diese Zeile:
Beachten Sie, dass Sie berechnen das Skalarprodukt zwischen der Ebene den Normalenvektor (ein Vektor) und die ray ' s Ursprungs-Punkt (ein Punkt im Raum). Dies scheint seltsam, weil es bedeutet, dass je nachdem, wo der Strahl seinen Ursprung im Raum, die Skalierung, die Sie für die ray verpasst. Ich würde vorschlagen, auf der Suche zu diesem code noch eine Zeit, um zu sehen, ob es wirklich das ist, was du meintest.
Hoffe, das hilft!
Der scaling-Faktor, der für die ray-änderungen basierend auf dem ray Herkunft zu kompensieren und die entsprechende Skalierung in den Nenner stellt fest, dass die Linie vector
ray
ist kein Einheitsvektor, aber das ganze line-segment.Ah, ich wusste nicht, dass zu fangen. Das macht Sinn.
mit diesem Fehler korrigiert, läuft der test funktioniert?
geomalgorithms.com/a05-_intersect-1.html
InformationsquelleAutor templatetypedef
Beantworte ich dies, denn es kam zuerst auf Google, wenn Sie gefragt, für ein c++ - Beispiel von ray-Kreuzung 🙂
Den code immer false zurück, weil Sie geben Sie, wenn Sie hier :
Und ein Skalarprodukt ist nur null wenn die Vektoren senkrecht zueinander stehen, das ist die Falle, die Sie vermeiden möchten (keine Kreuzung), und nicht-null-zahlen sind wahr in C.
Damit die Lösung zu negieren ( ! ) oder Dot(...) == 0.
In allen anderen Fällen gibt es eine Kreuzung.
Auf die Schnittpunkt-Berechnung :
Alle Punkte X einem Flugzeug befolgen Sie die Gleichung
Wo N ist das normal und d kann gefunden werden, indem Sie einen bekannten Punkt der Ebene in die Gleichung ein.
Auf die ray, die alle Punkte s einer Zeile ausgedrückt werden kann, als ein Punkt p und einen Vektor geben die Richtung D :
Also, wenn wir Suche für die x s ist in der Ebene, wir haben
Das Skalarprodukt ein.b ist transpose(a)*b.
Lassen Sie transpose(N) werden Nt.
Gibt uns :
Wir können jetzt den Schnittpunkt, indem Sie x in der Zeile Gleichung
Der obige code aktualisiert :
Beiseite 1:
Was bedeutet die d Wert bedeuten ?
Für zwei Vektoren eine und b ein Skalarprodukt tatsächlich gibt die Länge der orthogonalen Projektion von einem Vektor auf den anderen mal diese anderen Vektor.
Aber wenn eine normalisiert (Länge = 1), Dot(a, b) ist dann die Länge der Projektion von b auf eine. Im Fall unseres Flugzeuges, d gibt uns die Richtungs-Abstand aller Punkte der Ebene, in der normalen Richtung auf den Ursprung (eine ist das normal). Wir können dann zu bekommen, ob ein Punkt auf dieser Ebene durch den Vergleich der Länge der Projektion auf die normale (Dot-Produkt).
Beiseite 2:
Wie Sie überprüfen, wenn ein Strahl schneidet ein Dreieck ? (Für die Grafik)
Um zu testen, ob ein ray kommt in einem Dreieck gegeben durch 3 Ecken haben, müssen Sie zunächst das zu tun, was hier gezeigt wird, erhalten den Schnittpunkt mit der Ebene, gebildet durch das Dreieck.
Der nächste Schritt ist zu schauen, wenn dieser Punkt liegt im Dreieck. Dies kann erreicht werden durch die barycentric coordinates, die Ausdrücken können, einen Punkt in ein Flugzeug als eine Kombination von drei Punkten. Sehen Barycentric Coordinates und die Umwandlung von kartesischen Koordinaten
InformationsquelleAutor Jomi
Dieser sieht alles schön für mich. Ich habe eigenständig geprüft, die algebra und das sieht gut für mich.
Als Beispiel Testfall:
Gibt es:
So die emendation folgende @templatetypedef Antwort, der einzige Bereich, wo ich sehen kann ein problem mit der Umsetzung einer der anderen Operationen, sei es
Dot()
oder dieVector
Betreiber.InformationsquelleAutor Keith