Я нахожусь в процессе написания изометрической игры с нуля, и я хотел бы знать, как / если я могу добавить свет и тени.
Код, который у меня есть, можно найти здесь , но этого должно быть достаточно, чтобы знать, что прямо сейчас карты представляют собой простые трехмерные массивы значений true / false . Вот снимок окружающей среды:
Если бы это был однослойный тайлкарт, он был бы прямым. Я могу понять простой Raycasting в 2d, что требуется.
Однако, учитывая, что мои карты имеют несколько уровней высоты, а также области, похожие на пещеры, я не знаю, как сделать убедительные тени для этого. Возможно, решение для каждого блока является единственным реалистичным способом?
Ответы:
Могу ли я рекомендовать, чтобы сначала работали 2d тени, даже если это только для уровня, на котором сейчас находится ваш аватар. Будет проще начать смотреть на код таким образом и заставить его работать.
Я реализовал тени в двухмерных картах плитки несколькими способами. Один метод теневого вещания, который я нашел описанным Эриком Липпертом в Microsoft, работает довольно хорошо.
И другой способ, который я сделал сам в первый раз, когда я посмотрел на подобные вещи, состоял в том, чтобы ортогонально подметать видимые плитки и края плиток и генерировать края (и, возможно, углы iirc), описывающие сцену с наименьшим числом ребер. Затем вы можете отбраковывать скрытые края и формировать любые пользовательские функции затенения, такие как утопленные тени, если вы хотите показать немного стены. Затем создайте свою геометрию тени (проективное отбрасывание теней?) И визуализируйте ее поверх.
Но если я попытаюсь перенести эту идею в 3d, то в 3d станет проще. В то время как метод, описанный Эриком Липпертом, можно предположительно преобразовать в 3d. Но я думаю, вы обнаружите, что делать это в 3d дорого. Возможно, взгляните на исходный код для Brogue . Это может иметь более эффективную реализацию для 2d видимости / отбрасывания теней.
Удачи.
источник