Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Серия уроков по CS3 - Автор и Перевод серии Але...doc
Скачиваний:
4
Добавлен:
14.08.2019
Размер:
2.62 Mб
Скачать

Применение визуальной подсказки

Для настройки параметров обратной связи делегатов иногда желательно получить представление о том, почему делегаты ведут себя именно так. С этой целью применяются визуальные подсказки об активности и параметрах, зависящих от расстояния.

  1. В свитке Avoid Behavior включите Hard Radius и Display Repel Radius.

Вокруг каждого делегата появятся каркасные сферы, показывающие соответствующие радиусы (жесткий и отталкивающий)

  1. Выключите Display Hard Radius и Display Repel Radius, чтобы избежать загромождения картины.

  2. В свитке Avoid Behavior, группе Display During Solve включите Potential Collision, Repel Activity и Look Ahead Radius.

  3. Проведите моделирование

Во время моделирования белые линии показывают определение вероятного столкновения, цветные линии – отталкивающую активность, а сферы – радиусы обзора. Последнее доступно только во время моделирования, так как рассчитывается, исходя из установки Look Ahead и текущей скорости делегата.

 

Настройка поведения

Делегаты избегают друг друга, поскольку установка Look Ahead задает каждому делегату количество кадров, на которые он рассчитывает вперед поведение других делегатов, что и позволяет ему избежать столкновения. По умолчанию эта установка равна 30. Делегаты будут подходить друг к другу ближе, если это значение уменьшить.

  1. Установите Look Ahead равным 3.

  2. Запустите моделирование.

На этот раз делегаты не будут уступать друг другу дорогу издалека. Фактически, Вы можете увидеть и некоторые столкновения, поскольку малое значение Look Ahead не дает им времени начать разворот, чтобы избежать удара. Наилучшее значение для поведения Avoid, как и для других поведений определяется исходя из ситуации методом проб и ошибок.

 

Изменение поведения

Далее Вы заставите делегатов перестать стремится к кубику, и начать движение назад, когда они подойдут к нему достаточно близко. Вы можете сделать это, назначив существующее поведение Repel команде Seek Team, и активировав его в том же кадре, в котором отмените поведение Seek.

Сначала просмотрим анимацию, чтобы определить, когда менять поведение.

1.      Перемещая ползунок взад и вперед, найдите кадр, в котором делегаты подходят ближе всего к кубику.

Выберите кадр возле семидесятого.

2.      Переместите ползунок назад к кадру 0 и включите кнопку Animate.

3.      Откройте диалог Behavior Assignments и назначьте Repel Behavior команде Seek Team.

4.      В списке Behavior Assignments нажмите левую кнопку мыши на пункте Seek Team Repel Behavior.

Соответствующий пункт в группе Assignment Design выделится и элементы интерфейса внизу группы Behavior Assignments станут доступны.

5.      Внизу группы Behavior Assignments выключите флажок Active.

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

6.      Переместите ползунок в кадр 70.

7.      Включите флажок Active для назначения Seek Team Repel Behavior, затем выберите назначение Seek Team Repel Behavior и отключите для него флажок Active.

8.      Перемещая ползунок взад и вперед возле кадра 70, наблюдая за списком Behavior Assignment.

В то время как поведение Repel включается, поведение Seek отключается.

9.      Закройте диалог и выключите анимацию.

10.  Запустите моделирование.

В кадре 70 делегаты перестанут двигаться к кубику и начнут двигаться от него.

Для более плавного изменения можно анимировать установку Weight. Она управляет степенью влияния поведения на делегата и может находится в диапазоне от 0.0 до 1.0.

Урок 8.4: Добавление логики к поведению группы

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

Для сложных ситуаций Вы можете назначить распознающий контроллер делегатам и командам. Распознающий контроллер может иметь несколько состояний. Каждое состояние может содержать одно или несколько поведений, каждое со своим весом. Вы определяете состояние как диаграмму и связываете его с алгоритмом изменения. Алгоритм изменения использует язык Max Script, чтобы определить, когда одно состояние передаст управление другому.

В этом уроке мы используем распознающий контроллер, чтобы изменить поведение команды с Seek на Repel при подходе делегата к кубику.

 

Установка поведения

  1. Откройте файл, который Вы сохранили в середине урока 2 (cs_tut08_lesson4a.max) или, если хотите – cs_tut08_lesson4.max из директория cstudio\tutorials\tutorial8, который расположен в главном директории 3ds max 4.

Данная сцена содержит десять делегатов, расположенных на границе сферы вокруг кубика.

  1. Выберите объект группы и откройте панель Modify.

  2. Используйте диалог Edit Multiply Delegates, чтобы включить Constrain to XY Plane для всех делегатов.

Этот метод обсуждался в предыдущем уроке.

  1. Добавьте поведение Seek и Repel и установите кубик как объект обеих поведений.

  2. Для поведения Repel выключите Use Radii

 

Использование распознающего контроллера

Вместо назначения этих поведений делегатам, Вы используете их для построения распознающего контроллера и назначите созданный контроллер делегатам.

  1. В свитке Setup нажмите кнопку Cognitive Controller.

  2. В окне Cognitive Controller Editor нажмите кнопку New на правой стороне инструментальной панели.

