3D Universe - Блики на линзах (Lens Flare)
Логотип сайта 3D Univerce
Новое на сайте
Альтернативный метод трансформации геометрии
BSP-дерево и его применение в 3D графике
Матричные операции
Блики на линзах (Lens Flare)
Проверка пересечения луча с треугольником

(c)2000 by Doc

Блики на линзах (Lens Flare)

Обзор
Вы видели когда-нибудь, какие симпатичные круги появляются на изображении, получаемом с помощью камеры если в поле ее зрения попадает ярко светящийся объект? Этот эффект вызван преломлением света в каждой из линз и выглядит примерно так (картинка взята из моего приложения-примера к данной статье):
Lens demo
Итак, несмотря на то, что пример сам по себе довольно убог (каюсь ;), он довольно зрелищен. Исходя из него рассмотрим, как же создавать этот спецэффект.
.
Создание спецэффекта
Для создания бликов на линзах (я буду использовать псевдокод) вам необходимо иметь следующие картинки (хотя я бы в силу корявости этих создал бы свои ;) ):
Lens 1 Lens 2 Lens 3 Lens 4

Итак, создайте функцию MakeLens(lx, ly, cx, cy) со следующими входными параметрами:
  • lx,ly - экранные координаты источника света
  • cx,cy - координаты центра экрана.

    Зачем нам координаты центра экрана? Дело в том, что ВСЕ блики расположены ВСЕГДА на одной линии проходящей через центр экрана и соединяющей источник света с этим центром. Найдем вектор, соответствующий этой линии:
    vx = cx - lx
    vy = cy - ly.


    Итак, а теперь идет самое легкое: чтобы получить экранные координаты блика X1,Y1 нам остается только разделить (умножить) координаты вектора на необходимые смещения:
    X1 = lx + vx / dx
    Y1 = ly + vy / dy,
    и пересчитать координату, учитывая размер рисунка:
    X1 = X1 - ШиринаКаринки / 2
    Y1 = Y1 - ВысотаКаринки / 2.


    Далее следует вывод на экран - тут уже можно воспользоваться или просто выводом картинки в нужной позиции или же созданием полигонов с текстурами бликов и повернутыми к пользователю.
    А теперь я приведу значения dx и dy, использованные в приложении-примере для вывода каждого из бликов.
    Световое пятно
    X1 = lx
    X2 = ly
    Блик 1
    X1 = lx + vx / 3
    Y1 = ly + vy / 3
    Блик 2
    X1 = lx + vx / 1.5
    Y1 = ly + vy / 1.5
    Блик 3
    X1 = lx + vx
    Y1 = ly + vy
    Блик 4
    X1 = lx + vx * 1.5
    Y1 = ly + vy * 1.5


    .
  • Примеры и исходники
    Демка эффекта Lens Flare и исходными кодами на Visual Basic (~73KB)
    .
    Замечания
    Функция в моем примере не делает только одного - она не умеет увеличивать/уменьшать блики. Попробуйте осуществить это сами - вы получите определенное разнообразие и более впечатляющий внешний вид приложения. Если у вас есть какие-нибудь комментарии, конечно же присылайте их. Буду признателен.
    Copyright 2001 by AWDP

    .

    [вернуться в оглавление]

    TopList