ПрограммированиеФорумИгровая логика и ИИ

Обнаружение противника за препятствием 3D RTS

#0
3:11, 5 июля 2012

Есть танк, есть противник. Между ними стена закрывающая противника на 2/3. По идеи танк должен определить цель и произвести выстрел, но каким алгоритмом сделать проверку на видимость противника в данном случае?
Были такие варианты:
1. Использовать луч, который постоянно сканирует область вокруг танка в пределах зоны видимости. Т.е. вращаем луч на 1 градус вокруг Y, двигаем луч вверх и вниз в установленных пределах и пытаемся найти пересечения луча и цели.
2. Использовать OBB по направлению пушки, если цель пересекает его и между ними есть препятствие, пытаемся делить  bounding box, ну предположим на 9 box'ов и их уже проверяем на пересечение с противником и преградой, если пересекает и противника и преграду - цель не видима в пределах этого бокса переходим к другому.

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

#1
5:01, 5 июля 2012

Имхо первый вариант сойдет, только лучше определить для каждого типа юнита несколько точек ( например по уязвимым местам ), по которым потом делать raytrace. Чтобы не было затратно надо заюзать какой-нить space partition вроде octree.

#2
9:16, 5 июля 2012

fox06
Приблизительный способ:
Накидать точек по поверхности противника
Для точек, лежащих на гранях, обращенных нормалью в сторону танку, провести луч до глаза стрелка, сидящего в танке, если нет пересечений со стенами и луч попадает в его поле зрения (надо посчитать косинус угла) - цель видима
Нужно октодерево для эффективного поиска пересечений луча со стенами

Точный способ:
Отрендерить уровень с позиции танка (в текстуру низкого разрешения). Отрендерить с той же позиции игрока. Через Occlusion Culling узнать его видимость
Нужно октодерево для эффективного отсечения (Frustum Culling)

#3
15:10, 5 июля 2012

Подитожим:
1. В моем движке уже имеется октрии
2. Для юнита (например пехотинец) определяем 3 точки модели: Голова, торс, ноги
3. При входе пехотинца в зону действия пушки, лучем сканируем три точки модели пехотинца и определяем преграды на пути.

По поводу точного способа предложенного Aslan'ом. Не слишком ли затратно будет рендер в текстуру использовать  , т.к. в игре планирую до 50 - 60 юнитов?

Спасибо за советы! А то по этой теме мало чего нашел даже в англоязычных интернетах

#4
15:16, 5 июля 2012

fox06
> Не слишком ли затратно будет рендер в текстуру использовать
Будет затратно, хотя малый размер текстуры и отсечение по фрустум возможно снизят нагрузку до приемлемой
Для этой же цели не помешала бы грубая модель уровня, ЛОД
Вернее ЛОД для кусков уровня, распиханных по октодереву, в идеале, сильно рендеринг ускорит

> определяем 3 точки модели: Голова, торс, ноги
трех точек маловато, если он краешком бока высунулся

ПРАВКА: Извиняюсь, я не верно прочитал 3D FPS )))
Для RTS такие заморочки излишне, если у вас поле из квадратов, хватит просто каждому ставить признак - видимо-невидимо и провести один луч алгоритмом Брезенхэма
Можно для большего сравнивать высоту препятствия и стоящего за ней пехотинца

#5
21:25, 6 июля 2012

Я бы не сказал что планирую полноценную стратегию, скорее имитация боевых действий на определенных территориях, как в тылу врага примерно, из этого следует что ближе стиль к action rts как про ВтВ пишут. Вокруг укрытий будут метки типа: укрытие сидя, укрытие лежа итд. Все таки остановлюсь на установке контрольных точек на модели, начну с 5: Верх (голова), низ (ноги), торс и бока )) если будет мало - добавлю. Назрел еще один вопрос, что если вместо укрытия типа стены или камня, враг скрылся за горкой которая частью ландшафта является? Ландшафт генерится из карты высот

Странно, но маловато книг и сайтов по программированию для стратегий, нашел одну книгу ну уж слишком там поверхностно. Может посоветует кто материальчик по теме?

#6
19:20, 7 июля 2012

fox06
У пехотинца и образчиков техники есть аттрибут рост (высота), прибавляется к высоте местности в данном квадрате
Чтобы определить видимость, проводите отрезок между стрелком и целью, алгоритмом Брезенхэма, считаете макс высоту пересеченных препятствий, если она больше высоты цели - цель не видна. Дешево и сердито )

#7
19:57, 7 июля 2012

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

#8
21:43, 21 июля 2012

fox06
> Есть танк, есть противник. Между ними стена закрывающая противника на 2/3. По
> идеи танк должен определить цель и произвести выстрел, но каким алгоритмом
> сделать проверку на видимость противника в данном случае?
> Были такие варианты:
> 1. Использовать луч, который постоянно сканирует область вокруг танка в
> пределах зоны видимости. Т.е. вращаем луч на 1 градус вокруг Y, двигаем луч
> вверх и вниз в установленных пределах и пытаемся найти пересечения луча и цели.
> 2. Использовать OBB по направлению пушки, если цель пересекает его и между ними
> есть препятствие, пытаемся делить  bounding box, ну предположим на 9 box'ов и
> их уже проверяем на пересечение с противником и преградой, если пересекает и
> противника и преграду - цель не видима в пределах этого бокса переходим к
> другому.
> Вот пока такие варианты, но у каждого есть свои недостатки да к тому же оба
> достаточно затратны для использования в RTS.
А противник - тоже танк? Выступающая часть вообще уязвима с учётом ориентации и расстояния? От некоторых мест на танке снаряды могут и рикошетить. Может там самая крыша башни захваченного ИС-2, а ты на Т-34? Тогда стрелять бесполезно, снаряд броню иосифа под таким углом не пробъёт. Стрелять сквозь стену? А если она не пробиваема? Или сам противник уязвим только для кумулятивного снаряда? Ему надо сработать точно на броне, а не на стене. Или и стена пробиваема, и снаряд сойдёт бронебойный, но в сумме броня+стена не пробиваемы?

#9
1:44, 23 июля 2012

fox06
> Есть танк, есть противник. Между ними стена закрывающая противника на 2/3. По идеи танк должен определить цель и произвести выстрел, но каким алгоритмом сделать проверку на видимость противника в данном случае?
> Были такие варианты:
> 1. Использовать луч, который постоянно сканирует область вокруг танка в
> пределах зоны видимости. Т.е. вращаем луч на 1 градус вокруг Y, двигаем луч вверх и вниз в установленных пределах и пытаемся найти пересечения луча и цели.
> 2. Использовать OBB по направлению пушки, если цель пересекает его и между ними есть препятствие, пытаемся делить  bounding box, ну предположим на 9 box'ов и их уже проверяем на пересечение с противником и преградой, если пересекает и
> противника и преграду - цель не видима в пределах этого бокса переходим к другому. Вот пока такие варианты, но у каждого есть свои недостатки да к тому же оба достаточно затратны для использования в RTS.
ИМХО вообще подход не правильный. У танка должен быть сектор обзора. И это т сектор обзора могут перекрывать  здания, деревья.

#10
8:57, 31 июля 2012

asvp
> ИМХО вообще подход не правильный. У танка должен быть сектор обзора. И это т
> сектор обзора могут перекрывать  здания, деревья.
Сектор обзора, дополнительно ограниченный препятствиями, как раз и есть зона видимости.

ПрограммированиеФорумИгровая логика и ИИ

Тема в архиве.