Вопрос освещения OpenGL? - PullRequest
1 голос
/ 02 ноября 2010

Приветствую всех,

Как видно на рисунке, я рисую множество контуров, используя GL_LINE_STRIP.Но контуры выглядят как беспорядок, и мне интересно, как я могу сделать так, чтобы это выглядело хорошо.?

Заранее спасибо

Исходное изображение

http://oi53.tinypic.com/287je40.jpg

http://oi53.tinypic.com/287je40.jpg

Ответы [ 3 ]

4 голосов
/ 02 ноября 2010

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

3 голосов
/ 02 ноября 2010

Обновлен:

Уманга, сначала я думал, что освещение не будет работать, потому что освещение основано на поверхностных нормальных векторах - и у вас нет поверхностей. Тем не менее, @roe указал, что векторы нормалей находятся в OpenGL на каждую вершину, и поэтому любой POLYLINE может иметь нормали. Так что это будет вариант.

Не совсем понятно, каким должно быть нормальное изображение для 3D-линии, как сказал @Julien. Вопрос в том, как определить нормали для контурных линий так, чтобы получающееся освещение имело визуальный смысл и помогало уточнить глубину?

Если все вершины в каждом контуре копланарны (например, в плоскости XY), вы можете установить 3D-нормаль в качестве 2D-нормали с 0 в качестве координаты Z. Получающееся освещение дало бы визуальное ощущение формы, хотя возможно не глубины.

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

Конец обновления

+ 1 к предложению Бена установить цвета линий на основе высоты (это топографические контуры?) Или на основе расстояния от зрителя. Вы также можете заполнить полигон, окруженный каждым контуром, таким же цветом, как в http://en.wikipedia.org/wiki/File:IsraelCVFRtopography.jpg

Еще один способ сделать линии более четкими - это иметь их меньше ... Вы можете отрегулировать плотность контуров? Например. одна контурная линия на разность высот 5 футов, а не на 1 фут, или какими бы ни были единицы измерения. В зависимости от того, что вы рисуете контуры.

Другие методы определения глубины включают стереоскопию и поворот изображения в 3D во время просмотра.

2 голосов
/ 02 ноября 2010

Если вы ищете затенение, вы обычно конвертируете контуры в сплошные.Обычный способ сделать это - построить сетку, установив 4 угловые точки на нулевой высоте на границах или за ее пределами, затем сбросив контуры в сетку и получив сетку для триангуляции координат. После этого у вас будет триангулированное телокорпус, для которого вы можете найти нормали и сгладить их по смежным граням, чтобы создать гладкую местность.

Для триангуляции сетки обычно используется алгоритм Делоне, который немного чудовищен, но существуют библиотеки для этого,Лучшее, что я знаю, это те, которые основаны на бумагах Гибаса как Столфи, так как они довольно оптимальны.

Чтобы получить нормали, вы делаете простой перекрестный продукт и убедитесь, что облицовка правильная, и перенормируйте их вручную перед подачейthe glNormal.

В старые времена вы использовали glList из результата, но новый способ - создать массив вершин.Если вы хотите использовать дополнительную флэш-память, вы можете искать совпадающие плоские грани и оптимизировать сетку для более быстрого перерисовки, но это немного черное искусство - хорошо для игр, не так хорошо для САПР.

(thxдля бонуса в прошлый раз)

...