Точечное освещение

Темы, связанные с проектированием и программированием roguelike-игр

Модераторы: Sanja, Максим Кич

Ответить
Аватара пользователя
Максим Кич
Администратор
Сообщения: 1560
Зарегистрирован: 03 дек 2006, 20:17
Откуда: Витебск, Беларусь
Контактная информация:

Точечное освещение

Сообщение Максим Кич » 14 сен 2007, 21:51

Проблема, поднятая ADB, навела на некоторые мысли.

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

Я несколько повторюсь, чтобы не отсылать в соседний раздел за сутью проблемы. Тайл (или клетка, не суть важно) является, в некотором роде, парадоксальным объектом. С одной стороны, визуально, он представляется (и отрисовывается) квадратом (или, чаще прямоугольником, но это уже мелочи). С другой стороны, математически он представляет из себя точку, поскольку фактически не имеет линейных размеров. Линейные размеры есть только у графического изображения (символа, либо растра), с помощью которых мы можем увидеть тайл на экране.

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

Но с точечным освещением этот фокус не прокатывает. Свет, сцуко, материя тонкая, и даже в нашем вырожденном случае он норовит проявить всю сволочность корпускулярно-волнового дуализма.

Посему, если брать для расчёта освещения в точности такой же алгоритм, который использует лось, то мы напоремся на весьма неприятную ситуацию:

Код: Выделить всё

.......
...#...
.*.#.@.
...#...
.......
.......
...#...
Стены между источником света * и персонажем @ для персонажа окажутся освещёнными, чего в природе быть не может.

В трёхмерной графике для подобных целей используются нормали. Но там, по крайней мере, есть к чему эти нормали проводить. А нормаль к точке, каковой является тайл — это нонсенс.

С другой стороны, трёхмерное пространство можно условно считать непрерывным, а рогалик дискретен по определению. И, более того, атомы этого дискретного пространства являются квадратами. Отсюда мы и будем плясать.

Допустим, тайл имеет четыре «плоскости», которые рассеивают падающий на них свет на 180 градусов. Тогда, логично будет предположить, что источник света и наблюдатель должны находиться по одну сторону рассеивающей плоскости, чтобы видеть тайл освещённым. Рассмотрим взаимное расположение источника света и тайла. Мы имеем восемь различных случаев:

Код: Выделить всё

111152222
111152222
111152222
111152222
8888#6666
444473333
444473333
444473333
444473333
Свет из источников, находящихся в квадрантах 1—4 падает сразу на две рассеивающих плоскости. Соответственно, например, для источника света в квадранте 1 должен находиться в одном из квадрантов 1,2,4 или на одной из линий 5 и 8.

В случае нахождения источника света на линиях 5—8, свет падает только на одну плоскость, и, соответственно, тайл виден освещённым только на линии, содержащей источник света и из квадрантов, непосредственно с ней граничащих. Например, для линии 5 — линия 5 и квадранты 1,2.

И второе условие: чтобы видеть плоскость освещённой, мы должны видеть саму плоскость, что не тождественно видимости целого тайла.

Впрочем, здесь всё просто. Отражающая плоскость элементарно находится из взаимного расположения тайла, источника света и наблюдателя. Тогда, тайл, примыкающий к этой плоскости, должен быть прозрачным.

При выполнении двух условий, а также при расчёте лосей для источника света и наблюдателя, видимость должна определяться однозначно и для всех случаев.

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

Вполне вероятно, что в процессе реализации, алгоритм потребует некоторой доработки. Возможно Брезенхем в лосе поведёт себя не совсем так, как мне бы этого хотелось, но уже час ночи и я не совсем трезв, так что продолжение эпопеи с точечным освещением последует чуть позже.
Dump the screen? [y/n]

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 13 гостей