Vai al contenuto
Druigant

Script: Pf, Fare Un Birth A Tempo

Recommended Posts

Ciao, spero qualcuno sappia un minimo di script d max.

in pratica vorrei creare delle particelle, non in modo continuativo ma ogni X frame. magari ocn la possibilità anche id avere un range per questa X. tipo ogni X +-5 ! capit?

ciaoooo

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

credo che questo vada bene:

on ChannelsUsed pCont do

(

	 pCont.useTime = true

	 pCont.useAge = true

	 pCont.usePosition = true

	 pCont.useSpeed = true

)


on Init pCont do 

(

 	global newBirthFrame

	newBirthFrame=0

)


on Proceed pCont do 

(

	birthEveryNframe=10

	birthEveryNframeVariation=1

	emitEnd=110


	t1 = pCont.getTimeStart() as float

	t2 = pCont.getTimeEnd() as float

	if (t1 < 0) then (t1 = 0) 


	if (t2 < emitEnd*160) do 

	(

		for i=(t1/160+1) to (t2/160) do

		(

			curTime = 160*i as float

			if i>=newBirthFrame then

			(

				pCont.AddParticle()

				pCont.particleIndex = pCont.NumParticles() -- last particle that was added

				pCont.particleTime = curTime/160

				pCont.particleAge = 0

				sh = 2*sin(5*curTime)

				ang = 0.2*curTime

				pCont.particlePosition = [sh*sin(ang), sh*cos(ang), 0]

				pCont.particleSpeed = [0.01*sin(ang), 0.01*cos(ang), -0.005]


				newBirthFrame+=birthEveryNframe+random -birthEveryNframeVariation birthEveryNframeVariation

			)	

		)

	)

)


on Release pCont do 

(


)
in questo punto puoi andare a definire il tuo intervallo X e la variazione, oltre al frame in cui lo script smette di creare particelle.
on Proceed pCont do 

(

	birthEveryNframe=10

	birthEveryNframeVariation=1

	emitEnd=110
ATTENZIONE:come soluzione veloce per creare sto script ho usato una variabile globale. Se usi questo script in più sistemi particellari della stessa scena avrai sicuramente dei problemi. Per ovviare dovresti rinominare la variabile da sistema a sistema. Se invece nella tua scena hai un solo sistema particellare che usa questo birth script allora non dovresti avere problemi. Un'altra soluzione sarebbe quella di usare il channel integer delle particelle e memorizzare nell'ultima particella creata il frame in cui creare la successiva. Solo che se per la tua animazione hai bisogno di usare quel canale la cosa si complica. Comunque ho fatto anche questa versione:
on ChannelsUsed pCont do

(

	 pCont.useTime = true

	 pCont.useAge = true

	 pCont.usePosition = true

	 pCont.useSpeed = true

	 pCont.useInteger=true

)


on Init pCont do 

(

)


on Proceed pCont do 

(

	birthEveryNframe=10

	birthEveryNframeVariation=1

	emitEnd=110


	newBirthFrame=0

	if pCont.NumParticles() !=0 then

	(

		pCont.particleIndex = pCont.NumParticles()

		newBirthFrame=pCont.particleInteger

	) 



	t1 = pCont.getTimeStart() as float

	t2 = pCont.getTimeEnd() as float

	if (t1 < 0) then (t1 = 0) 


	if (t2 < emitEnd*160) do 

	(

		for i=(t1/160+1) to (t2/160) do

		(

			curTime = 160*i as float

			if i>=newBirthFrame then

			(

				pCont.AddParticle()

				pCont.particleIndex = pCont.NumParticles() -- last particle that was added

				pCont.particleTime = curTime/160

				pCont.particleAge = 0

				sh = 2*sin(5*curTime)

				ang = 0.2*curTime

				pCont.particlePosition = [sh*sin(ang), sh*cos(ang), 0]

				pCont.particleSpeed = [0.01*sin(ang), 0.01*cos(ang), -0.005]


				newBirthFrame+=birthEveryNframe+random -birthEveryNframeVariation birthEveryNframeVariation


				pCont.particleInteger=newBirthFrame

			)	

		)

	)

)


on Release pCont do 

(


)

non so se sono riuscito a spiegarmi molto bene.. se hai bisogno son qua.

Comunque ricorda che gli script non sono testati e quindi potrebbero crearti dei problemi, non ho responsabilità di eventuali problemi causati da questi script.

ciao ciao


Modificato da coren

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

si può animare l'emit start.

Per l'emit stop purtroppo nell'operatore birth script non è presente, però si potrebbe ovviare assegnando al PFsource un custom attribute di tipo float, associarlo ad uno spinner ed animarlo, poi nello script al posto della riga :

 emitEnd=110

in cui si associa un valore statico, gli si va a mettere il valore del custom attribute.

Intendevi questo?

ciao

p.s.

@Druigant la fattura mandala a maxscript ;)


