Список примеров

Система частиц PArray и составной объект Mesher

Система частиц PArray (массив частиц) позволяет, в частности, разбить произвольную поверхность на части. При этом каждая часть разбиения является частицей, которой можно управлять всеми доступными средствами, например, силами или отражателями.
В первом примере система частиц использует в качестве эмиттера (источника частиц) цилиндр. Минимальное число частиц устанавливается свойством FragChunkMinimum. В примере его значение равно 50. Созданные частицы удаляются от центра эмиттера с небольшой скоростью. Сам цилиндр и иконка системы частиц PArray удаляются со сцены в результате употребления метода Hide.
При таком варианте создания по умолчанию все частицы появляются при t = 0f.

delete $*
animationRange = interval 0f 100f
-- Цилиндр с достаточно большим числом сегментов по высоте
cl = cylinder radius:30 height:60 heightSegs:20 pos:[0, 0, -30]
a = PArray speed:0.2   -- Частицы имеют небольшую скорость
a.Life = 101f     -- Время жизни частиц
a.Emitter = cl     -- Источником частиц является цилидр
a.ParticleType = 2    -- Частицы – это части объекта
a.ViewType = 2    -- В видовом порте частицы отображаются в виде Mesh
a.FragmentMethod = 1   -- Число частиц контролируется свойством Frag-ChunkMinimum
a.Fragment_Thickness = 5  -- Толщина каждой частицы в текущих единицах измерения
a.FragChunkMinimum = 50 -- Будет создано 50 или более частиц
particleCount a     -- Метод ParticleCount вернет число созданных частиц
hide #(cl)      -- Прячем цилиндр
playAnimation()

Положение частиц в конце анимационного интервала показано на рис. 1.

Употреблена система частиц PArray

Рис. 1. Частицы при t = 100f

Составной объект Mesher, будучи употребленным с системой частиц, позволяет образовать из каждой частицы меш. Это в последующем позволяет применять к частицам известные средства редактирования меш, например, параметрические модификаторы.
Во втором примере вновь система частиц использует в качестве эмиттера цилиндр. После генерации частиц создается объект Mesher, состоящий из TriMesh-элементов. Каждая меш повторяет форму одной из ранее созданных частиц. Затем меш составного объекта перенимается Editable_Mesh-объектом, в котором выделяются элементы с наибольшим числом граней. Прочие элементы покидают сцену (прячутся).
Порядок создания сцены следующий:

  1. Создать, используя PArray, частицы из фрагментов цилиндра.
  2. Создать, используя конструктор Mesher, объект класса Mesher и применить его, используя свойство Pick, к системе частиц PArray.
  3. Создать Editable_Mesh-объект (ttlMsh) и определить его Mesh, как Mesh объекта Mesher. Число элементов в полученном объекте будет равно числу частиц (фрагментов цилиндра), созданных на этапе 1.
  4. Скрыть цилиндр, частицы, созданные PArray, составной и Editable_Mesh-объекты.
  5. Последовательно выбирая элементы Editable_Mesh-объекта, запомнить в переменной nFMax максимальное число граней. Каждый выбранный элемент после вычисления числа его граней покидает сцену.
  6. Восстановить объект ttlMsh и отделить от него все элементы с наибольшим числом граней. Результат сохранить в массиве arrFrgmntMsh. Базовую точку каждого элемента поместить в центр его охватывающего прямоугольника.
  7. Выполнить анимацию найденных элементов сцены, перемещая их по оси Z.

Заметим, что после создания цилиндра, системы частиц, составного объекта и Editable_Mesh-объекта в видовом порте будут присутствовать 4 цилиндра. При этом три из них будут состоять из фрагментов. Кроме того, элементы составного объекта будут выполнять те же движения, что и соответствующие частицы. Для перемещения последних в системе частиц устанавливается скорость Speed = 0.2.
Все это можно наблюдать, если нет скрытых объектов.

