Система частиц 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.
Рис. 1. Частицы при t = 100f
Составной объект Mesher, будучи употребленным с системой частиц, позволяет образовать из каждой частицы меш. Это в последующем позволяет применять к частицам известные средства редактирования меш, например, параметрические модификаторы.
Во втором примере вновь система частиц использует в качестве эмиттера цилиндр. После генерации частиц создается объект Mesher, состоящий из TriMesh-элементов. Каждая меш повторяет форму одной из ранее созданных частиц. Затем меш составного объекта перенимается Editable_Mesh-объектом, в котором выделяются элементы с наибольшим числом граней. Прочие элементы покидают сцену (прячутся).
Порядок создания сцены следующий:
Заметим, что после создания цилиндра, системы частиц, составного объекта и 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.
Рис. 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()
Рис. 3. Скрученный составной объект при t = 100f