HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > Странности FGetNodeRoute
  Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
FreeSlave
Житель форума

Дата регистрации: Nov 2007
Проживает: Тула
Сообщений: 1028

Рейтинг



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:

Аттач

Вложение: noderoute.zip (10.0 кб)
Этот файл был скачан 3 раз.

__________________
I'm on github
I'm on Open Build Service
I'm on opendesktop.org
Про капибар и не только

Отредактировано FreeSlave 13-05-2022 в 18:11

Сообщить модератору | | IP: Записан
Сообщение: 209197

Старое сообщение 13-05-2022 18:08
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 33092
Нанёс повреждений: 504 ед.
Возраст: 35

Рейтинг



Награды
 
[1 награда]


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

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

__________________
Братские могилы переполнены,
Смерть серпом косила буйны головы.
Рваную рубаху пулями латай,
Топоры да плаха по дороге в рай!

Сообщить модератору | | IP: Записан
Сообщение: 209198

Старое сообщение 13-05-2022 18:27
-
FreeSlave
Житель форума

Дата регистрации: Nov 2007
Проживает: Тула
Сообщений: 1028

Рейтинг



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

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

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 Open Build Service
I'm on opendesktop.org
Про капибар и не только

Сообщить модератору | | IP: Записан
Сообщение: 209199

Старое сообщение 13-05-2022 18:29
- За что?
 Дядя Миша
who said meow?

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 29488
Нанёс повреждений: 389 ед.

Рейтинг



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

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

__________________
My Projects: download page

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

Цитата:

>> так а раньше почему падало ?
> Потому что говно ваш С++, вот почему

Сообщить модератору | | IP: Записан
Сообщение: 209200

Старое сообщение 13-05-2022 18:31
-
FreeSlave
Житель форума

Дата регистрации: Nov 2007
Проживает: Тула
Сообщений: 1028

Рейтинг



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

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

__________________
I'm on github
I'm on Open Build Service
I'm on opendesktop.org
Про капибар и не только

Сообщить модератору | | IP: Записан
Сообщение: 209201

Старое сообщение 13-05-2022 18:33
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 33092
Нанёс повреждений: 504 ед.
Возраст: 35

Рейтинг



Награды
 
[1 награда]


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

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

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

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

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

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

__________________
Братские могилы переполнены,
Смерть серпом косила буйны головы.
Рваную рубаху пулями латай,
Топоры да плаха по дороге в рай!

Сообщить модератору | | IP: Записан
Сообщение: 209202

Старое сообщение 13-05-2022 19:48
-
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 20:25. Новая тема    Ответить
  Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > Странности FGetNodeRoute
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

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