Освещение

Snap.svg предоставляет средства для работы с SVG-графикой, включая возможность моделирования освещения с использованием фильтров и градиентов. Основным элементом работы является объект Snap, создающий контейнер для SVG-элементов:

var s = Snap(800, 600);

Это создаёт область 800×600 пикселей. Все графические элементы, которые будут взаимодействовать с освещением, добавляются внутрь этого контейнера.

Фильтры для имитации освещения

SVG поддерживает фильтры, которые позволяют создавать реалистичные световые эффекты. Snap.svg предоставляет удобный интерфейс для их применения.

Пример создания фильтра света:

var blurFilter = s.filter(Snap.filter.blur(5, 5));
var circle = s.circle(200, 200, 100);
circle.attr({
    fill: "#ff6600",
    filter: blurFilter
});

Фильтр размытия имитирует рассеянное освещение, создавая мягкий эффект свечения вокруг объекта.

Drop Shadow (Тень)

Тени создаются через комбинацию смещения и размытия:

var shadow = s.filter(Snap.filter.shadow(5, 5, 5, "#000", 0.5));
circle.attr({ filter: shadow });
  • Первые два параметра задают смещение по X и Y.
  • Третий параметр — радиус размытия.
  • Четвёртый — цвет тени.
  • Пятый — прозрачность.

Тени помогают визуально подчеркнуть объём объектов и направление источника света.

Градиенты и освещённость

Градиенты — основной инструмент для имитации источников света на плоских объектах.

Линейные градиенты

var linearGrad = s.gradient("l(0, 0, 1, 1)#fff-#000");
var rect = s.rect(50, 50, 200, 100).attr({ fill: linearGrad });
  • l указывает линейный градиент.
  • Параметры (0,0,1,1) задают направление.
  • #fff-#000 — переход от белого к чёрному.

Линейный градиент используется для создания эффекта падения света по поверхности, например имитации дневного освещения.

Радиальные градиенты

var radialGrad = s.gradient("r(0.5, 0.5, 0.5)#fff-#000");
var circle2 = s.circle(400, 300, 80).attr({ fill: radialGrad });
  • r — радиальный градиент.
  • Параметры (0.5, 0.5, 0.5) задают центр и радиус градиента.
  • Цветовая схема создаёт эффект центрального источника света.

Радиальные градиенты идеально подходят для имитации освещения от лампы или свечения объектов.

Комбинация фильтров и градиентов

Для реалистичного освещения часто используют комбинирование фильтров и градиентов:

var glow = s.filter(Snap.filter.blur(8, 8));
var star = s.polygon([100,10, 120,60, 80,60]).attr({
    fill: s.gradient("r(0.5,0.5,0.5)#ff0-#f00"),
    filter: glow
});
  • Градиент задаёт цветовое распределение света.
  • Фильтр размытия создаёт мягкое свечение вокруг объекта.

Это позволяет создавать эффект свечения и объёма без сложной 3D-графики.

Работа с прозрачностью и светом

Прозрачность (opacity) и смешение цветов (fill-opacity) играют важную роль в восприятии освещения.

var lightCircle = s.circle(300, 150, 60).attr({
    fill: "#fff",
    opacity: 0.3
});
  • Объекты с высокой прозрачностью имитируют рассеянный свет.
  • Наложение нескольких прозрачных объектов усиливает эффект освещения и мягкости сцен.

Динамическое освещение

Snap.svg позволяет анимировать освещение, используя функции .animate():

circle.attr({ fill: "#ff0000" }).animate({ fill: "#ffff00" }, 2000, mina.linear);
  • Меняется цвет объекта, имитируя смену источника света.
  • Можно анимировать радиальные градиенты для создания эффекта движения света.

Практические советы по освещению

  1. Использовать комбинацию фильтров и градиентов. Один без другого создаёт плоскую картинку.
  2. Регулировать прозрачность. Для мягкого света и свечения важно не использовать полностью непрозрачные цвета.
  3. Направление света. Линейные градиенты задают направление источника света, радиальные — его локализацию.
  4. Масштаб и размытие. Большое размытие и небольшое смещение создают мягкую рассеянную тень, малое — резкую и локальную.
  5. Анимация для динамики. Даже простое изменение цвета или позиции градиента создаёт ощущение живой сцены.

Итоговое применение

Все элементы можно объединять в сложные сцены с несколькими источниками света:

var s = Snap(800, 600);

var radial = s.gradient("r(0.5,0.5,0.5)#fff-#00f");
var circle = s.circle(400, 300, 100).attr({ fill: radial, filter: s.filter(Snap.filter.blur(10, 10)) });

var shadow = s.rect(350, 400, 100, 20).attr({ fill: "#000", opacity: 0.5, filter: s.filter(Snap.filter.blur(5,5)) });

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