1. Пользоваться форумом на планшетах и телефонах стало удобнее благодаря Tapatalk

PFlow | Birth Script | Render

Тема в разделе "MAXScript", создана пользователем Владислав Бодюл, 8 фев 2014.

Модераторы: Savin Denis
  1. Владислав Бодюл

    Владислав Бодюл Активный участник

    С нами с:
    08.03.2011
    Сообщения:
    44
    Симпатии:
    2
    Баллы:
    12
    Бида с рендером частиц.

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

    Владислав Бодюл Активный участник

    С нами с:
    08.03.2011
    Сообщения:
    44
    Симпатии:
    2
    Баллы:
    12
    Ап.
    [Вопрос все ещё актуальный]

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


    Код:
    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 
    (
     
    )
     
Модераторы: Savin Denis

Поделиться этой страницей