Как я могу реализовать источники света и тени в многослойном 2d файле карты?

11

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

Код, который у меня есть, можно найти здесь , но этого должно быть достаточно, чтобы знать, что прямо сейчас карты представляют собой простые трехмерные массивы значений true / false . Вот снимок окружающей среды:Снимок экрана многослойной карты тайлов

Если бы это был однослойный тайлкарт, он был бы прямым. Я могу понять простой Raycasting в 2d, что требуется.

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

Дэни Клоусон
источник
Вы ищете предварительно запеченное или динамически генерируемое освещение? Являются ли «пещерные зоны» обрезанными, если игрок входит, или свет должен учитывать потолок? Ожидаете ли вы, что каждый тайл будет бинарным или темным, или будет иметь какую-то дробную стоимость?
Анко
1
@Anko Я бы предпочел что-то дробное, например 0 - 1.1 (для слишком ярких областей, таких как взрывы и т. Д.), Но это могло бы быть просто на основе блоков, без реальной интерполяции или чего-либо подобного. Я действительно хочу, чтобы он был динамичным и поддерживал несколько источников света. И хотя «пещерные» / крытые участки будут показаны в разрезе, алгоритм должен учитывать блоки, не показанные при расчете света. Например, если вы идете по дому, блоки крыши исчезнут, но внутри все равно должно быть затенено.
Дани Клоусон,
Если вы ищете такое решение с пещерами и высотой, кажется, у вас нет ничего 2D. Вы, вероятно, ищете полное трехмерное решение, даже если камера всегда смотрит в направлении на север-45º вниз. Вы должны смотреть на технику, как трафарет-тень или подобное.
Адриан Мэйр
Во-вторых, @AdrianMaire, вам нужно будет сделать правильные трехмерные вычисления, но сделать несколько ярлыков, если нет интерполяции по граням «плитки». Если вы не выполняете интерполяцию, вы можете использовать лучи.
NeomerArcana
У меня сейчас нет места для разума, чтобы переварить его в ответ, но я только что наткнулся на это сообщение в блоге об определении прямой видимости для карты высот местности . Это звучит так же, как то, что вы ищете.
Анко

Ответы:

1

Могу ли я рекомендовать, чтобы сначала работали 2d тени, даже если это только для уровня, на котором сейчас находится ваш аватар. Будет проще начать смотреть на код таким образом и заставить его работать.

Я реализовал тени в двухмерных картах плитки несколькими способами. Один метод теневого вещания, который я нашел описанным Эриком Липпертом в Microsoft, работает довольно хорошо.

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

Но если я попытаюсь перенести эту идею в 3d, то в 3d станет проще. В то время как метод, описанный Эриком Липпертом, можно предположительно преобразовать в 3d. Но я думаю, вы обнаружите, что делать это в 3d дорого. Возможно, взгляните на исходный код для Brogue . Это может иметь более эффективную реализацию для 2d видимости / отбрасывания теней.

Удачи.

Гэвин Уильямс
источник