Вопрос об освещении OpenGL?

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

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

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

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

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

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


person Ashika Umanga Umagiliya    schedule 02.11.2010    source источник
comment
Я не уверен на 100%, но я думаю, что освещение должно работать нормально (линейные полосы преобразуются в очень тонкие квадраты/треугольники), пока вы устанавливаете нормали в каждой точке, добавляете источники света и включаете их... Не делайте этого. не знаю, будет ли это выглядеть хорошо.   -  person falstro    schedule 02.11.2010


Ответы (3)


Обновлено:

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

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

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

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

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

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

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

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

person LarsH    schedule 02.11.2010
comment
Однако это не совсем так, молния работает с использованием векторов нормалей, которые задаются для каждой вершины и интерполируются (или освещение рассчитывается для каждой вершины и интерполируется, не имеет значения), нормали к поверхности не имеют к этому никакого отношения, так как вектор нормалей может интерполировать вдоль линии так же, как и вдоль поверхности. - person falstro; 02.11.2010
comment
@roe: Может ли линия иметь нормаль в R3? Векторы нормалей в R3 обычно определяются как перекрестное произведение двух других (неколлинеарных) векторов — поверхность имеет два неколлинеарных вектора, а прямая — нет. - person Julien-L; 02.11.2010
comment
@Жюльен; Да, таким образом можно определить нормаль к поверхности. OpenGL решил не делать этого (и правильно сделал), а определить нормали как явный вектор нормалей в каждой вершине. Даже точка может иметь нормаль в OpenGL и поэтому может быть затенена. Математическая линия также не будет иметь толщины, и поэтому ее нельзя будет увидеть на экране, но она есть (она отображается в виде треугольников). - person falstro; 02.11.2010
comment
@roe, хорошо, что точки или линии могут иметь нормальные векторы, насколько это касается OpenGL ... редактирую свой ответ на этой основе. - person LarsH; 02.11.2010
comment
@umanga, я обновил этот ответ, чтобы отразить точку зрения @roe о том, что линии действительно могут иметь нормали. - person LarsH; 02.11.2010
comment
@LarsH большое спасибо. Да, мои контуры компланарны, поэтому я попробую использовать нормали вершин, как вы предложили. - person Ashika Umanga Umagiliya; 04.11.2010
comment
@umanga, рад, что вы нашли это полезным. Надеюсь, вы сможете опубликовать скриншот, когда у вас что-то заработает. - person LarsH; 04.11.2010

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

person Ben Jackson    schedule 02.11.2010
comment
+1 за предложение тумана, но -1, потому что указание нормалей для каждой вершины на самом деле отлично работает для линейных полос. Зависящий от глубины туман, вероятно, проще всего реализовать, поэтому я бы попробовал (с выключенным освещением) и посмотрел, приемлемы ли результаты; в противном случае вычислите нормали для каждой вершины для ваших контуров и попробуйте это. - person Gretchen; 02.11.2010
comment
@ Мэтью, почему -1 Бену? Он не сказал, что повершинные нормали не будут работать (т. е. не могут создавать световые эффекты) для линейных полос... он просто сказал, что это не принесет особой пользы. Это правильное мнение, если ваш приоритет — прояснить глубину. - person LarsH; 02.11.2010
comment
Ну, это могло показаться немного более суровым, чем я имел в виду! - но я думаю, что линии освещения могут предоставить некоторую полезную информацию о глубине, используя нормаль к поверхности (в данном случае изоповерхности). Прошло много времени с тех пор, как я использовал эту технику, поэтому я могу неправильно помнить ее полезность. - person Gretchen; 03.11.2010

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

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

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

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

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

person Redrobes    schedule 02.11.2010