OpenGL вычисляет правильные нормали с учетом списка точек - PullRequest
1 голос
/ 16 февраля 2012

Для задачи у меня есть: а) упорядоченный список точек б) список точек, составляющих каждый многоугольник

Например

point1 = (1, 2, 2)
point2 = (1, 2, 3)
point3 = (1, 3, 3)

polygon1 = [ point1, point2, point3 ]

=> polygon1 - это треугольник, который может быть частью внешней части модели.

Мне нужно рассчитать правильные нормали для освещения в OpenGL.

Я знаю, что могу вычислить векторы на плоскости из заданных точек и получить перекрестное произведение, чтобы получить A нормаль к плоскости, но OpenGL требует, чтобы нормали указывали в правильном направлении (т.е. наружу).

Процесс должен быть автоматизирован, потому что у меня много многоугольников.

Если я выберу два вектора на плоскости, я не могу сказать, как я могу быть уверен, что по нормали я рассчитал точки в правильном направлении для освещения (т. Е. Находится снаружи модели).

Я подумал, что мог бы добавить вычисленную нормаль к точке на плоскости и посмотреть, находится ли она дальше от начала координат, чтобы увидеть, верна ли она, но модель довольно сложна, и некоторые нормали, возможно, должны указывать на начало координат

Если это помогает, оказывается, что все многоугольники являются треугольниками (хотя не понимаю, как это помогает, должно быть в состоянии абстрагироваться для любого многоугольника)

Ответы [ 2 ]

3 голосов
/ 16 февраля 2012

Ваша проблема обычно называется "ориентацией поверхности коллектора". В случае закрытых коллекторов это может быть решено однозначно, в случае открытых, но ориентируемых коллекторов вы должны вручную решить, какая сторона патча находится «снаружи».

Однако есть некоторые коллекторы, такие как бутылки Кляйна или полоски Мебиуса, для которых проблему не решить сторона).

Хорошо, касаемо вашей проблемы с супом из треугольников: обычно это решается с помощью так называемых пол ребер . То есть для каждого треугольника вы строите список вершин, которые их составляют. Это дает вам 3 направленных пол ребра для каждого треугольника. Теперь для каждой пары вершин v1, v2 вы создаете список ребер, соединяющих их (вы должны использовать пару ID вершины как ключ в хэш-карте, где ключ ((v1, v2)) == ключ ((v2, v1) ), проще всего сделать, отсортировав их). Для каждой такой пары вершин вы должны найти либо только одну половину ребра, либо две антипараллельные пол ребра. Если имеется более двух полукругов, то поверхность не ориентируема. Если пол ребра параллельны, ориентация треугольника, который принадлежит одному из пол ребер, должна быть перевернута. Выберите один начальный треугольник и постройте дерево из соединенных треугольников, затем из этих треугольников в следующий и так далее. В дереве магазина для каждого треугольника есть флип-счетчик. Если счетчик нечетный, все треугольники, расположенные ниже по дереву, также должны рассматриваться как перевернутые. Ни у одного треугольника не должно быть явного значения счетчика переворотов, превышающего 1. Кумулятивный счет перевернутых ветвей должен быть четным в точке слияния.

0 голосов
/ 17 февраля 2012

Обычно точки, определенные по часовой стрелке, соответствуют внешней поверхности объекта. Так что нормальные расчеты будут полезны.

...