delete $*
sliderTime = 0f
animationRange = interval 0f 100f
cl = cylinder radius:30 height:60 heightSegs:20 pos:[0, 0, -30]
a = PArray speed:0.2 life:101f emitter:cl particleType:2 viewType:2 fragmentMethod:1 \
 fragment_Thickness:5 fragChunkMinimum:50
-- Составной объект из частиц, созданных системой частиц PArray
mshr = mesher pick:a pos = [50, 0, 0]
-- Прячем цилиндр, частицы, созданные PArray, и Editable_Mesh-объект
ttlMsh = editable_Mesh pos:[0, 0, 0]
ttlMsh.Mesh = mshr.Mesh
update ttlMsh
hide #(cl, a, mshr, ttlMsh)
nFMax = 0
while ttlMsh.Numfaces != 0 do (
 -- Получаем элемент, содержащий грань с номером 1
 el = meshOp.GetElementsUsingFace ttlMsh #{1}
 -- Получает выделенный элемент как самостоятельную меш
 tMsh = meshOp.DetachFaces ttlMsh el delete:true asMesh:true
 nF = tMsh.NumFaces
 if nF > nFMax then nFMax = nF
)
arrFrgmntMsh = #()
ttlMsh.Mesh = mshr.Mesh
while ttlMsh.Numfaces != 0 do (
 el = meshOp.GetElementsUsingFace ttlMsh #{1}
 tMsh = meshOp.DetachFaces ttlMsh el delete:true asMesh:true
 if tMsh.NumFaces == nFMax then (
  frgmntMsh = editable_Mesh pos:[0, 0, 0]
  frgmntMsh.Mesh = tMsh
  bb = nodeLocalBoundingBox frgmntMsh
  x = 0.5 * (bb[1][1] + bb[2][1])
  y = 0.5 * (bb[1][2] + bb[2][2])
  z = 0.5 * (bb[1][3] + bb[2][3])
  frgmntMsh.Pivot = [x, y, z]
  update frgmntMsh
  append arrFrgmntMsh frgmntMsh
 )
)
max tool zoomextents
c = -1
dz = -50
for m = 1 to arrFrgmntMsh.Count do (
 frgmntMsh = arrFrgmntMsh[m]
 ps = frgmntMsh.Pos
 dz = c * dz * (random 0.5 1.0)
 bp = bezier_position()
 k = addNewKey bp 0f
 k.Value = ps
 k = addNewKey bp 50f
 k.Value = ps + [0, 0, dz]
 k = addNewKey bp 100f
 k.Value = ps
 frgmntMsh.Pos.Controller = bp
)
playAnimation()

Результат приведен на рис. 2.

Употреблены PArray и Mesher в задаче поиска элементов с наибольшим числом граней

Рис. 2. Элементы с наибольшим числом граней

В последнем примере к составному объекту применяется модификатор Twist (скручивание) и далее приводится результат при t = 100f.

delete $*
animationRange = interval 0f 100f
cl = cylinder radius:15 height:60 heightSegs:20 pos:[0, 0, -30]
a = PArray speed:0.2 life:101f emitter:cl particleType:2 viewType:2 fragmentMethod:1 \
 fragment_Thickness:5 fragChunkMinimum:50
-- Составной объект из частиц, созданных системой частиц PArray
mshr = mesher pick:a pos = [50, 0, 0]
-- Прячем цилиндр и частицы, созданные PArray
hide #(cl, a)
tw = twist angle:600
addModifier mshr tw
playAnimation()

Совместное применение PArray, Mesher и Twist

Рис. 3. Скрученный составной объект при t = 100f

Источники

  1. Autodesk® 3ds Max® 2009 MAXScript Reference.
  2. Бартеньев О. В. Программирование систем частиц. – Учебно-справочное пособие. – М.:МЭИ, 2009. – 235 с.

Список примеров

Рейтинг@Mail.ru