- Рейтинг
- 15
Бида с рендером частиц.
Принцип работы кода вкратце:
Код состоит из двух циклов. Первый создает в сцене нужное количество частиц, оно равно количеству объектов в массиве "arr" так-же берёт их mesh и позицию.
И второй цикл, он собственно и трансформирует наши партиклы по определённым выражениям. На трансформацию влияет дистанция от Gizmo (переменная help) до партикла. А так-же возможна трансформация по карте (даже если она анимирована). Карта рендерится в переменную "rend_map" и из неё потом берётся цвет пикселя.
Так вот. Всё это отлично работает во вьюпорте. Но сама анимация не рендерится. На рендере она застывает на том фрейме, на котором у нас стоял тайм-слайдер перед нажатием на кнопку Render. Единственный выход, это кэшировать оператором cache. Но в нём нужно обязательно указать Use At:Render или Viewport/Render.
______________
По поводу самого кода. Я возможно часть глобальных переменных от-туда уберу. Они будут задаватся через скрипт.
Вот код
Принцип работы кода вкратце:
Код состоит из двух циклов. Первый создает в сцене нужное количество частиц, оно равно количеству объектов в массиве "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
(
)