Нормали к поверхности
В примере с белым кубом все его грани были освещены одинаково интенсивно вне зависимости от ориентации относительно источника света. В природе так не бывает. OpenGL с легкостью рассчитает интенсивность освещенности, но для этого ей необходимо сообщить ориентацию поверхности в пространстве. Это делается с помощью вектора, перпендикулярного к поверхности, который называют нормалью. Если известны координаты нормали X, Y, Z (в данном примере это числа с плавающей запятой - float), нормаль к поверхности задается выражением:
invoke glNormal3f, X, Y, Z
Если поверхность плоская и представляет собой многоугольник, достаточно задать нормаль для одной из вершин. Построить перпендикуляр к плоскости можно как векторное произведение любых двух векторов, лежащих в этой плоскости, это показано на картинке:
Если задан вектор а
и вектор b
их векторное произведение ab в правосторонней системе координат ab можно вычислить по формуле
Начало координат при этом должно находится в точке пересечения всех трех векторов, если точка пересечения имеет координаты
то при вычислениях в формулу произведения необходимо подставлять разности вида X1 - X0, Y1 - Y0 и т.д. В случае криволинейной поверхности нормаль можно построить к плоскости, касательной к этой поверхности.