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

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

Мне нужен способ расчета условий освещения, в которых находится персонаж.

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

double getLightFactor(GameCharacter observer, GameCharacter target)

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

double getLightFactor(GameCharacter target)

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

double getLightFactor(int x, int z)

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 29 мая 2009

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

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

0 голосов
/ 27 июня 2009

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

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

0 голосов
/ 29 мая 2009

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

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

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

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

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

...