Guest3d.ru
некоммерческий проект, цель которого объединить профессионалов для обмена опытом и знаниями в области real-time рендеринга
guest3d
3.07: Программирование: Поиск пути (Pathfinding)

В виртуальные миры может быть привнесена жизнь с помощью добавления прогуливающихся персонажей или перемещающихся автомобилей. Они могут быть анимированы заранее, но иногда требуются более гибкие решения. Персонажи должны остановиться перед светофором, открывающимся мостом или взаимодействовать друг с другом. Поиск пути Pathfinding позволяет планировать подобные действия.

Поиск пути зависит от ряда путевых точек (waypoints), или ‘узлов’, расставленных в виртуальном окружении. Объекты могут быть направлены к этим узлам напрямую, или через структуру путей. Особенно при сложном окружении, важна правильная настройка структуры пути.

В Quest3D, поиск пути управляется с помощью двух каналов. Первый из них - 3D Graph (3D график), который содержит всю информацию об узлах и структуре пути. Второй - канал Motion Planning (планирование движения), просчитывающий самый быстрый маршрут в структуре пути от текущей позиции до точки назначения.

Канал 3D Graph
Узлы 3D Graph должны быть нарисованы на коллизионном объекте. Этот коллизионный объект может быть подключен к первому потомственному входу канала 3D Graph. Второй потомственный вход канала 3D Graph также ожидает канал коллизионного объекта Collision Object. Этот объект используется для определения линии взгляда при просчете пути.

Эти два коллизионных объекта могут быть одни и тем же. В любом случае, рекомендуется создавать их из как можно меньшего количества полигонов. Обычно это означает создание упрощенной версии 3D модели с целью коллизии.

Канал Motion Planning (Планирование Движения)
Канал Motion Planning имеет четыре потомственных входа.

Первый потомственный вход требует текущую позицию объекта при поиске пути. Второй представляет позицию пункта назначения. Третий - диапазон следующего узла ‘Next node range’. Если объект передвигается в пределах дистанции любого заданного узла, он будет следить за следующим узлом в просчитанном маршруте. Четвертый - 3D Graph, содержащий всю информацию об узлах и пути.

Позиция узла может быть запрошена с помощью канала Get Motion Planning Info Vector. Он требует канал Motion Planning в качестве первого потомка. Вторым потомком является Value, определяющее, какой узел графа 3D Graph будет возвращен.

Объект с поиском пути может продвигаться вперед к своей цели. Смотрите Раздел 3.6 для более детальной информации по перемещению объектов с помощью векторов.

Внешний вид Раздела Поиска Пути (Pathfinding Section Layout)

Узлы и пути могут быть размещены и стерты в разделе Nature / Pathfinding в Quest3D.

Урок
Следующее упражнение позволит анимированному персонажу найти путь между несколькими путевыми точками городской сцены.

Необходимая сцена Quest3D:
..\Tutorials\3.7 – Pathfinding\Pathfinding.cgr
Необходимые шаблоны
Logic \Pathfinding \ 3D Graph
Objects \Collision \ Collision Object
Logic \ Pathfinding \ Motion Planning
Logic \ Pathfinding \ Motion Planning Info Vector
Variables \ Value \ Value
Variables \ Matrix \ Matrix Operator
Variables \ Arrays \ Array Value
Variables \ Arrays \ Array Table
Variables \ Value \ Set Value

