Вы видели когда-нибудь, какие симпатичные круги появляются на изображении, получаемом с помощью камеры
если в поле ее зрения попадает ярко светящийся объект? Этот эффект вызван преломлением света в каждой из
линз и выглядит примерно так (картинка взята из моего приложения-примера к данной статье):
Итак, несмотря на то, что пример сам по себе довольно убог (каюсь ;), он довольно зрелищен. Исходя из него
рассмотрим, как же создавать этот спецэффект.
.
Создание спецэффекта
Для создания бликов на линзах (я буду использовать псевдокод) вам необходимо иметь следующие картинки
(хотя я бы в силу корявости этих создал бы свои ;) ):
Зачем нам координаты центра экрана? Дело в том, что ВСЕ блики расположены ВСЕГДА на одной линии
проходящей через центр экрана и соединяющей источник света с этим центром. Найдем вектор, соответствующий этой линии:
vx = cx - lx
vy = cy - ly.
Итак, а теперь идет самое легкое: чтобы получить экранные координаты блика X1,Y1 нам остается
только разделить (умножить) координаты вектора на необходимые смещения:
X1 = lx + vx / dx
Y1 = ly + vy / dy,
и пересчитать координату, учитывая размер рисунка:
X1 = X1 - ШиринаКаринки / 2
Y1 = Y1 - ВысотаКаринки / 2.
Далее следует вывод на экран - тут уже можно воспользоваться или просто выводом картинки в нужной позиции
или же созданием полигонов с текстурами бликов и повернутыми к пользователю.
А теперь я приведу значения dx и dy, использованные в приложении-примере для вывода каждого из бликов.
Функция в моем примере не делает только одного - она не умеет увеличивать/уменьшать блики. Попробуйте
осуществить это сами - вы получите определенное разнообразие и более впечатляющий внешний вид приложения.
Если у вас есть какие-нибудь комментарии, конечно же присылайте их. Буду признателен.