Установив геометрию и настроив внешний вид объекта, мы можем задать освещение. Без освещения мы бы не могли увидеть объект, кроме того, освещение также влияет на внешний вид, а именно на цвет объекта, наравне с материалами. В WPF система освещения призвана имитировать свет в окружающем нас мире. В то же время эта имитация все-таки далека от реальной. Так, свет отраженный от одного объекта, не будет виден на другом объекте. Также объекты не обрасывают на другие объекты тени.
Свет в WPF определяется следующим образом: сначала вычисляется освещенность для отдельной вершины треугольника, а затем эта освещенность интерполируется на весь треугольник, сглаживаясь с освещенностью двух других вершин.
Для определения света в WPF используется базовый класс Light, но в реальности мы будем работать с производными от него классами:
DirectionalLight: создает прямые параллельные лучи, которые идут в направлении, указанном в свойстве Direction. В качестве примера подобного источника света можно привести солнце.
AmbientLight: создает источник рассеянного света. Свет исходит со всех сторон и равномерно покрывает поверхность объекта
PointLight: создает точечный источник света.
SpotLight: создает источник, который испускает свет на трехмерную сцену по конусу.
Для установки освещения в прошлой теме мы использовали объект DirectionalLight:
<ModelVisual3D> <ModelVisual3D.Content> <DirectionalLight Color="White" Direction="-1,-1,-2" /> </ModelVisual3D.Content> </ModelVisual3D>
Использованный нами в примере источник освещения задает вектор направления света. Он начинается в точке (0,0,0) и направлен в точку (-1,-1,-2). При этом нам важен угол падения света, а не длина вектора, которая может быть и (-2,-2,-4), но будет означать то же самое, что и направление вектора (-1,-1,-2), поскольку оба вектора эквивалентны.
Представляет рассеяный свет. Также широко распространенный источник света.
<AmbientLight Color="Yellow" />
Кроме того, для создания рассеянного света мы можем использовать свойство AmbientColor у объекта DiffuseMaterial:
<DiffuseMaterial Brush="LightCoral" AmbientColor="Yellow" />
Для создания точечного света нам надо указать точку, в которой находится источник света:
<PointLight Color="White" Position="0,0.8,0.25" />
Данный источник света похож на PointLight, также лучи света направлены в одну точку, только теперь освещенность ограничивается углом, который определяется конусом:
<SpotLight Color="White" Position="1,0.2,0.5" Direction="-0.5,-0.5,-0.5" InnerConeAngle="45" OuterConeAngle="90" />
Свойства InnerConeAngle
и OuterConeAngle
определяют форму конуса, используемого для определения освещенности. Если эти свойства равны,
то фактически мы получаем стандартный точечный свет PointLight. А свойства Position и Direction также указывают соответственно на положение источника света и направление света.