Последнее выражение можно реализовать в виде кода (с помощью методов класса Vector3: dot О и length О; см. приложение В) следующим образом:
double tmp = s.dot(m):
// form the dot product
// формируем скалярное произведение
double value = (tmp<0) ? 0 : tmp/ (s.lengthO * m.lengthO):
На рис. 8.11 показано, как выглядит сфера, отражающая диффузный свет, для шести значений коэффициента отражения: 0,0,2,0,4,0,6, 0,8,1. Для каждого случая исходная интенсивность равна 1,0, а интенсивность фона установлена равной 0,4. Отметим, что при pd = 0,0 сфера является полностью черной, а тень в ее нижней половине (когда скалярное произведение в уравнении (8.1) отрицательно) также черная.
Рис. 8.11. Сферы с различными коэффициентами отражения, затененные с помощью диффузного света На самом деле механизм диффузного отражения намного сложнее, чем принятая нами здесь упрощенная модель. Коэффициент отражения pd зависит от длины волны (то есть цвета) падающего света, от угла 0, и от различных физических свойств поверхности. Однако для простоты и для уменьшения времени вычислений при визуализации изображений эти влияния обычно игнорируются. Для каждой поверхности «разумное» значение коэффициента pd выбирается исходя из реалистичности результирующего изображения, иногда методом проб и ошибок.
В некоторых моделях затенения учитывается влияние расстояния, хотя это спорно. Известно, что интенсивность света, падающего на микрогрань 5 от точечного источника (рис. 8.10), обратно пропорциональна квадрату расстояния между 5 и источником. Однако эксперименты показали, что применение этого закона приводит к картинам с преувеличенным влиянием глубины. Более того, иногда удобно создавать модель источника света так, как будто он расположен «в бесконечности». Применение в этом случае закона обратных квадратов погасило бы свет полностью! Вероятно, проблема заключается в самой модели"opengl1_526.html">⇐ Предыдущая| |Следующая ⇒