Герберт Джордж Понтинг (Herbert George Ponting).
Спящий мешок (The Sleeping Bag)
Для того чтобы вычислить диффузный и зеркальный компоненты света, нам необходимо найти три вектора. На рис. 8.8 показаны три главных вектора, необходимых для нахождения количества света, попадающего в глаз из точки Р: О нормаль ш к поверхности в точке Р; О вектор V, соединяющий точку Р с глазом наблюдателя; О вектор в, соединяющий точку Р с источником света.
Углы между этими тремя векторами составляют основу для вычисления интенсивностей освещения. Обычно эти углы вычисляются в мировых координатах, поскольку при некоторых преобразованиях (таких, как перспективное преобразование) углы не сохраняются.
Каждая грань каркасного объекта имеет две стороны. Если объект является объемным, то одна сторона обычно является «внутренней», а другая - «внешней» для этого объекта. Глаз видит только внешнюю сторону (если только сам глаз не находится внутри объекта!), так что именно для этой стороны нужно вычислять компоненты освещенности. Однако для некоторых объектов, вроде открытой коробки с рис. 8.9, глаз может увидеть и внутреннюю сторону крышки. Это зависит от угла между нормалью т2 к этой стороне и вектором V направления к глазу. Если этот угол меньше 90°, то эта сторона является видимой. Так как косинус этого угла пропорционален скалярному произведению V ш2, глаз может видеть эту сторону только при V ш2 > 0.
Рис. 8.8. Основные направления, используемые при вычислении отраженного света
Рис. 8.9. Вычисления освещенности производятся для одной стороны каждой грани
Визуализация граней для усиления реалистичности
Мы будем разрабатывать модель закрашивания для заданной стороны грани. Если такая сторона «отвернута» от глаза наблюдателя, то обычно она не вносит своего вклада в освещенность. Алгоритму визуализации в текущем приложении должно быть сообщено, вычислять составляющие освещенности только для одной стороны заданной поверхности или для обеих сразу. Мы увидим, что OpenGL поддерживает такое сообщение.