Вычисление нормалей для освещения в opengl

У меня есть два четырехугольника, для которых мне нужно найти нормаль. Координаты для четырехугольника 1 следующие:

(-2,1.25,-1)
(-2,2.2,0)
(1,2.2,0)
(2,1.25,-1)

У меня нормально как (0,.73,-.69)

для четверки 2:

(-2,2.2,0)
(2,2.2,0)
(2,1.25,1)
(-2,1.25,1)

нормальный: (0,.73,.69)

Я уже рассчитал нормали. Может ли кто-нибудь подтвердить, верны ли эти нормали?

Также я читал о нормальном направлении внутрь и наружу... кто-нибудь объяснит мне эту концепцию?


person user3600372    schedule 25.06.2014    source источник


Ответы (1)


Ваши нормали в основном выглядят правильно. Для первого квадроцикла я получаю:

(0.0, 0.725, -0.689)

Для второго:

(0.0, -0.725, -0.689)

Как видите, я получил противоположный знак для второй нормали. Что ведет непосредственно ко второй части вашего вопроса.

Термин «наружу» на самом деле не имеет смысла для изолированного квадроцикла. Он в основном применяется к закрытым формам, где он должен иметь интуитивно понятный смысл. Представьте себе сферу с нарисованным вектором нормали, начинающимся в точке на сфере. Нормальное направление «наружу» означает, что оно направлено в сторону от центра куба, что означает, что оно указывает наружу. «внутрь» тогда, конечно, противоположно, когда нормаль указывает на центр сферы или внутрь формы.

Есть и другой взгляд на это, поскольку нормали в основном используются для расчета освещения. Нормали должны указывать на ту сторону поверхности, которую вы хотите видеть освещенной. Чаще всего вы смотрите на формы снаружи, поэтому вам нужно освещение снаружи. Это означает, что вы в основном хотите, чтобы нормали указывали наружу. Если у вас есть открытые поверхности, которые необходимо осветить при взгляде с любой стороны, есть несколько более сложные расчеты освещения, которые могут справиться с этим, которые обычно встречаются при «двустороннем освещении».

Здесь также важна связанная с этим концепция, а именно «порядок намотки». Он определяет, расположены ли вершины по часовой стрелке или против часовой стрелки при просмотре их с определенного направления. OpenGL использует порядок намотки, чтобы определить, обращен ли треугольник к зрителю. Опять же, вы заботитесь о желаемом порядке намотки, когда смотрите на поверхность снаружи или, в более общем смысле, со стороны, которую хотите видеть при отображении поверхности. OpenGL по умолчанию использует намотку против часовой стрелки, поэтому вам нужна обмотка против часовой стрелки, когда вы смотрите на поверхность со стороны, которую вы хотите видеть, что для закрытых форм в основном происходит снаружи. Вы часто можете избежать неприятностей с "неправильным" порядком намотки, если не устраните обращенные назад треугольники, что делается с помощью glEnable(GL_CULL_FACE). Но в любом случае вы можете уберечь себя от проблем в дальнейшем, если будете всегда использовать составной порядок намотки для ваших примитивов.

Это возвращает нас к обычному расчету. Поскольку изменился только знак, ни один из наших расчетов не является технически неверным. Я предположил, что в четырехугольниках используется намотка против часовой стрелки, а это означает, что я вижу «снаружи» четырехугольника с того направления, где вершины появляются в порядке против часовой стрелки. Так как я также хочу, чтобы нормали указывали наружу, я вычислил нормали таким образом. Другими словами, с нормалью, которую я рассчитал, если вы отойдете от четырехугольника в направлении нормали, а затем снова посмотрите на четырехугольник, вершины будут расположены против часовой стрелки.

person Reto Koradi    schedule 26.06.2014