Вычисление видимости объекта в 3D-сцене для использования в игровой логике /AI

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

Что мне нужно, это способ рассчитать, как условия освещения, где персонаж находится.

Идеальным было бы иметь

double getLightFactor(GameCharacter observer, GameCharacter target)

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

double getLightFactor(GameCharacter target)

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

double getLightFactor(int x, int z)

просто получить свет в определенной точке карты на местности.

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

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

Идеи, документы или что-то действительно очень важное приветствуется!

3 ответа

Решение

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

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

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

Как работает освещение? Это динамический или статический? Давайте предположим, что это комбинация обоих.

Для статического освещения, проверьте карту освещения поблизости. Это либо основанная на вершине, либо текстура, в любом случае, вы можете сэмплировать ее в нескольких точках поблизости и усреднить их. Посмотрите, как движок вычисляет освещение для моделей, покопайтесь в графическом коде и посмотрите, откуда на самом деле берутся данные, вы можете использовать один и тот же источник. В некоторых играх есть информация об объемном освещении, Quake 2 делает это отдельно для каждого листа в дереве BSP (легко проверить), а Quake 3 имеет объемные текстуры (также легко проверить).

Тогда вам нужно будет добавить динамические огни. Один из способов сделать это - направить лучи от игрока (вероятно, несколько разных лучей от разных частей проигрывателя) к источнику света. Подсчитайте, сколько ударов, и добавьте немного к своему номеру для каждого, в зависимости от того, как далеко свет. У всех приличных игровых движков есть процедура "стрелять лучом и смотреть, что он попадает", это то, как ИИ делают линию прямой видимости и как вы выясняете, какие пули попадают и что происходит, когда вы врезаетесь в стену. Не стреляйте слишком много лучей слишком далеко, потому что это может быть медленным.

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

В зависимости от сложности среды, вы можете обмануть и использовать 2D-карту освещения, наложенную на местности. Каждая ячейка будет иметь значение интенсивности света на основе близлежащих источников света. Было бы быстро рассчитать даже для движущихся объектов и быстро получить доступ, чтобы определить "темноту" местоположения.

Возможно, вам придется "штамповать" фигуры на нем, используя простые прямоугольные или круглые алгоритмы, в зависимости от типа источников света.

Другие вопросы по тегам