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

#opengl #normals

#opengl #нормали

Вопрос:

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

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

Я получил нормальное значение как (0, .73,-.69)

для quad 2:

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

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

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

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

Ответ №1:

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

 (0.0, 0.725, -0.689)
  

Для второго:

 (0.0, -0.725, -0.689)
  

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

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

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

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

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