Wie kann ich den Normalenvektor für eine Ebene aus einer Reihe von Eckpunkten ermitteln?

9

Ich arbeite an einem kleinen HLSL / C ++ - Projekt, um meine Grafikarbeit durchzugehen, und ich bin mir nicht sicher, wie ich einen gegenüberliegenden Vektor aus einem Scheitelpunktpolygon erhalten soll. Ich kann die Formel nicht finden.

Die Positionen sind P1, P2, P3

Nennen wir sie zum Beispiel Klasse VertexPoint mit P1.x, P1.y, P1.z?

RNewell122
quelle
eng damit verbundene Frage: gamedev.stackexchange.com/questions/11520/...
jhocking
Aus Gründen der Richtigkeit sollte die Beschriftung im Bild und im Fragentitel " normaler Vektor " anstelle von "normalisierter Vektor" sein. Der Normalvektor selbst kann natürlich normalisiert werden (seine Länge ist die Einheit), muss es aber nicht, und das Kreuzprodukt erzeugt standardmäßig keinen normalisierten Vektor.
Jjmontes
1
Das Googeln von "normalem Vektordreieck", was für Google offensichtlich ist, führt zu zig Treffern. 1 , 2 , 3 , 4 , 5 , 6 , ...
imallett
... 7 , 8 , 9 , 10 , 11 , 12 , 13 , ...
imallett
2
... 14 , 15 , 16 , 17 ... Jeder von diesen (und zweifellos unzähligen anderen) beantwortet die Frage - und einige haben sogar den gewünschten C ++ / HLSL-Code. Ernsthaft. Diese Frage wurde so zu Tode geprügelt, dass es unzureichend ist, sie als "Duplikat" zu bezeichnen. "Ich kann die Formel nicht finden" mein Arsch - du hast es nicht versucht .
Imallett

Antworten:

28

Sie können die Normalen leicht finden, indem Sie zwei Vektoren berechnen, V1 = P2-P1 und V2 = P3-P1, und dann das Kreuzprodukt N = V1 x V2 finden. Dann normalisieren Sie N. Abhängig von der Reihenfolge der Eckpunkte (im oder gegen den Uhrzeigersinn) erhalten Sie eine normale Vorderseite oder Rückseite.

Sie müssen auch sicherstellen, dass drei drei Punkte nicht ausgerichtet sind. Wenn dies der Fall ist, müssen Sie einen anderen Punkt auswählen.

Hermetix
quelle