Wie kann ich anhand einer Ebene und eines Punkts bestimmen, auf welcher Seite der Ebene sich der Punkt befindet?


8

Angesichts des Punktes

Vector pos = new Vector(0.0, 0.20156815648078918, -78.30000305175781, 1.0);

und die Ebene (Dreieck)

Vector a = new Vector(-6.599999904632568, 0.0, -78.5, 1.0);
Vector b = new Vector(6.599999904632568, 0.0, -78.5, 1.0);
Vector c = new Vector(6.599999904632568, 4.400000095367432, -78.5, 1.0);

Ich möchte ein Flugzeug bekommen, das normal in Richtung zeigt pos

//Getting plane normal
Vector ac = Vector.Subtract(a,c);
Vector bc = Vector.Subtract(b,c);
Vector planeNormal = Vector.CrossProduct(bc, ac);

//Testing which side of the plane the point is on
double dprod = Vector.DotProduct(planeNormal, pos);
if (dprod < 0)
{
    planeNormal.Negate();
}

Aber diese Methode ist falsch. Die resultierenden planeNormalPunkte in der negativen Z-Richtung, daher sollte es nicht negiert werden. Gibt es dafür eine bewährte Methode? Bitte hilf mir, ich versage massiv @ math :)


Ich würde das Normale normalisieren, wenn Sie eine ähnliche Methode für Beleuchtungsberechnungen verwenden.
Ray Dey

Antworten:


9

Ihre Methode ist größtenteils korrekt, verpasst jedoch einen Schritt. Sie können die Position des Punkts nicht einfach als Vektor verwenden, um ein Punktprodukt zu erhalten. Sie müssen einen Richtungsvektor aus einem Punkt in der Ebene erstellen. Jeder Punkt in der Ebene reicht aus (die Richtung muss nicht genau sein), verwenden Sie also einfach eine der Ecken.


Cool. Warum spielt es keine Rolle, welcher Punkt im Flugzeug gewählt wird?
Cameron

Weil Sie am Ende nur nach Positiven oder Negativen aus dem Punktprodukt suchen. Unabhängig vom genau berechneten Wert ist das Punktprodukt positiv für Vektoren, die auf eine Seite zeigen, und negativ für Vektoren, die auf die andere Seite zeigen.
Schockieren
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.