Comment puis-je obtenir le vecteur normal d'un avion à partir d'un ensemble de sommets?

9

Je travaille sur un petit projet HLSL / C ++ pour passer en revue mon travail graphique, et je ne sais pas comment obtenir un vecteur de face à partir d'un polygone de sommet. Je n'arrive pas à trouver la formule.

Les positions sont P1, P2, P3

Appelons-les classe VertexPoint avec P1.x, P1.y, P1.z par exemple?

RNewell122
la source
question étroitement liée: gamedev.stackexchange.com/questions/11520/…
jhocking
Juste pour être correct, l'étiquette dans l'image et le titre de la question doivent être " vecteur normal " au lieu de "vecteur normalisé". Le vecteur normal lui-même peut bien sûr être normalisé (sa longueur étant l'unité), mais ce n'est pas nécessaire, et le produit croisé ne produira pas de vecteur normalisé par défaut.
jjmontes
1
Googler "triangle vectoriel normal", ce qui est évident pour Google, donne des millions de visites. 1 , 2 , 3 , 4 , 5 , 6 , ...
imallett
... 7 , 8 , 9 , 10 , 11 , 12 , 13 , ...
imallett
2
... 14 , 15 , 16 , 17 ... Chacun de ceux-ci (et sans doute d'innombrables autres) répond à la question - et certains ont même le code C ++ / HLSL souhaité. Sérieusement. Cette question a été tellement battue à mort que l'appeler "double" est inadéquat. "Je n'arrive pas à trouver la formule" mon cul - tu n'as pas essayé .
imallett

Réponses:

28

Vous pouvez facilement trouver la normale en calculant deux vecteurs, V1 = P2-P1 et V2 = P3-P1, puis trouver le produit croisé N = V1 x V2. Ensuite, vous normalisez N. En fonction de l'ordre des sommets (dans le sens horaire ou antihoraire), vous obtiendrez une orientation normale vers l'avant ou vers l'arrière.

Vous devez également vous assurer que trois trois points ne sont pas alignés, s'ils le sont, vous devez choisir un autre point.

Hermetix
la source