Это создаст новый распознающий контроллер с именем Cognitive Controller и активизирует инструмент Create State.

  1. Нажмите левую кнопку мыши два раза в окне редактора в двух разных местах.

Это добавит к контроллеру два окна состояния, каждое из которых может содержать любое количество поведений.

Редактор распознающего контроллера с добавленными двумя состояниями.

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

Вы можете назначить стартовым и другое состояние.

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

  1. Щелкните правой кнопкой мыши чтобы выйти из режима Create State, а затем на красном окне состояния.

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

  1. В диалоге State щелкните левой кнопкой мыши в верхнем однострочном окне редактирования и поменяйте имя состояния на Seek.

  2. Нажмите кнопку Add. В диалоге Select Behavior нажмите Seek Behavior, а затем кнопку OK.

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

Когда Вы откроете диалог Select Behaviors, экран обновится, и имя диалога State поменяется на Seek.

  1. Закройте диалог Seek, нажав на кнопку “закрыть” в правом верхнем углу окна.

  2. Поменяйте имя второго состояния на Repel и назначьте ему поведение Repel.

 

Создание перехода

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

  1. В окне редактора нажмите Create Position.

  2. Проведите курсором мыши (с нажатой левой кнопкой) от состояния Seek к состоянию Repel.

Появится стрелка, указывающая от первого состояния ко второму. Это и есть переход.

  1. Щелкните правой кнопкой мыши на стрелке перехода.

  2. В диалоге перехода (“Seek ® Repel”) поменяйте установку Duration на 10.

Это приведет к тому, что условие перехода будет обсчитываться 10 кадров, вместо 25. Более короткий переход дает более быструю реакцию.

  1. Нажмите кнопку MAX Script.

  2. В окне MAX Script введите следующее

Fn TestDist del t = ( get_dist = distance $box01.pos del.simpos if get_dist < 120 then 1 else 0 )

Впрочем, Вы можете загрузить файл MAX Script test_dist.ms из директория cstudio\tutorials\tutorial_8, расположенного в главном директории 3ds max 4.

Эта программа проверяет в каждом кадре расстояние между каждым делегатом и кубиком. Если оно меньше 120 единиц, делегат переходит в другое состояние, которое использует поведение Repel. Имя функции, второе слово в программе (после “fn”) должно появится в диалоге Transition.

Программа начинается со слова get_dist, подсчитывает расстояние между положением ([name].pos) указанного объекта ($box1) и положением делегата, вызвавшего программу (del.simpos). “Simpos” – специальное свойство местоположения, используемое для определения положения делегата во время моделирования.

Программа перехода от одного состояния к другому рассчитывается каждый кадр, для каждого делегата, который использует данный распознающий контроллер. Каждый раз, когда программа выполняется, контроллер заменит параметр del на имя текущего делегата.

Первый раз, когда программа выполнится в некоем кадре, она посчитает расстояние между объектами box01 и delegate01, второй раз между delegate02 и box01, и т.д. Чтобы посмотреть, в каком порядке рассчитывается расстояние между делегатами и кубиком, вставьте в программу следующую строку.

print del.name

Убедитесь, что открыто окно Listener (нажмите клавишу F11) перед запуском моделирования.

Чтобы узнать больше о программировании на MAX Script, прочитайте раздел Procedures в главах электронного справочника “Cognitive Controller Editor” и “State Transition Dialog”, где Вы можете найти много простых программ с описанием их компонент и функций.

  1. Щелкните два раза на имени функции (“TestDist”), чтобы оно выделилось, и затем нажмите клавиши Ctrl+C, чтобы скопировать его в буфер обмена Windows.

  2. Закройте диалог MAX Script.

  3. В диалоге Transition щелкните левой кнопкой мыши в текстовом окне в группе Transition Condition, чтобы выделить имеющийся там текст и нажмите Ctrl+V, чтобы вставить в это окно имя функции из буфера обмена.

  4. Закройте диалог Transition, а затем Cognitive Controller Editor.

До того, как Вы сможете проверить свой контроллер в действии, осталось два коротких шага.

  1. Откройте диалог Behavior Assignments и создайте команду, состоящую изо всех делегатов.

  2. Назначьте распознающий контроллер (CogController) созданной команде и закройте диалог.

  3. Запустите моделирование.

Делегаты перемещаются к кубику, пока не подойдут к нему довольно близко, а затем устремляются в обратном направлении.

  1. Попытайтесь сделать следующее:

·        добавить второй переход, который возвращал бы делегатов к кубику, когда они отойдут от него на некоторое расстояние. Совет: надо изменить всего три места в приведенной программе;

·        анимировать кубик, чтобы делегаты могли преследовать его, пока не подойдут к нему на определенное расстояние (120 единиц). Совет: возможно, придется изменить установку End Solve;

·        используйте диалог Edit Multiple Delegates для установки случайной скорости для делегатов с тем, чтобы они достигали кубика и начинали уходить от него в разное время.