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

StackOverflow https://stackoverflow.com/questions/924761

Вопрос

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

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

В идеале было бы иметь

double getLightFactor(GameCharacter observer, GameCharacter target)

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

double getLightFactor(GameCharacter target)

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

double getLightFactor(int x, int z)

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top