Есть танк, есть противник. Между ними стена закрывающая противника на 2/3. По идеи танк должен определить цель и произвести выстрел, но каким алгоритмом сделать проверку на видимость противника в данном случае?
Были такие варианты:
1. Использовать луч, который постоянно сканирует область вокруг танка в пределах зоны видимости. Т.е. вращаем луч на 1 градус вокруг Y, двигаем луч вверх и вниз в установленных пределах и пытаемся найти пересечения луча и цели.
2. Использовать OBB по направлению пушки, если цель пересекает его и между ними есть препятствие, пытаемся делить bounding box, ну предположим на 9 box'ов и их уже проверяем на пересечение с противником и преградой, если пересекает и противника и преграду - цель не видима в пределах этого бокса переходим к другому.
Вот пока такие варианты, но у каждого есть свои недостатки да к тому же оба достаточно затратны для использования в RTS.
Имхо первый вариант сойдет, только лучше определить для каждого типа юнита несколько точек ( например по уязвимым местам ), по которым потом делать raytrace. Чтобы не было затратно надо заюзать какой-нить space partition вроде octree.
fox06
Приблизительный способ:
Накидать точек по поверхности противника
Для точек, лежащих на гранях, обращенных нормалью в сторону танку, провести луч до глаза стрелка, сидящего в танке, если нет пересечений со стенами и луч попадает в его поле зрения (надо посчитать косинус угла) - цель видима
Нужно октодерево для эффективного поиска пересечений луча со стенами
Точный способ:
Отрендерить уровень с позиции танка (в текстуру низкого разрешения). Отрендерить с той же позиции игрока. Через Occlusion Culling узнать его видимость
Нужно октодерево для эффективного отсечения (Frustum Culling)
Подитожим:
1. В моем движке уже имеется октрии
2. Для юнита (например пехотинец) определяем 3 точки модели: Голова, торс, ноги
3. При входе пехотинца в зону действия пушки, лучем сканируем три точки модели пехотинца и определяем преграды на пути.
По поводу точного способа предложенного Aslan'ом. Не слишком ли затратно будет рендер в текстуру использовать , т.к. в игре планирую до 50 - 60 юнитов?
Спасибо за советы! А то по этой теме мало чего нашел даже в англоязычных интернетах
fox06
> Не слишком ли затратно будет рендер в текстуру использовать
Будет затратно, хотя малый размер текстуры и отсечение по фрустум возможно снизят нагрузку до приемлемой
Для этой же цели не помешала бы грубая модель уровня, ЛОД
Вернее ЛОД для кусков уровня, распиханных по октодереву, в идеале, сильно рендеринг ускорит
> определяем 3 точки модели: Голова, торс, ноги
трех точек маловато, если он краешком бока высунулся
ПРАВКА: Извиняюсь, я не верно прочитал 3D FPS )))
Для RTS такие заморочки излишне, если у вас поле из квадратов, хватит просто каждому ставить признак - видимо-невидимо и провести один луч алгоритмом Брезенхэма
Можно для большего сравнивать высоту препятствия и стоящего за ней пехотинца
Я бы не сказал что планирую полноценную стратегию, скорее имитация боевых действий на определенных территориях, как в тылу врага примерно, из этого следует что ближе стиль к action rts как про ВтВ пишут. Вокруг укрытий будут метки типа: укрытие сидя, укрытие лежа итд. Все таки остановлюсь на установке контрольных точек на модели, начну с 5: Верх (голова), низ (ноги), торс и бока )) если будет мало - добавлю. Назрел еще один вопрос, что если вместо укрытия типа стены или камня, враг скрылся за горкой которая частью ландшафта является? Ландшафт генерится из карты высот
Странно, но маловато книг и сайтов по программированию для стратегий, нашел одну книгу ну уж слишком там поверхностно. Может посоветует кто материальчик по теме?
fox06
У пехотинца и образчиков техники есть аттрибут рост (высота), прибавляется к высоте местности в данном квадрате
Чтобы определить видимость, проводите отрезок между стрелком и целью, алгоритмом Брезенхэма, считаете макс высоту пересеченных препятствий, если она больше высоты цели - цель не видна. Дешево и сердито )
2 точек более чем достаточно - голова, пузо. Рейтрейс с поверхностью земли нужно реализовать, без него никак. Quadtree по высотам ячеек и уточнение с треугольниками - проще всего и достаточно быстро.
fox06
> Есть танк, есть противник. Между ними стена закрывающая противника на 2/3. По
> идеи танк должен определить цель и произвести выстрел, но каким алгоритмом
> сделать проверку на видимость противника в данном случае?
> Были такие варианты:
> 1. Использовать луч, который постоянно сканирует область вокруг танка в
> пределах зоны видимости. Т.е. вращаем луч на 1 градус вокруг Y, двигаем луч
> вверх и вниз в установленных пределах и пытаемся найти пересечения луча и цели.
> 2. Использовать OBB по направлению пушки, если цель пересекает его и между ними
> есть препятствие, пытаемся делить bounding box, ну предположим на 9 box'ов и
> их уже проверяем на пересечение с противником и преградой, если пересекает и
> противника и преграду - цель не видима в пределах этого бокса переходим к
> другому.
> Вот пока такие варианты, но у каждого есть свои недостатки да к тому же оба
> достаточно затратны для использования в RTS.
А противник - тоже танк? Выступающая часть вообще уязвима с учётом ориентации и расстояния? От некоторых мест на танке снаряды могут и рикошетить. Может там самая крыша башни захваченного ИС-2, а ты на Т-34? Тогда стрелять бесполезно, снаряд броню иосифа под таким углом не пробъёт. Стрелять сквозь стену? А если она не пробиваема? Или сам противник уязвим только для кумулятивного снаряда? Ему надо сработать точно на броне, а не на стене. Или и стена пробиваема, и снаряд сойдёт бронебойный, но в сумме броня+стена не пробиваемы?
fox06
> Есть танк, есть противник. Между ними стена закрывающая противника на 2/3. По идеи танк должен определить цель и произвести выстрел, но каким алгоритмом сделать проверку на видимость противника в данном случае?
> Были такие варианты:
> 1. Использовать луч, который постоянно сканирует область вокруг танка в
> пределах зоны видимости. Т.е. вращаем луч на 1 градус вокруг Y, двигаем луч вверх и вниз в установленных пределах и пытаемся найти пересечения луча и цели.
> 2. Использовать OBB по направлению пушки, если цель пересекает его и между ними есть препятствие, пытаемся делить bounding box, ну предположим на 9 box'ов и их уже проверяем на пересечение с противником и преградой, если пересекает и
> противника и преграду - цель не видима в пределах этого бокса переходим к другому. Вот пока такие варианты, но у каждого есть свои недостатки да к тому же оба достаточно затратны для использования в RTS.
ИМХО вообще подход не правильный. У танка должен быть сектор обзора. И это т сектор обзора могут перекрывать здания, деревья.
asvp
> ИМХО вообще подход не правильный. У танка должен быть сектор обзора. И это т
> сектор обзора могут перекрывать здания, деревья.
Сектор обзора, дополнительно ограниченный препятствиями, как раз и есть зона видимости.
Тема в архиве.