Шаг за шагом:

  • Откройте файл ‘Pathfinding.cgr’. Он содержит сцену небольшого городского блока, персонаж с множеством анимаций и настройкой коллизии, а также камера, которая следует за персонажем.
  • Добавьте канал 3D Graph и подключите его к каналу ‘Pathfinding’.
  • Перетяните Collision Object в Граф Каналов и подключите его к первому потомственному входу канала ‘3D Graph’.
  • Создайте ярлык канала ‘Street’ и подключите его к каналу ‘Collision Object’. 3D Graph теперь готов к рисованию узлов.
  • Перейдите в раздел Природы/Поиска пути (Nature / Pathfinding) и нажмите на закладку ‘Pathfinding Graph’.
  • Нажмите на ‘3D Graph’, чтобы выбрать его.
  • Нажмите кнопку ‘Paint’ (рисовать) для входа в режим рисования.
  • Переместите указатель мыши в обзорный вид Animation 3D View. Обратите внимание на красный круглый маркер. Это курсор рисования узлов.
  • В окружении городского блока найдите здание из красного кирпича и разместите узел напротив одной из дверей, нажав левой клавишей мыши на тротуар. От узла к текущей позиции курсора рисования будет протянута линия. Разместите другой узел на расстоянии нескольких метров, но в пределах тротуара. Линия все еще связывает два узла, а с текущей позицией курсора рисования связана новая. Нажмите правую клавишу мыши, чтобы прервать рисование.
  • Разместите еще несколько узлов в городской сцене. По возможности поддерживайте чистоту 3D Graph. Примером правильного графика может быть виден на изображении ниже.
  • Когда будете готовы, нажмите кнопку ‘Idle’ для выхода из режима рисования узлов. Обратите внимание, что Graph исчез.
  • Пометьте бокс ‘Keep showing graph’ для активации режима постоянной видимости графика.

  • Перейдите в Раздел Каналов.
  • Добавьте канал Motion Planning.
  • Создайте ярлык канала ‘AI Character Position’ и подключите его к первому потомственному входу ‘Motion Planning’.
  • Перетяните Motion Planning Info Vector в Граф Каналов и подключите его ко второму потомственному входу канала ‘Motion Planning’.
  • Создайте ярлык канала ‘Motion Planning’ и подключите его к первому потомственному входу канала ‘Motion Planning Info Vector’.
  • Добавьте значение Value и подключите его к третьему потомственному входу ‘Motion Planning’. Смените его значение на ‘0.1’.
  • Создайте ярлык канала ‘3D Graph’ и подключите его к четвертому потомственному входу канала ‘Motion Planning’.
  • Перетяните Matrix Operator в Граф Каналов и подключите его к потомственному входу ‘Look At Matrix’ канала ‘AI Character Motion’. Дважды щелкните по нему и из выпадающего списка выберите ‘Create Translation maxtrix (vector)’ (создать матрицу перемещения). Закройте окно.
  • Подключите канал ‘Motion Planning’ к каналу ‘Create Translation matrix (vector)’. Обратите внимание, что персонаж теперь смотрит на узел под номером ‘0’.
  • Перетяните канал Array Table и создайте таблицу с именем WayPoints (точки пути).
  • Нажмите на закладку менеджера массивов ‘Array Manager’ и нажмите Add column (добавить столбец), назовите его Destination.
  • Нажмите закладку ‘Channel Graph’.
  • Добавьте канал Array Value, в качестве таблицы используйте WayPoints, а в качестве столбца (Column) - ‘Destination’. Подключите канал ко второму потомственному входу ‘Motion Planning Info Vector’.
Смотрите Раздел 3.4 для дополнительной информации
по массивам (arrays).
  • Нажмите на закладку ‘Array Manager’.
  • Создайте дополнительные поля от 1 до 5. Изучите ваш 3D Graph и введите номера нескольких интересных узлов. Точек пути (Waypoints).
  • Нажмите на закладку ‘Channel Graph’.
  • Создайте ярлык для канала ‘Current Destination’ и подключите его к массиву ‘Destination’.

  • Перейдите в Раздел Анимации.
  • Переключитесь в Run Mode.
  • Протестируйте сцену на данный момент, нажав клавишу ‘1’. Персонаж должен перейти к узлу, соответствующему полю ‘1’ в массиве. Обратите внимание, что по прибытию персонаж не останавливается автоматически.
  • Переключитесь в Edit Mode.
  • Перейдите в Раздел Каналов.
  • Создайте ярлык для канала ‘AI Character Position’ и подключите его к первому потомственному входу канала ‘Get Vector’ под каналом ‘Arrival Trigger’.
  • Создайте ярлык канала ‘Motion Planning’ и подключите его ко второму потомственному входу канала ‘Get Vector’.
  • Создайте ярлык канала ‘AI Character Speed’ и подключите его ко второму потомственному входу канала ‘Set Value’.
  • Перейдите в Раздел Анимации.
  • Переключитесь в Run Mode.
  • Протестируйте сцену на данный момент, нажимая клавиши от ‘1’ до ‘5’. Обратите внимание, что персонаж передвигается вперед к соответствующим узлам и останавливается по прибытию.
  • Завершенная версия этого урока содержит дополнительную логику для ограничения движений персонажа. Когда будете готовы, откройте файл и изучите его структуру.

Законченная сцена:
..\Tutorials\3.7 – Pathfinding\Pathfinding – Complete.cgr

Если у вас есть материалы, или вы хотите дополнить существующие, если вы хотите писать новости относящиеся к технологиям реалтайм рендеринга, или имеете полезные файлы, вы можете стать резидентом Guest3D.ru. Для этого нужно написать письмо в свободной форме на admin@guest3d.ru, с указанием вашей мотивации. Кроме того, каждый резидент получает возможность создать свою страницу, ссылка на которую будет прикреплена к каждому опубликованному вами материалу.
вход