2012-02-15 4 views
1

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

Например

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

polygon1 = [ point1, point2, point3 ] 

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

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

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

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

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

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

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

+0

Если есть треугольник, плавающий в пространстве сам по себе, что такое «правильная» сторона? Кажется, единственный правильный ответ - двухстороннее освещение. – Ani

+0

Не можете ли вы просто использовать порядок передних лиц (по часовой стрелке или против часовой стрелки), чтобы определить порядок выполнения креста? – user1118321

+0

@ananthonline - это не треугольник, плавающий в пространстве, у меня много полигонов, которые все соединяются, чтобы сформировать хороший закрытый объект. – Blue42

ответ

0

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

3

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

Однако существуют некоторые многообразия, такие как бутылки Кляйна или полоски Мебиуса, для которых проблема не может быть решена (обратите внимание: если вы дважды зацикливаете по полосе Мебиуса, вы можете ориентировать поверхность, если вы предполагаете, что можете видеть только одна сторона).

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

+0

Это означает, что я должен знать правильный нормальный для первого многоугольника? Затем выясняется, что остальное? – Blue42

+0

@ Blue42: Точно. Также стоит упомянуть, что в геометрических терминах нет способа решить, что такое «внутри». Есть эта старая шутка о том, как математик ловит слона: он поглощается колючей проволокой и определяет «Я снаружи». – datenwolf