Список работ

Симуляция динамики твердых и мягких тел средствами 3ds Max

Курсовой проект по дисциплине Программная инженерия

Шишук Р.О, А-13-14

Содержание

1. Постановка задачи

Реализовать средствами 3ds Max MassFX и MaxScript модели взаимодействия твердых и мягких тел с учетом ограничений и внешних сил.

2. Порядок решения

Каждая сцена создается следующим образом:

  1. Создаются полигональные модели объектов сцены.
  2. К ним добавляются
  3. силы, присутствующие в сцене, указываются как свойство forcesList соответствующего модификатора MassFX_RBody.

Далее выполнятся симуляцию сцены.

3. Динамическое моделирование

3.1. Скатерть и стол

В сцене скатерть под действием силы тяжести опускается на стол.
Для создания сцены потребуется два объекта: Box и Plane.
Зададим размеры и положение куба и плоскости так, чтобы пример был наиболее наглядным (рис. 1).

Скатерть над столом

Рис. 1. Скатерть над столом

Увеличим количество сегментов скатерти (плоскости) до 50 по каждому измерению, что обеспечит правдоподобную анимацию.
Сделаем куб твердым статическим телом (type = 3).
Модель скатерти реализуем, добавив к плоскости модификатор mCloth.
На MAXScript приведенная последовательность шагов выглядит следующим образом:

delete $*
table = Box length:20 height:20 width:20 pos:[0, 0, 0] wirecolor:[220, 120, 0]
cloth = plane length:35 width:35 pos:[0, 0, 50] widthsegs:50 lengthsegs:50 wirecolor:[0, 110, 100]
mfx = MassFX_RBody type:3
-- Создаем модель стола
addModifier table mfx
-- Создаем модель скатерти
addModifier cloth mCloth()

Выполним симуляцию сцены. Плоскость ведет себя как скатерть (рис. 2).

Стол накрыт

Рис. 2. Стол накрыт скатертью

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

3.2. Удар

Для создания сцены потребуются три геометрических тела (sphere и два объекта box) и сила (ветер).
Зададим положение объектов в соответствии с рис. 3.

На шар дует ветер

Рис. 3. Исходная сцена

Силу ветра для достижения нужного эффекта установим равной 60.
Сделаем горизонтальную платформу статическим телом, а вертикальную динамическим. Так же сделаем динамическим шар. Тип его физической формы выберем Original (meshType = 5), а массу укажем равной 40.
В массив сил добавим ветер и укажем этот массив как значение свойства ForcesList модификатора MassFX_RBody, добавленного к сфере.
Описанная последовательность действий реализуется следующим кодом:

delete $* bx = box length:60 width:100 height:8 pos:[0,0,0]
bx2 = box length:60 width:100 height:3 pos:[60,0,50]
rotate bx2 (angleaxis 90 [0, 1, 0])
sp = Sphere radius:15 pos:[-40, 0, 33] segs:32
wn = Wind pos:[-70,0,15] iconSize:12 strength:60 decay:0
rotate wn (angleaxis 90 [0,1,0])
mfx = MassFX_RBody type:3
addModifier bx mfx
mfx2 = MassFX_RBody type:1
addModifier bx2 mfx2
mfx3 = MassFX_RBody type:1 meshType:5 mass:40
addModifier sp mfx3
mfx3.forcesList = #(wn)

Под действием силы ветра шар движется к вертикальной платформе (bx2). Его энергии хватает, чтобы эту платформу опрокинуть (рис. 4).

Шар опрокинул платформу

Рис. 4. Платформа опрокинута

3.3. Шар и дверь

Для создания сцены используем четыре объекта: sphere и три объекта box и расположим их, как показано на рис. 5.

Перед симуляцией

Рис. 5. Исходная сцена

