Jump to content
neutrino

Uno Scatter Con Maxscript

Recommended Posts

Come promesso, ecco lo scatter definito in maxscript. Questo script prende un oggetto e tramite una semplice interfaccia lo sparpaglia su un altro oggetto a seconda dell'altezza di qest'utimo. In particolare l'ho usato per posizionare degli alberi su un terreno con altezze variabile.

Lo script è stato oggetto di tesi al corso di Grafica e Progettazione Multimediale de La Sapienza di Roma.

Ringrazio soprattutto Coren per la grande mano che mi ha dato nell'implementare alcune funzioni , Philix (il "core" del piantaggio è il suo) e Andrea Gasparo.

-- funzione


fn funziona_copia oggettoDaCopiare quanteCopie tipoDiClone = (	


	-- mette qui dentro gli oggetti creati

	arr=#()


	for i=1 to quanteCopie do 

	(

		case tipoDiClone  of

		(

		1: append arr (copy oggettoDaCopiare)

		2: append arr (instance oggettoDaCopiare)

	)

	)


	-- ritorna l'array con gli oggetti creati

	return arr

) -- fine funziona_copia


-- variabile globale 

global prendi,terreno



-- definizione rollout "prova scatter"

rollout allControls "Scatter1.0_MarcoPetri" (



-- oggetti dell'interfaccia

groupBox gruppo "Parametri" pos:[8,8] width:215 height:550

pickbutton clic_on_obj "Prendi Oggetto:" pos:[40,30]  width:140

spinner n_copie "N.Copie:" type:#integer align:#center 	fieldWidth:60 range:[0,1000,1] offset:[0,20]

radiobuttons copy_type labels:#("copy", "instance")	

pickbutton clic_terreno "Terreno:" pos:[45,520] width:140 

button copia "Distribuisci!"

button anteprima "Clicca per calcolare anteprima" pos:[15,580]  width:200 height:200


spinner range_Xa "Range distrib. +X" align:#center fieldWidth:60 range:[-30000,30000,1] pos:[15,140] 

spinner range_Xb "Range distrib. -X" align:#center fieldWidth:63 range:[-30000,30000,1] pos:[15,160] 

spinner range_Ya "Range distrib. +Y" align:#center fieldWidth:60 range:[-30000,30000,1] pos:[15,180] 

spinner range_Yb "Range distrib. -Y" align:#center fieldWidth:63  range:[-30000,30000,1] pos:[15,200] 


spinner range_rot_Xa "Range rotaz. +X" align:#center fieldWidth:60 range:[0,15,1] pos:[15,240] 

spinner range_rot_Xb "Range rotaz. -X" align:#center fieldWidth:63  range:[-15,0,1] pos:[15,260] 

spinner	range_rot_Ya "Range rotaz. +Y" align:#center fieldWidth:60 range:[0,8,1] pos:[15,280] 	

spinner	range_rot_Yb "Range rotaz. -Y" align:#center fieldWidth:63  range:[-8,0,1] pos:[15,300] 

spinner	range_rot_Za "Range rotaz. +Z" align:#center fieldWidth:60 range:[0,360,1] pos:[15,320] 

spinner	range_rot_Zb "Range rotaz. -Z" align:#center fieldWidth:63  range:[0,360,1] pos:[15,340] 


spinner	range_scl_Xa "Range scala +X" align:#center fieldWidth:60 range:[0,10,1] pos:[15,380] 

spinner	range_scl_Xb "Range scala -X" align:#center fieldWidth:63  range:[-10,10,1] pos:[15,400] 

spinner	range_scl_Ya "Range scala +Y" align:#center fieldWidth:60 range:[0,10,1] pos:[15,420] 

spinner	range_scl_Yb "Range scala -Y" align:#center fieldWidth:63  range:[-10,10,1] pos:[15,440] 

spinner	range_scl_Za "Range scala +Z" align:#center fieldWidth:60 range:[0,10,1] pos:[15,460] 

spinner	range_scl_Zb "Range scala -Z" align:#center fieldWidth:63  range:[-10,10,1] pos:[15,480] 



-- azioni	

	-- bottone "picca l'oggetto" premuto

	on clic_on_obj picked obj do

	( 

	--se l'utente non ha cancellato la selezione...

	if obj != undefined do (


		--se l'untente non l'ha fatto rendi l'oggetto rosso:

		obj.wirecolor = red

		--e mostra il nome dell'oggetto sul pulsante:

		clic_on_obj.text = obj.name		


		-- assegna alla variabile globale prendi l'oggetto selezionato

		prendi = obj


		)

	) 


	-- bottone "clicca il terreno" premuto

	on clic_terreno picked obj do

	( 

	--se l'utente non ha cancellato la selezione...

	if obj != undefined do (		

		clic_terreno.text = obj.name		

		-- assegna alla variabile globale terreno l'oggetto selezionato

		terreno = obj


		)

	) 


	-- bottone anteprima premuto	

	on anteprima pressed do 


		(		

		theBmp = render outputsize:[200,200] vfb:off

		anteprima.images = #(theBmp, undefined, 1,1,1,1,1 )

		)



	-- bottone copia premuto

	on copia pressed do (

		-- richiama la funzione "funziona_copia" con

		-- prendi - oggetto da copiare

		-- (n_copie.value as integer) n di copie da fare

		-- copy_type.state - tipo di copia

		-- copie contiene gli oggetti creati

		copie=funziona_copia prendi (n_copie.value as integer) copy_type.state		


		for obj in copie do ( -- le copie (o istanze fatte) devono essere posizionate a caso e si devono introdurre delle variazioni

									--	casuali di rotazione e scala entro certi valori per dare casualità agli alberi


			random_pos_x = random allControls.range_Xa.value allControls.range_Xb.value

			random_pos_y = random allControls.range_Ya.value allControls.range_Yb.value

			random_rot_x = random  allControls.range_rot_Xa.value allControls.range_rot_Xb.value

			random_rot_y = random  allControls.range_rot_Ya.value allControls.range_rot_Yb.value

			random_rot_z = random  allControls.range_rot_Za.value allControls.range_rot_Zb.value

			random_scl_x = random allControls.range_scl_Xa.value allControls.range_scl_Xb.value

			random_scl_y = random allControls.range_scl_Ya.value allControls.range_scl_Yb.value

			random_scl_z = random allControls.range_scl_Za.value allControls.range_scl_Zb.value


			obj.pos = [random_pos_x, random_pos_y,0]

			obj.rotation = EulerAngles random_rot_x  random_rot_y  random_rot_z

			obj.scale = [random_scl_x, random_scl_y,random_scl_z]


		)



		if terreno != undefined then (	--queste righe servono per piantare sul terreno (anche a seconda dell'altezza) le varie copie

		dacancellare=#()					

			for obj in copie do (

				piantatore = ray [obj.pos.x,obj.pos.y,100000] [0,0,-1]

				pospiantaggio = intersectray terreno piantatore

				if pospiantaggio != undefined then (

					obj.pos = pospiantaggio.pos

				qq

				) else (

					append dacancellare obj

				)

			)


		) else (


		)



	)-- fine bottone premuto


) -- fine rollout



-- creazione rollout

createdialog allControls width:230 height:800

Share this post


Link to post
Share on other sites

ovviamente i valori dei range devono essere modificati a seconda delle esigenze....come ad esempio l'area all'interno della quale l'oggetto deve essere "scatterato"

scatterscreenshot.jpg


Edited by neutrino

Share this post


Link to post
Share on other sites

sembra molto interessante,... grazie per la condivisione di un lavoro che avrà richiesto certamente molto tempo e fatica... (io personalmente non ci capisco una mazza di script...)

appena riseco lo provo e posto i risultati...

saluti!

Share this post


Link to post
Share on other sites
Guest

Interessante... me lo segno e appena avrò tempo sperimento...

Grazie della condivisione

Mat

:hello:

Share this post


Link to post
Share on other sites

Ho provato ad usarlo con un vrayproxy e funziona.....devo prenderci un po di confidenza ma senza dubbio è un bel lavoro, bravo


Edited by klone

Share this post


Link to post
Share on other sites

Splendido, queste cose gratuite per la generazione veloce di ambienti realistici sono la salvezza della grafica... :Clap03:

Una domanda: 4 righe veloci sulla funzione dei parametri? Ho provato a smanettarci sopra ma non ho compreso in che modo tutte quelle voci interagiscono tra loro... :blink2:

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...