Россия, eee |
Имитация динамических взаимодействий в 3ds Max
Создавая анимацию вручную, учесть все эти факторы практически невозможно, ведь речь идет о сложных физических взаимодействиях, которые мы каждый день видим вокруг себя. Наблюдая за мячиком, который отскочил от стенки и катится по земле, или за скатертью, которую стелят на стол, мы не задумываемся над тем, насколько сложно воссоздать подобные сцены средствами трехмерной графики. Сколько раз должен мячик отскочить, прежде чем покатится? Где он должен остановиться? В каких местах должна заломиться скатерть после того, как она покроет стол? На все эти вопросы непросто найти ответы.
К счастью, анимацию подобных сцен в 3ds Max вручную создавать не нужно. В программе есть специальный модуль reactor, предназначенный для просчета физических взаимодействий. С его помощью можно решить следующие задачи:
- соударение твердых тел;
- деформация мягких тел;
- разламывание на осколки;
- имитация поведения ткани;
- физически правильная имитация водной поверхности;
- просчет взаимодействий тел, состоящих в конструкциях, например дверей на петлях.
Создание сцены при помощи модуля reactor можно условно разделить на несколько этапов.
- Создание объектов сцены.
- Объединение объектов в так называемые коллекции - группы тел с одинаковыми свойствами.
- Установка физических параметров каждого объекта, который принимает участие во взаимодействии, при помощи свитка настроек Properties (Свойства) утилиты reactor.
- Создание конструкций из компонентов сцены (если таковые имеются). Это необязательный этап.
- Анализ и просчет готовой сцены.
Модуль reactor работает со следующими типами объектов: Rigid Bodies (Твердые тела), Soft Bodies (Мягкие тела), Rope (Веревка), Deforming Mesh (Деформируемые поверхности), Constraints (Конструкции), Actions (Воздействия) и Water (Вода). Эти объекты относятся к категориям Helpers (Вспомогательные объекты) и Space Warps (Объемные деформации), где объединены в группы с названием reactor. Кроме того, они вынесены на специальную вертикальную панель инструментов. Для ее отображения щелкните правой кнопкой мыши на основной панели инструментов и выберите в контекстном меню строку reactor ( рис. 9.1).
Чтобы включить объект в ту или иную коллекцию, нужно добавить в сцену вспомогательный объект, обозначающий наличие в сцене определенной коллекции, и в его настройках составить перечень объектов для этой коллекции.
Например, если моделируется анимация падающих тел, то в сцене необходимо создать вспомогательный объект Rigid Body Collection (Коллекция твердых тел) и в его настройках составить список всех падающих тел, а также плоскости, на которую они будут падать. При этом все падающие объекты, кроме плоскости, должны иметь массу, отличную от нуля. Иначе они повиснут в воздухе.
Определение границ соударения объектов
Просчет соударения тел reactor выполняет по сложным математическим формулам. Нередко просчет сложной сцены занимает много времени. В программе имеется большое количество способов, позволяющих упростить задачу, в данном случае - ускорить просчет анимации. Все они построены на использовании определенного типа поверхности для просчета соударений тел. Например, если вы создаете анимацию падающего на землю пульта дистанционного управления, то не имеет смысла учитывать выпуклости на его поверхности, образованные кнопками. Удобнее просчитать соударения по оболочке с формой параллелепипеда. Форму этой оболочки можно также задать как сферическую, повторяющую поверхность тела по заданному образцу или оптимизированную (в этом случае ее вид напоминает объект в упаковочном целлофане).
Все твердые тела, с которыми работает reactor, условно делятся на выпуклые ( Convex ) и вогнутые ( Concave ). Объект считается выпуклым, если можно провести прямую линию между двумя любыми точками в середине объекта и при этом линия не будет выходить за его пределы. Если вы сомневаетесь в том, является ли объект выпуклым или вогнутым, выделите его и нажмите кнопку Test Convexity (Тест на выпуклость) в свитке настроек Utils (Утилиты) утилиты reactor.
На просчет взаимодействий выпуклых объектов требуется меньше времени, чем на просчет взаимодействий вогнутых, поэтому, если сцена позволяет, часто вогнутые объекта просчитываются как выпуклые.
Указать прорисовку сетчатой поверхности для каждого объекта, по которой модуль reactor просчитает взаимодействия, можно в свитке Properties (Параметры) настроек утилиты reactor. Рассмотрим все способы оптимизации.
В области Simulation Geometry (Просчет геометрии) есть переключатель, при помощи которого выбирается способ оптимизации ( рис. 9.2).
Доступны следующие варианты оптимизации.
- Bounding Box (Габаритный контейнер) - вокруг объекта будет создан параллелепипед, по форме которого будут происходить соударения. Этот способ подходит для таких объектов, как пульт ДУ, плоская расческа для волос или видеокассета, но не годится для таких объектов, как падающая монета или пластиковая бутылка.
- Bounding Sphere (Габаритная сфера) - в этом случае вокруг объекта будет создана сфера, по форме которой будут происходить соударения. Этот способ подходит для таких объектов, как батарейка, жестяная банка и т. д.
- Mesh Convex Hull (Оболочка выпуклого объекта) - данный способ применяется по умолчанию. При его выборе для вычислений используется неоптимизированная оболочка объекта. Если речь идет о вогнутом объекте, то при выборе этого способа по вершинам его геометрии строится оболочка, благодаря чему объект становится как бы упакованным в целлофан. Просчет происходит по этой "целлофановой" оболочке.
- Proxy Convex Hull (Упрощенная оболочка выпуклого объекта) - для объекта создается копия, которую вы можете оптимизировать, уменьшая количество полигонов. При этом оптимизированная форма объекта будет похожа на исходный объект, и при вычислении взаимодействия тела reactor не будет использовать высокополигональную оболочку оригинальной модели. Вместо нее в вычислениях будет задействована упрощенная форма объекта. Поведение объекта с упрощенной формой после просчета анимации немного отличается от того результата, который можно получить, просчитав движения высокополигонального объекта. Однако эта погрешность минимальна и практически незаметна, а вычисления занимают гораздо меньше времени. По данной причине в большинстве случаев мы рекомендуем применять именно этот способ просчета. Способ оптимизации Proxy Convex Hull (Упрощенная оболочка выпуклого объекта) особенно удобно использовать, если в сцене присутствует несколько одинаковых объектов со сложной геометрией. Для них можно создать одну упрощенную модель, с которой и будет работать reactor. Если для каждого объекта применять неоптимизированную оболочку, то программе необходимо "держать в памяти" геометрию каждого из объектов.
- Concave Mesh (Использовать оболочку вогнутого объекта) - способ, при котором будет получен наиболее точный расчет для вогнутых объектов. При выборе этого способа для вычислений будет применяться неоптимизированная оболочка вогнутого объекта. Этот способ необходимо, в частности, использовать, если во взаимодействии в качестве твердого тела принимает участие стандартный примитив Plane (Плоскость) (не путать с объектом reactor Plane (Плоскость reactor)). Для выпуклых объектов этот способ вычислений применять не рекомендуется, и reactor выдает предупреждение об этом.
- Proxy Concave Mesh (Упрощенная оболочка вогнутого объекта) - этот способ напоминает Proxy Convex Hull (Упрощенная оболочка выпуклого объекта), однако в данном случае мы имеем дело с вогнутыми объектами.
- Not Shared (Разные способы) - это положение переключателя становится активным, когда в сцене выделено несколько объектов, которые участвуют во взаимодействии и для которых выбраны разные способы оптимизации. Вручную задать данный способ нельзя.
При выборе настроек для объектов, которые будут принимать участие в соударении, очень важно правильно указать способ оптимизации. Если это не сделать, то результаты вычислений могут оказаться неверными, и объекты будут взаимодействовать некорректно.
Выбор движка просчета динамических взаимодействий
При работе с модулем reactor пользователи могут выбирать движок просчета динамических взаимодействий: Havok 1 или Havok 3. Переключаться между ними можно при помощи списка Choose Solver (Выбрать движок) в свитке настроек About утилиты reactor ( рис. 9.3).
Выбирать подходящий движок нужно, исходя из поставленных задач: первая версия имеет больше возможностей и поддерживает все функции reactor, а Havok 3 работает только с твердыми телами, но зато обеспечивает более высокую скорость и точность просчета. Если попытаться использовать движок Havok 3 в сценах, где есть неподдерживаемые типы объектов (например, вода), то программа просто проигнорирует их и исключит из взаимодействия.
При выборе движка Havok 3 в свитке Havok 3 World (Глобальный) настроек утилиты reactor появляется новая область параметров Simulation (Взаимодействие), в которой можно задать один из способов просчета динамических взаимодействий. При варианте Discrete (Дискретный) программа проверяет наличие столкновений только в начале и в конце каждого шага просчета анимации, а при варианте Continuous (Постоянный) проверка происходит постоянно. Для Havok 1 используется первый способ, а для Havok 3 по умолчанию установлен способ Continuous (Постоянный).
Окно Real-Time Preview
Перед тем, как выполнять окончательный просчет анимации, можно использовать окно Real-Time Preview (Просмотр в реальном времени). В нем можно увидеть, как будут вести себя трехмерные объекты во взаимодействии.
Окно Real-Time Preview (Просмотр в реальном времени) можно вызвать, нажав кнопку Preview in Window (Предварительный просмотр в окне) в свитке Preview & Animation (Предварительный просмотр и анимация) настроек утилиты reactor.
При его вызове появится окно, внутри которого будет автоматически визуализирован первый кадр ( рис. 9.4). Чтобы воспроизвести анимацию, нужно в меню Simulation (Имитация) выбрать строку Play/Pause (Воспроизвести/Пауза) или просто нажать клавишу P. В данном окне также можно указать прорисовку сетчатой поверхности для каждого объекта, по которой модуль будет просчитывать взаимодействия. В нижней части окна отображается время анимации.
В этом окне отображаются не все объекты сцены, а только те, которые принимают участие во взаимодействии.
Столкновение с последующим разрушением
Чтобы дать вам представление о принципе работы модуля reactor 2, рассмотрим пример создания с его помощью сцены столкновения с последующим разрушением. Несмотря на то, что reactor создает анимацию, имитируя физическую модель, в некоторых случаях и он оказывается бессилен. Например, если необходимо смоделировать разбивающийся стеклянный предмет, reactor не сможет предугадать, какую форму примут осколки.
Однако эту задачу можно решить, упростив условия разрушения. Чтобы разбить объект с помощью модуля reactor, необходимо предварительно разделить оболочку объекта на осколки, после чего указать в настройках реактора, какие именно элементы являются осколками.
Создайте простую сцену, в которой тяжелый брусок падает на чайник и отбивает ему носик. Выполните объект Teapot (Чайник) в окне проекции и отключите отображение носика, сняв флажок Spout (Носик) в параметрах объекта ( рис. 9.5).
Клонируйте этот объект, выполнив команду Edit>Clone (Правка>Клонировать). Выберите вариант клонирования Copy (Независимая копия объекта). Не меняя координаты второго чайника, отключите все его элементы, а носик, наоборот, включите, установив флажок Spout (Носик).
Создайте плоскость, на которую упадут брусок и осколок. Для этого нажмите кнопку Create Plane (Создать плоскость) на панели инструментов reactor.
Добавьте в сцену брусок, используя стандартный примитив Box (Параллелепипед). Расположите его так, чтобы он находился над носиком чайника ( рис. 9.6).
Воспользуйтесь сочетанием клавиш Ctrl+A, чтобы выделить все объекты в сцене. На панели инструментов reactor нажмите кнопку Create Rigid Body Collection (Создать группу твердых тел), чтобы составить коллекцию твердых тел, участвующих во взаимодействии.
Выделите объекты, которые составляют разрушающийся объект, то есть носик и чайник без носика. Нажмите кнопку Create Fracture (Разрушить). В окне проекции появится значок, обозначающий, что сцена содержит объект разрушения, а объекты, относящиеся к нему, будут помещены в параллелепипед ( рис. 9.7).
Перейдите на вкладку Utilities (Утилиты) командной панели и откройте настройки утилиты reactor. Поочередно выделяя объекты, задайте массу носика и бруска, изменив значение параметра Mass (Масса тела) в свитке Properties (Свойства). Для носика установите массу равной 0,2, а для бруска - 2. Если не задать массу носика, то брусок повиснет на нем, и разлом не произойдет.
Нажмите кнопку Preview in Window (Предварительный просмотр в окне) в свитке Preview & Animation (Предварительный просмотр и анимация) настроек утилиты reactor и убедитесь, что анимация проходит корректно ( рис. 9.8). После этого можно выполнить просчет, нажав кнопку Create Animation (Создание анимации).