Угол наклонной платформы (объект bx) задан таким образом, что шар, скатываясь с нее под действием силы тяжести, набирает достаточно энергии, чтобы приоткрыть дверь.
Определяем обе нижние платформы как статические тела (type = 3), а шар и дверь - как динамические (type = 1).
Тип сетки у нижних платформ выбираем Original (meshType = 5), у сферы - Sphere (meshType = 1), а у вертикальной плоскости - Convex (выпуклая оболочка, meshType = 4).
Дверь подвешиваем на петле с радиусом 15 и возможным поворотом на 90°.
Массы шара и двери выбираем такими, чтобы шару хватило энергии приоткрыть дверь и покатиться далее.
Все это обеспечивается следующий код:

delete $*
sp = sphere radius:15 pos:[-30, 0, 80] segs:32
bx = box length:60 width:100 height:3 pos:[0, 0, 21]
bx2 = box length:60 width:100 height:3 pos:[95, 0, 0]
bx3 = box length:60 width:50 height:3 pos:[95, 0, 31]
rotate bx (angleaxis 25 [0, 1, 0])
rotate bx3 (angleaxis 90 [0, 1, 0])
mshTp = 5 -- 2 - Box; 4 - Convex; 5 - Original
-- bx и bx2 - статические тела
mfx = MassFX_RBody type:3 meshType:mshTp mass:1
addModifier bx mfx
-- bx2 - статическое тело
mfx2 = MassFX_RBody type:3 meshType:mshTp mass:1
addModifier bx2 mfx2
-- sp и bx3 - динамические тела
mfxSp = MassFX_RBody type:1 meshType:1 mass:130
addModifier sp mfxSp
mfx3 = MassFX_RBody type:1 meshType:4 mass:20
addModifier bx3 mfx3
select bx3
hng = UConstraint body1:bx3 helpersize:15
hng.swing2Mode = 3 -- Swing Y Free
hng.swing1Mode = 2 -- Swing Z limited
hng.swing1Angle = 90
hng.pos = bx3.pivot
move hng [1.5, 0, 25]

При ударе шара о дверь она, будучи подвешенной на петле, отклонится и пропустит шар (рис. 6).

Дверь отклонилась

Рис. 6. Дверь приоткрыта

За счет приобретенной энергии дверь продолжит некоторое время совершать колебательные движения (рис. 7).

Дверь на петле

Рис. 7. Дверь скоро успокоится

3.4. Интерфейс пользователя

Показан на рис. 8.

Интерфейс пользователя

Рис. 8. Форма для запуска программ подготовки и симуляции сцен

Приведенная форма обеспечивает создание описанных выше динамических сцен, воспроизведение симуляции (Play), установку начальных значений (Reset) и очистку сцены (Clear).
Форма и соответствующие pressed-обработчики создаются следующим кодом:

rollout myRollout "MassFX examples" width:157 height:203
(
    button btnTable "Tablecloth" pos:[23, 12] width:110 height:25
    button btnStrike "Strike" pos:[23,42] width:110 height:25
    button btnDoor "Ball and door" pos:[23,72] width:110 height:25
    button btnPlay "Play" pos:[23,102] width:110 height:25
    button btnReset "Reset" pos:[23,132] width:110 height:25
    button btnClear "Clear" pos:[23,162] width:110 height:25
    on btnTable pressed do (
        -- См. код выше
    )
    on btnStrike pressed do (
        -- См. код выше
    )
    on btnDoor pressed do (
        -- См. код выше
        )
    on btnPlay pressed do (
        nvpx.Simulate 5
    )
    on btnReset pressed do (
        nvpx.SimulationReset()
    )
    on btnClear pressed do (
        delete $*
    )
)
CreateDialog myRollout

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

Заключение

Созданы анимации твердых и мягких тел с использованием плагина MassFX. В сценах использованы сила Wind, модификатор mCloth и ограничение HingeConstraint.
В дальнейшем планируется использовать этот плагин для создания более сложных сцен (например, для воспроизведения природных явлений).

Источники

  1. MAXScript help.

Список работ

Рейтинг@Mail.ru