Render.ru

PFlow | Birth Script | Render

Владислав Бодюл

Активный участник
Рейтинг
15
#1
Бида с рендером частиц.

Принцип работы кода вкратце:
Код состоит из двух циклов. Первый создает в сцене нужное количество частиц, оно равно количеству объектов в массиве "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 
(
 
)
 

Владислав Бодюл

Активный участник
Рейтинг
15
#2
Ап.
[Вопрос все ещё актуальный]

Если что, вот чуть изменённый код.


Код:
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 
(
 
)
 
Сверху