Как я могу получить вектор нормали для плоскости из набора вершин?

9

Я работаю над небольшим проектом HLSL / C ++, чтобы перейти к моей графической работе, и я не уверен, как мне получить лицевой вектор из вершинного многоугольника. Я не могу найти формулу.

Позиции P1, P2, P3

Давайте назовем их классом VertexPoint с P1.x, P1.y, P1.z, например?

RNewell122
источник
тесно связанный вопрос: gamedev.stackexchange.com/questions/11520/…
jhocking
Просто для правильности, метка на рисунке и заголовок вопроса должны быть « нормальный вектор » вместо «нормализованный вектор». Сам вектор нормалей, конечно, можно нормализовать (его длина равна единице), но в этом нет необходимости, и перекрестный продукт по умолчанию не создаст нормализованный вектор.
jjmontes
1
Поиск в Google «нормального векторного треугольника», что является очевидным для Google, дает миллионы просмотров. 1 , 2 , 3 , 4 , 5 , 6 , ...
Ималлетт
... 7 , 8 , 9 , 10 , 11 , 12 , 13 , ...
Ималлетт
2
... 14 , 15 , 16 , 17 ... Каждый из них (и бесчисленное множество других) отвечает на вопрос - а некоторые даже имеют желаемый код C ++ / HLSL. Шутки в сторону. Этот вопрос был настолько избит до смерти, что называть его «дубликат» неадекватно. "Я не могу найти формулу" моя задница - ты не пробовал .
Ималлетт

Ответы:

28

Вы можете легко найти нормаль, вычислив два вектора: V1 = P2-P1 и V2 = P3-P1, а затем найти перекрестное произведение N = V1 x V2. Затем вы нормализуете N. В зависимости от упорядочения вершин (по часовой стрелке или против часовой стрелки) вы получите нормальный фронт или тыл.

Вы также должны убедиться, что три три точки не выровнены, если они есть, вы должны выбрать другую точку.

Hermetix
источник