HLFX.Ru Forum
Показать все 6 сообщений этой темы на одной странице

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- Странности FGetNodeRoute (https://hlfx.ru/forum/showthread.php?threadid=5841)


Отправлено FreeSlave 13-05-2022 в 18:08:

Post Странности FGetNodeRoute

Вопрос к тем, кто изучал работу поиска в нод графе.

Решил я как-то улучшить TASK_MOVE_AWAY_PATH у монстров-союзников (когда они отходят, если игрок старательно их толкает).

В дефолтной реализации первым делом там пробуется построить маршрут на 100 юнитов позади от монстра через MoveToLocation, тот в свою очередь приводит к вызову BuildRoute, который уже пробует три способа: построение прямого пути, триангуляцию и если не получилось, то поиск пути по нодам, через FGetNodeRoute.

Так вот, я заметил, что MoveToLocation возвращает успех, даже когда по логике он должен фейлится. А всё потому что FGetNodeRoute строит совершенно замечательные пути.

Чтобы посмотреть, что за путь получается, можно использовать существующую в HLSDK функцию DrawRoute в monsters.cpp, которая рисует пути лучами (возможно вам придется закомментировать #ifdef _DEBUG и соответствующий #endif). В самой функции нужно в двух местах увеличить время отображения лучей.

Заменяем

C++ Source Code:
WRITE_BYTE( 1 ); // life

на
C++ Source Code:
WRITE_BYTE( 50 ); // life


В функции BuildRoute в том же monsters.cpp, в условие с FGetNodeRoute добавляем вызов
C++ Source Code:
DrawRoute(pev, m_Route, m_iRouteIndex, 255, 0, 0);

Можно до вызова RouteSimplify или после - это не столь важно в нашем случае.

Вот что у меня получается, когда я пытаюсь толкнуть ученого (карта в аттаче):



Я всегда думал, что функция FGetNodeRoute строит пути только по нодам, а тут оказывается, она ещё и строит путь в стену и сквозь стены, и в итоге ещё считает, что всё в порядке. В чем тут подвох?

Добавлено 13-05-2022 в 21:08:

Аттач

__________________
I'm on github
I'm on opendesktop.org


Отправлено XaeroX 13-05-2022 в 18:27:

Цитата:
FreeSlave писал:
она ещё и строит путь в стену и сквозь стены, и в итоге ещё считает, что всё в порядке

Я с таким не сталкивался, хотя в волатиле юзаю халфовский нодеграф, адаптированный под произвольные хуллы. Вроде бы он всегда работает правильно.
У тебя колонна на скрине world?
Очень странный путь для human hull, он явно не пройдёт без триангуляции тут, выглядит как баг. Нужно смотреть NRP файл, почему для этого хулла есть коннекшен.

__________________

xaerox on Vivino


Отправлено FreeSlave 13-05-2022 в 18:29:

Окей, кажется, я нашёл, в чем проблема:

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

C++ Source Code:
1
if( iNumToCopy < ROUTE_SIZE )
2
{
3
  m_Route[iNumToCopy].vecLocation = vecDest;
4
  m_Route[iNumToCopy].iType |= bits_MF_IS_GOAL;
5
}


Можно здесь добавить проверку через CheckLocalMove конечно, но пока не знаю, приведет ли это к каким-то другим проблемам. К тому же, я здесь рассматриваю лишь частный случай. Вполне может быть ситуация, когда путь от ближайшего нода до места назначения построить можно, а вот до ближайшего нода - путь может быть прегражден (в этом примере хоть игрок и преграждает путь ученому во время "толкания", но путь всё равно строится). В итоге на результат MoveToLocation в if-else логике полагаться нельзя, если мы точно хотим знать, может ли монстр пройти в пункт назначения (и в случае провала попробовать другую стратегию).

__________________
I'm on github
I'm on opendesktop.org


Отправлено Дядя Миша 13-05-2022 в 18:31:

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

Исходя из вышесказанного, даже квака с её тупым рандомным выбором направления заставляет монстров зачастую выглядеть живее.
К тому же Кармак исходил из предположения, что Human Hull - это уже готовый навмеш, которому никакие костыли больше не требуются.
Но у Вальвовцев было иное мнение. То ли они не дотумкали как устроены клипхуллы, то ли ноды изначально делались именно как продвинутый аналог патч_корнеров (мы же помним, что в них есть хинты с проигрыванием анимаций, которые так никогда и не были заюзаны), но по факту система навигации в хл очень и очень странная.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено FreeSlave 13-05-2022 в 18:33:

Цитата:
XaeroX писал:
Очень странный путь для human hull, он явно не пройдёт без триангуляции тут, выглядит как баг. Нужно смотреть NRP файл, почему для этого хулла есть коннекшен.

Видимо дело в том, что для первого нода в пути точно так же не делается настоящая проверка.
Хмм, а ведь проверка прохождения монстра до первого нода в пути, и от последнего нода в пути до пункта назначения - это наверно и есть решение.

__________________
I'm on github
I'm on opendesktop.org


Отправлено XaeroX 13-05-2022 в 19:48:

Цитата:
FreeSlave писал:

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

Цитата:
FreeSlave писал:
Видимо дело в том, что для первого нода в пути точно так же не делается настоящая проверка.

А, ну это да, потому что стартовая и финальная (кроме move_to_node) точки не являются частью графа.
CheckLocalMove у тебя сделает проверку уже в процессе перемещения по маршруту, и если надо - триангулирует. Ну или перестроит маршрут заново.
Функция построения пути вообще не проверяет ничего в реальном времени, пути там предрассчитаны. Ну максимум проверяют на предмет открытой-закрытой двери (чтобы монстр не тратил время и не шёл через пол-карты поцеловать замок, а сразу искал альтернативный маршрут). А всякие препятствия это уже в процессе движения проверяются.
Цитата:
FreeSlave писал:
итоге на результат MoveToLocation в if-else логике полагаться нельзя, если мы точно хотим знать, может ли монстр пройти в пункт назначения

Конечно нельзя. Эта функция лишь сообщает, есть ли такой маршрут в теории. На бумаге, так сказать, без учёта оврагов.
Цитата:
Дядя Миша писал:
Я-то думал, что ноды - оно скорее для ориентира

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

__________________

xaerox on Vivino


Временная зона GMT. Текущее время 00:46.
Показать все 6 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024