Принцип работы кода вкратце:
Код состоит из двух циклов. Первый создает в сцене нужное количество частиц, оно равно количеству объектов в массиве "arr" так-же берёт их mesh и позицию.
И второй цикл, он собственно и трансформирует наши партиклы по определённым выражениям. На трансформацию влияет дистанция от Gizmo (переменная help) до партикла. А так-же возможна трансформация по карте (даже если она анимирована). Карта рендерится в переменную "rend_map" и из неё потом берётся цвет пикселя.
Так вот. Всё это отлично работает во вьюпорте. Но сама анимация не рендерится. На рендере она застывает на том фрейме, на котором у нас стоял тайм-слайдер перед нажатием на кнопку Render. Единственный выход, это кэшировать оператором cache. Но в нём нужно обязательно указать Use At:Render или Viewport/Render.
______________
По поводу самого кода. Я возможно часть глобальных переменных от-туда уберу. Они будут задаватся через скрипт.
Вот код
on ChannelsUsed pCont do
(
pCont.usePosition = true
pCont.useShape = true
pCont.useSpeed = true
pCont.useScale = true
pCont.useOrientation = true
)
on Init pCont do
(
)
on Proceed pCont do
(
-------------------------------------
global partCount=arr.count --ParticleCount
global scl --Scale
global d --Distance
global r --Gizmo.radius
global v --(1.0/r*d)
global cval1 -- Curve_scl
global cval1max
global cval2 -- Curve_rot
global cval2max
global cval3 -- Curve_pos
global cval3max
global part_pos
global pos
global rx -- Axis_X
global ry -- Axis_Y
global rz -- Axis_Z
global part_orient
global part_percent=(PF_Quantity_Controller.value/100.)
-------------------------------------
if transform_by_map_enabled==true then (
if (SuperClassOF map)==texturemap then (
rend_map=(rendermap map size:[rend_map_resolution,rend_map_resolution])
)
)
t = pCont.getTimeStart() as float
if t<0 do (
for i in 1 to (partCount*part_percent) do
(
pCont.AddParticle()
pCont.particleIndex = pCont.NumParticles()
pCont.setParticlePosition i arr[i].pos
pCont.setParticleShape i arr[i/part_percent].mesh
pCont.setParticleSpeed i [0,0,0]
)
)
for i in 1 to (partCount*part_percent) do
(
scl=[1,1,1]
pos=[0,0,0]
part_pos=[0,0,0]
r=help.radius
d=(distance help.pos arr[i/part_percent].pos)
v=(1.0/r*d)
cval1=(getvalue pfx.cv.curves[1] 1 v)
cval1max=(getvalue pfx.cv.curves[1] 1 1)
cval2=(getvalue pfx.cv.curves[2] 1 v)
cval2max=(getvalue pfx.cv.curves[2] 1 1)
cval3=(getvalue pfx.cv.curves[3] 1 v)
cval3max=(getvalue pfx.cv.curves[3] 1 1)
rx=((((rand_pos_arr[i/part_percent]*pfx.spn7.value/57.2958).x+pfx.rot_x.value)+(((rand_pos_arr[i/part_percent]*pfx.spn7.value/57.2958).x+(pfx.rot_x.value)))))
ry=((((rand_pos_arr[i/part_percent]*pfx.spn7.value/57.2958).y+pfx.rot_y.value)+(((rand_pos_arr[i/part_percent]*pfx.spn7.value/57.2958).y+(pfx.rot_y.value)))))
rz=((((rand_pos_arr[i/part_percent]*pfx.spn7.value/57.2958).z+pfx.rot_z.value)+(((rand_pos_arr[i/part_percent]*pfx.spn7.value/57.2958).z+(pfx.rot_z.value)))))
part_orient=[rx,ry,rz]
pos=((rand_pos_arr[i/part_percent]*(pfx.spn3.value/10*cval3))+(normal_pos[i/part_percent]*pfx.spn6.value*cval3)+(add_pos*cval3))
if d>r then (
scl*=abs(cval1max)
part_pos=arr[i/part_percent].pos
part_orient*=cval2max
)
if d<r then (
part_pos=(arr[i/part_percent].pos+pos)
scl*=abs(cval1)
part_orient*=cval2
)
if transform_by_map_enabled==true then (
if (SuperClassOF map)==texturemap then (
gpbm=(getpixels rend_map [((rend_map_resolution-1)*tv_arr[i/part_percent].x),((rend_map_resolution-1)*(1.0-tv_arr[i/part_percent].y))] 1)[1]/255.
if use_rotation_trns_b_m==true then (
if use_rotation_trns_b_m_invert==true then (
if rend_map_color_chanel==true then (
pCont.setParticleOrientation i ([(1.0-gpbm.red),(1.0-gpbm.green),(1.0-gpbm.blue)]*part_orient)
) else (pCont.setParticleOrientation i ([(1.0-gpbm.value),(1.0-gpbm.value),(1.0-gpbm.value)]*part_orient))
) else (
if rend_map_color_chanel==true then (
pCont.setParticleOrientation i ([gpbm.red,gpbm.green,gpbm.blue]*part_orient)
) else (pCont.setParticleOrientation i ([gpbm.value,gpbm.value,gpbm.value]*part_orient))
)
) else (pCont.setParticleOrientation i part_orient)
if use_scale_trns_b_m==true then (
if use_scale_trns_b_m_invert==true then (
pCont.setParticleScaleXYZ i ([(1.0-gpbm.value),(1.0-gpbm.value),(1.0-gpbm.value)]*scl)
) else (pCont.setParticleScaleXYZ i ([gpbm.value,gpbm.value,gpbm.value]*scl))
) else (pCont.setParticleScaleXYZ i scl)
if use_position_trns_b_m==true then (
if use_position_trns_b_m_invert==true then (
pCont.setParticlePosition i (arr[i/part_percent].pos+(pos*[(1.0-gpbm.value),(1.0-gpbm.value),(1.0-gpbm.value)]))
) else (
pCont.setParticlePosition i (arr[i/part_percent].pos+(pos*[gpbm.value,gpbm.value,gpbm.value])))
) else (pCont.setParticlePosition i part_pos)
)
) else (
pCont.setParticleOrientation i part_orient
pCont.setParticleScaleXYZ i scl
pCont.setParticlePosition i part_pos
)
)
)
on Release pCont do
(
)
on ChannelsUsed pCont do
(
pCont.usePosition = true
pCont.useShape = true
pCont.useSpeed = true
pCont.useScale = true
pCont.useOrientation = true
)
on Init pCont do
(
global partCount=arr.count -- ParticleCount
global scl_part -- Scale
global dist_part -- Distance
global radius_giz_part -- Gizmo.radius
global radius_range -- (1.0/radius_giz_part*dist_part)
global curve_scl_part -- Curve_scl
global curve_scl_max_part
global curve_rot_part -- Curve_rot
global curve_rot_max_part
global curve_pos_part -- Curve_pos
global curve_pos_max_part
global part_pos
global pos_temp_part
global rot_x_part -- Axis_X
global rot_y_part -- Axis_Y
global rot_z_part -- Axis_Z
global part_orient
global part_percent=(PF_Quantity_Controller.value/100.)
)
on Proceed pCont do
(
part_percent=(PF_Quantity_Controller.value/100.)
if transform_by_map_enabled==true then (
if (SuperClassOF map)==texturemap then (
rend_map=(rendermap map size:[rend_map_resolution,rend_map_resolution])
)
)
t = pCont.getTimeStart() as float
if t<0 do (
for i in 1 to (partCount*part_percent) do
(
pCont.AddParticle()
pCont.particleIndex = pCont.NumParticles()
pCont.ParticlePosition=arr[i].pos
pCont.ParticleShape=arr[i/part_percent].mesh
pCont.ParticleSpeed=[0,0,0]
)
)
for i in 1 to (partCount*part_percent) do
(
pCont.particleIndex=i
scl_part=[1,1,1]
pos_temp_part=[0,0,0]
part_pos=[0,0,0]
radius_giz_part=help.radius
dist_part=(distance help.pos arr[i/part_percent].pos)
radius_range_part=(1.0/radius_giz_part*dist_part)
curve_scl_part=(getvalue pfx.cv.curves[1] 1 radius_range_part)
curve_scl_max_part=(getvalue pfx.cv.curves[1] 1 1)
curve_rot_part=(getvalue pfx.cv.curves[2] 1 radius_range_part)
curve_rot_max_part=(getvalue pfx.cv.curves[2] 1 1)
curve_pos_part=(getvalue pfx.cv.curves[3] 1 radius_range_part)
curve_pos_max_part=(getvalue pfx.cv.curves[3] 1 1)
rot_x_part=(((rand_pos_arr[i/part_percent]*RandRotController.value/57.2958).x+Rot_X_Controller.value)+(((rand_pos_arr[i/part_percent]*RandRotController.value/57.2958).x+Rot_X_Controller.value)))
rot_y_part=(((rand_pos_arr[i/part_percent]*RandRotController.value/57.2958).y+Rot_Y_Controller.value)+(((rand_pos_arr[i/part_percent]*RandRotController.value/57.2958).y+Rot_Y_Controller.value)))
rot_z_part=(((rand_pos_arr[i/part_percent]*RandRotController.value/57.2958).z+Rot_Z_Controller.value)+(((rand_pos_arr[i/part_percent]*RandRotController.value/57.2958).z+Rot_Z_Controller.value)))
part_orient=[rot_x_part,rot_y_part,rot_z_part]
pos_temp_part=((rand_pos_arr[i/part_percent]*(RandPosController.value/10))+(normal_pos[i/part_percent]*NormalPosController.value)+(add_pos))
if dist_part>radius_giz_part then (
scl_part*=abs(curve_scl_max_part)
part_pos=(arr[i/part_percent].pos+(pos_temp_part*curve_pos_max_part))
part_orient*=curve_rot_max_part
)
if dist_part<radius_giz_part then (
part_pos=(arr[i/part_percent].pos+(pos_temp_part*curve_pos_part))
scl_part*=abs(curve_scl_part)
part_orient*=curve_rot_part
)
if transform_by_map_enabled==true then (
if (SuperClassOF map)==texturemap then (
gpbm=(getpixels rend_map [((rend_map_resolution-1)*tv_arr[i/part_percent].x),((rend_map_resolution-1)*(1.0-tv_arr[i/part_percent].y))] 1)[1]/255.
-- Set Rotation --
if use_rotation_trns_b_m==true then (
if use_rotation_trns_b_m_invert==true then (
if rend_map_color_chanel==true then (
pCont.ParticleOrientation=([(1.0-gpbm.red),(1.0-gpbm.green),(1.0-gpbm.blue)]*part_orient)
) else (pCont.ParticleOrientation=([(1.0-gpbm.value),(1.0-gpbm.value),(1.0-gpbm.value)]*part_orient))
) else (
if rend_map_color_chanel==true then (
pCont.ParticleOrientation=([gpbm.red,gpbm.green,gpbm.blue]*part_orient)
) else (pCont.ParticleOrientation=([gpbm.value,gpbm.value,gpbm.value]*part_orient))
)
) else (pCont.ParticleOrientation=part_orient)
-- Set Scale --
if use_scale_trns_b_m==true then (
if use_scale_trns_b_m_invert==true then (
pCont.ParticleScaleXYZ=([(1.0-gpbm.value),(1.0-gpbm.value),(1.0-gpbm.value)]*scl_part)
) else (pCont.ParticleScaleXYZ=([gpbm.value,gpbm.value,gpbm.value]*scl_part))
) else (pCont.ParticleScaleXYZ=scl_part)
-- Set Position --
if use_position_trns_b_m==true then (
if use_position_trns_b_m_invert==true then (
if dist_part<radius_giz_part then (
pCont.ParticlePosition=(arr[i/part_percent].pos+((pos_temp_part*curve_pos_part)*[(1.0-gpbm.value),(1.0-gpbm.value),(1.0-gpbm.value)]))
) else(
pCont.setParticlePosition i (arr[i/part_percent].pos+[(1.0-gpbm.value),(1.0-gpbm.value),(1.0-gpbm.value)]*(pos_temp_part*curve_pos_max_part))
)
) else (
if dist_part<radius_giz_part then (
pCont.ParticlePosition=(arr[i/part_percent].pos+((pos_temp_part*curve_pos_part)*[gpbm.value,gpbm.value,gpbm.value]))
) else(
pCont.setParticlePosition i (arr[i/part_percent].pos+[gpbm.value,gpbm.value,gpbm.value]*(pos_temp_part*curve_pos_max_part))
)
)
) else (pCont.ParticlePosition=part_pos)
) else (
pCont.ParticleOrientation=part_orient
pCont.ParticleScaleXYZ=scl_part
pCont.ParticlePosition=part_pos)
) else (
pCont.ParticleOrientation=part_orient
pCont.ParticleScaleXYZ=scl_part
pCont.ParticlePosition=part_pos
)
)
)
on Release pCont do
(
)
Доступ к резюме доступен только по пакетному доступу HR менеджерам зарегистрированных компаний. Узнать о вариантах корпоративных пакетов можно по ссылке.
Владислав Бодюл
Принцип работы кода вкратце:
Код состоит из двух циклов. Первый создает в сцене нужное количество частиц, оно равно количеству объектов в массиве "arr" так-же берёт их mesh и позицию.
И второй цикл, он собственно и трансформирует наши партиклы по определённым выражениям. На трансформацию влияет дистанция от Gizmo (переменная help) до партикла. А так-же возможна трансформация по карте (даже если она анимирована). Карта рендерится в переменную "rend_map" и из неё потом берётся цвет пикселя.
Так вот. Всё это отлично работает во вьюпорте. Но сама анимация не рендерится. На рендере она застывает на том фрейме, на котором у нас стоял тайм-слайдер перед нажатием на кнопку Render. Единственный выход, это кэшировать оператором cache. Но в нём нужно обязательно указать Use At:Render или Viewport/Render.
______________
По поводу самого кода. Я возможно часть глобальных переменных от-туда уберу. Они будут задаватся через скрипт.
Вот код
Владислав Бодюл
[Вопрос все ещё актуальный]
Если что, вот чуть изменённый код.