Modificato da coren

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

No, no, la mia domanda era molto più banale: tempo fa ho provato a fare uno script in excel per fare l'intermittenza dell'emettitore, ma poi mi sono accorto che lo pseudo script (una riga) modificava l'emit start e stop ma lo faceva una volta sola, percui mi sono messo a cercare come modificarlo durante un'animazione, ma alla fine ho dedotto che non si potesse animare, azzardando un'ipotesi senza poi verificarla.

Come non detto. Grazie.

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

@ruezzana

di nulla!!

@druigant

basta aggiungere una variabile all'inizio del 'Proceed ' per il numero di particelle da creare, ed una per la variazione:

	birthAmount=10

	birthAmountVariation=2
poi prendere il blocco che crea la particella:
					pCont.AddParticle()

					pCont.particleIndex = pCont.NumParticles() -- last particle that was added

					pCont.particleTime = curTime/160

					pCont.particleAge = 0

					sh = 2*sin(5*curTime)

					ang = 0.2*curTime

					pCont.particlePosition = [sh*sin(ang), sh*cos(ang), 0]

					pCont.particleSpeed = [0.01*sin(ang), 0.01*cos(ang), -0.005]
e racchiuderlo dentro ad un for che reitera la creazione per un numero di volte pari a 'birthAmount' e variato da 'birthAmountVariation', così:
				for j=1 to (birthAmount+random -birthAmountVariation birthAmountVariation) by 1 do

				(

					pCont.AddParticle()

					pCont.particleIndex = pCont.NumParticles() -- last particle that was added

					pCont.particleTime = curTime/160

					pCont.particleAge = 0

					sh = 2*sin(5*curTime)

					ang = 0.2*curTime

					pCont.particlePosition = [sh*sin(ang), sh*cos(ang), 0]

					pCont.particleSpeed = [0.01*sin(ang), 0.01*cos(ang), -0.005]


				)--for j=1
quindi il tutto diverrà:
on ChannelsUsed pCont do

(

	 pCont.useTime = true

	 pCont.useAge = true

	 pCont.usePosition = true

	 pCont.useSpeed = true

)


on Init pCont do

(

	global newBirthFrame

	newBirthFrame=0

)


on Proceed pCont do

(

	birthEveryNframe=10

	birthEveryNframeVariation=1

	emitEnd=110

	birthAmount=10

	birthAmountVariation=2


	t1 = pCont.getTimeStart() as float

	t2 = pCont.getTimeEnd() as float

	if (t1 < 0) then (t1 = 0)


	if (t2 < emitEnd*160) do

	(

		for i=(t1/160+1) to (t2/160) do

		(

			curTime = 160*i as float

			if i>=newBirthFrame then

			(

				for j=1 to (birthAmount+random -birthAmountVariation birthAmountVariation) by 1 do

				(

					pCont.AddParticle()

					pCont.particleIndex = pCont.NumParticles() -- last particle that was added

					pCont.particleTime = curTime/160

					pCont.particleAge = 0

					sh = 2*sin(5*curTime)

					ang = 0.2*curTime

					pCont.particlePosition = [sh*sin(ang), sh*cos(ang), 0]

					pCont.particleSpeed = [0.01*sin(ang), 0.01*cos(ang), -0.005]


				)--for j=1 


				newBirthFrame+=birthEveryNframe+random -birthEveryNframeVariation birthEveryNframeVariation


			)  --if i>=newBirthFrame then  

		)--for i=(t1/160+1) to (t2/160) do

	)-- if (t2 < emitEnd*160) do

)--on Proceed pCont do


on Release pCont do

(


)

Comunque in teoria si potrebbe fare anche con la precedente versione dello script, ti basterebbe aggiungere uno spawn operator che di "moltiplicherà" la singola particella, per averle posizionate sull'emitter dopo lo spawn aggiungi un 'positionIcon' o 'position object' o quello che vuoi ed il gioco è fatto.

ciao!!

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora

  • Navigazione recente   0 utenti

    Non ci sono utenti registrati da visualizzare in questa pagina.

×