Предыдущие части: Кривые, Твининг
Ранее мы сделали перемещение светлячков по криволинейным траекториям. Теперь я хочу добавить эффект глубины резкости.
Светлячки будут также двигаться по координате z, то есть ближе-дальше.
Глубина резкости это оптический эффект, возникающий, когда объектив камеры сфокусирован на определённую дистанцию. Все объекты, которые находятся на этой дистанции (плюс-минус), выглядят резко, а те, которые дальше или ближе, расплываются. Данный эффект во многом зависит от характеристик объектива и текущих настроек камеры, но мы не будем их моделировать, а применим простую пропорцию.
Особенно заметен эффект глубины резкости на точечных источниках света. Например, если огоньки ёлочной гирлянды попадают в глубину резкости, то мы видим их как яркие, чёткие точки. А если они находятся не в фокусе, то становятся расплывчатыми кругами, которые увеличиваются в размере и теряют яркость.
А чем являются светлячки, как не точечными источниками света?
Изменения будут очень просты:
- Добавить в твины координату z
- Светлячков рисовать теперь не квадратиками, а кружочками
- Изменять размер и прозрачность кружочка в завимости от глубины z. Чем дальше он находится – тем он тусклее и больше
Я также решил добавить эффект параллакса в надежде на то, что всё вместе будет выглядеть более реалистично. Параллакс мы уже рассматривали: Звёзды, Дождь, Снег, Скроллинг. И я просто взял код из примера со снегом. Ведь по сути там уже всё готово. Каждая снежинка может считаться светлячком, нужно только её перекрасить и изменить поведение, чтобы она не падала, а летала. Ну а код для поведения, то есть твининг, я взял из текущих светлячков, добавив в него координату z.
Так как и то и другое уже проходили, я не буду расписывать весь код. Посмотреть его можно онлайн по ссылке.
Что мы тут имеем: размер кружка и интенсивность цвета рассчитываются как пропорция от z. При этом интенсивность это прозрачность. Чем дальше светлячок, тем более прозрачен его кружок.
Параллаксное смещение помогает расставить акценты по глубине: более дальние светлячки визуально движутся более медленно.
Кроме того, я добавил в код сортировку пузырьком по координате z, чтобы сначала рисовались более дальние светлячки, а потом ближние. С учётом прозрачности это не имеет значения, так как в данном случае наложение прозрачных объектов работает правильно в любом порядке. Но если убрать прозрачность и регулировать интенсивность чисто цветом, то сразу будет заметно, что без сортировки всё рисуется неправильно.
В целом оно выглядит неплохо, но мне не всё нравится. Не хватает какой-то финальной, законченной реалистичности. Вероятно потому, что размер и интенсивность круга рассчитываются простой пропорцией, а не исходя из оптических законов. Надо подумать, как это улучшить.