Vai al contenuto
Alessandro

Richiesta Script Per Particle Flow

Recommended Posts

Ciao vorrei proporre,a chi ne capisce,la realizzazione di uno script per PF che misuri la distanza relativa tra tutte le particelle e nel caso che questa superi un certo valore impostato proceda alla cancellazione della particella(isolata).Mi spiego meglio se una particella è troppo lontana dalle altre vorrei che venisse cancellata.Questo sarebbe particolarmente comodo per gestire polveri e fumi composti da migliaia di particelle,inquanto assicurerebbe una forma omogenea della nube anche in presenza di forti turbolenze.Se poi si riuscisse a gestire l'opacità di ogni particella in base alla distanza dalle altre vicine sarebbe ancora meglio.

Spero di essermi spiegato.Credo che questo script,se fosse possibile da realizzare,aumenterebbe drasticamente le capacità realizzative di particle flow.

Aggiungo uno schemino per farmi capire meglio

post-615-1153259451_thumb.jpg

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

mi intriga sta cosa.... ora provo a darci uno sguardo.....

Non prometto niente pero(più che altro per l'opacità)

Oggi lavoro, però per stasera spero di riuscire a dirti qualcosa di certo..

ciao!!!!!

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
Inviata (modificato)

E' fattibile, sicuramente bisogna provare.

I problemi, secondo me, sarebbero due: nel caso di cancellazione secca avresti effetti popping, tipo un frame c'è e quello dopo scompare subito: se la particella è isolata te ne accorgi subito e avresto effetti di bolle che scoppiano.

Gestire l'opacità non sarebbe una cosa troppo difficile se usassi l'operator material di pflow: ma se vuoi far intervenire i voxel la cosa diventa quasi impossibile (a spanne).

Stavo pensavo adesso che invece che cancellare direttamente la particella lontana si può pensare di ridurre la scala... mmmm vediamo, di sicuro però se vuoi fare una cosa inter-particle (cioè calcolo tra particella-particella) preparati a una cosa veramente leeeeeeeenta in termini di prestazioni.

Se ho tempo faccio qualche esperimento anch'io :)


Modificato da kage_maru

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

ma cos'è voxel?

Io avevo pensato alla scalatura progressiva, solo che se bisogna fare l'effetto del fumo che svanisce bisogna per forza fare una un'opacità che diminuisce...

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
I problemi, secondo me, sarebbero due: nel caso di cancellazione secca avresti effetti popping, tipo un frame c'è e quello dopo scompare subito: se la particella è isolata te ne accorgi subito e avresto effetti di bolle che scoppiano.

Assegnando alle particelle una opacità inversamente proporzionale alla distanza e regolando i parametri in modo da effettuare la cancellazione solo quando la distanza è tale da portare la particella in questione alla totale trasparenza il primo problema sarebbe risolto; si potrebbe intanto sperimentare questa via...

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

la distanza rispetto cosa però?

Verso il baricentro delle particelle non si può, quindi credo vada fatto come media delle distanze tra la particella presa in esame e le N particelle più vicine.

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
Assegnando alle particelle una opacità inversamente proporzionale alla distanza e regolando i parametri in modo da effettuare la cancellazione solo quando la distanza è tale da portare la particella in questione alla totale trasparenza il primo problema sarebbe risolto; si potrebbe intanto sperimentare questa via...

Sì infatti è quello a cui stavo pensando io: il problema al quale mi riferivo era la richiesta iniziale di cancellare istantaneamente ogni particelle che superava una tot distanza.

Il problema opacità gestita in questa maniera sarebbe ok (e come ho detto prima mi sembra a spanne una cosa fattibile), il problema al quale mi riferivo era gestirne la trasparenza nel caso subentrassero voxel tipo afterburn o pyrocluster.

Mmmmmm bisogna sperimentare

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
Inviata (modificato)

grandi ragazzi che vi state appassionando!Per quanto riguarda l'opacità e i voxel mi viene in mente che si potrebbe creare lo script sotto forma di uno SCRIPT TEST che mandi all'evento successivo(2) le particles lontane,a questo punto applicando un age test(basato su durata evento2)tipo di 3 frame che invia a un event3(DELETE),si avrebbero le particelle e i voxel che scompaiono gradatamente.INsomma si basa sull'idea che quando una particella esce dal gruppo comincia a invecchiare e in 3/4 frame muore.

Non sarà precisissmo come farli svanire in funzione della distanza,ma giocando con tolleranze di distanza ragionevoli e con i frame di vita dovrebbe dare buoni risultati.In ogni caso io proporrei lo script come SCRIPT TEST in modo da avere più flessibilità.


Modificato da Alessandro

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
Inviata (modificato)

Eh ma il problema sta proprio nel fatto che non puoi far morire "gradatamente" le particles. Quindi in caso di voxel si potrebbe agire sulla scala. Ragionandoci su però mi è venuto in mente che si possono fare delle expression anche su AB e pyrocluster, però non so fino a che punto ci potremmo spingere.

Ripeto se ho tempo un'occhiata ce la butto :)


Modificato da kage_maru

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
Inviata (modificato)

No invece si può,mi ero sbagliato nel messaggio prima non tramite un age test(che non riazzera il particle age)ma attraverso uno SPAWN test che opportunamente settato riazzera il particle age senza modificare numero posizione e direzione delle particelle a cui è applicato,solo le sostituisce con altre appena nate e che quindi hanno un età utilizzabile.

Ho appena provato fidati ci si riesce.L'inconveniente però e che le particelle in posizione giusta non possono avere nulla di legato alla loro età quindi in afterburn non andrebbe bene come metodo.In ogni caso io proverei prima a fare lo script della morte secca che da quello che ho capito dovrebbe essere di facile relizzazione per vedere che effetti crea,considera che avevo proposto questo script per particelle della grandezza di un pixel ovvero effetti creati dalla quantità di particelle e non dalla qualità.Per capirsi effetti come la sabbia in hulk quando lotta contro il carro armato(che come spiegato da uno dell'ILM al futurfilm festival,niente voxel ma solo milioni di micro particelle e effetti di compositing)


Modificato da Alessandro

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Ma no che non puoi far morire le particelle gradualmente!

Nel senso che il delete scatta a un tot frame, non ci puoi fare niente, quindi comunque o come avevo detto prima di particelle ce ne sono un fracco e quindi non lo noti oppure se la particelle singola è isolata e lontana dal resto del gruppo vedi del popping tipo palloncini che scoppiano.

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

ma il delete di che?Ti dico di non ucciderle da script ma mandarle all'evento successivo poi con particle flow da solo si riesce a farle scomparire alla velocità che vuoi.Ho provato oggi

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
Inviata (modificato)

Allora descrivimi cosa intendi tu per farle morire... ^_^

Scalare, rendere invisibili, fargli fare seppuku, cosa?

A casa mia, e ti assicuro che io ci campo usando pflow, per "cancellare" una particella, come hai scritto pure nel tuo schizzo, la traduzione fa proprio delete ^_^


Modificato da kage_maru

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
Inviata (modificato)

scusa una particella muore dopo 10 frame di vita,con un materiale a cui è applicato un particle age nell'opacità questa sparisce in 10 frame e non di botto.Dov'è il problema?Ti ho già detto che c'è la possibilità di riazzerare la vita delle particelle appena lo script le ha giudicate lontane dopo ci applichi un operatore delete(particle age es 4)queste spariscono in 4 frame e non di botto.Il punto sta solo nel fare uno script test che invii all'evento successivo le particelle giudicate isolate.

Dicevo delete di che perchè pensavo intendessi inserire il comando cancellazione all'interno dello script,non perchè non sapessi il significato di delete...

In ogni caso qual'è il comando di codice per fare misurare la distanza intraparticellare a ParticleFlow?Io nell'elenco comandi dello script di esempio non l'ho trovato


Modificato da Alessandro

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
Inviata (modificato)
scusa una particella muore dopo 10 frame di vita,con un materiale a cui è applicato un particle age nell'opacità questa sparisce in 10 frame e non di botto.Dov'è il problema?Ti ho già detto che c'è la possibilità di riazzerare la vita delle particelle appena lo script le ha giudicate lontane dopo ci applichi un operatore delete(particle age es 4)queste spariscono in 4 frame e non di botto

Il problema è proprio questo, ed è secondo me il limite di quello che non capisci (o meglio io non riesco a spiegarti :D): se tu dai un age test tipo di 5 frame a una particelle poi gli metti un operator delete, non è che tra 0 e 4 muore lentamente tipo, al primo frame è morta un quinto, al secondo è morta due quinti e così via.

Semplicemente la particella è uguale identica (si parla di vita-morte) da 0 a 4 e al 5 frame viene cancellata: non ci si può sbagliare, è un'operazione booleana!

Se tu non assegni nessun altro cambiamento hai un effetto di popping, soprattutto se queste particelle se ne vanno isolate e sono poche di numero.

Se poi parliamo di assegnare un particle age nell'opacità è un conto, ed entriamo come ho detto prima in unaltro ambito (shading-scale per esempio). Ma i problemi che io stavo tirando fuori in merito a queste soluzioni erano in caso di utilizzo di voxel, non semplice 3ds out-of-the-box.

La distanza inter-particle secca non ce l'hai con pflow, e questo è probabilmente il suo limite maggiore, bisogna trovare un metodo per aggirare questa mancanza. Anche perchè credo che se fosse stato possibile l'avrebbero già inserito un operator/test del genere.


Modificato da kage_maru

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

dunque, ho un problema con lo script.

ho messo questo codice nel test scriptato per verificare se ero io che sbagliavo o il maxscript:

format"Con 1:%   \n" (pCont.GetParticlePositionByID 1)

		format"Con 2:%   \n" (pCont.GetParticlePositionByID 2)

Ora, scrivendo pCont.GetParticlePositionByID 1 dovrei vedermi restituita la posizione della particella con ID 1.

Se scrivo pCont.GetParticlePositionByID 2 dovrei avere quello della 2, così non avviene, mi dà sempre quella stessa identica di quando metto come valore 1.

pCont.GetParticlePositionByID non dovrebbe essere indipendente da pCont.particleIndex?

Non riesco a capire perchè mi fa così....

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

ah...quanto vorrei poterti aiutare...ma per me ste cose sono alla stregua delle supercazzole,proprio gna fò.

Ah..se anche Philix prendesse a cuore il progetto...

ah...se gli scripts nascessero sugli alberi....

Va beh,la smetto.

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Dunque, questo è quello che ho prodotto.

Si può agire su due valori:

N- definisce il numero massimo di distanze da tenere per la media.

Tolleranza- valore minimo per la media per far passare ad una particella il test

on ChannelsUsed pCont do

(

	 pCont.usePosition = true

)


on Init pCont do 

(


)


on Proceed pCont do 

(

	count = pCont.NumParticles()


--numero di campioni da tenere

	N=20


--distanza entro la quale la particella non passa all'evento successivo

	Tolleranza=2000


	vet_posizioni=#()

	for i in 1 to count by 1 do

	(

		pCont.particleIndex = i

		posizione=pCont.particlePosition as point3

		append vet_posizioni posizione

	)--end for i in 1 to count by 1 do



	for i in 1 to count by 1 do

	(

		pCont.particleIndex = i

		posizione=pCont.particlePosition as point3

		vetDati_dist=#()


		for j in 1 to count do

		(

			if((j)!=(i))do

			(

				temp_dist= (abs (distance vet_posizioni[j] posizione)) as float


				append  vetDati_dist  temp_dist

				sort vetDati_dist


				if(vetDati_dist.count>N)then

				(

					deleteItem vetDati_dist (N+1)

				)--end if(vetDati_Coord.count<N)then


				Med=0.0


				for distanza in vetDati_dist do

				(

					Med+=distanza

				)


				Med=Med/(vetDati_dist.count)



				if Med>Tolleranza do

					pCont.particleTestStatus = true

			)--endif

		)--end for j in l to count do

	)--end for i in 1 to count do

)--end on Proceed pCont do 



on Release pCont do 

(


)

Non è perfetto, sicuramente è migliorabile.

Mi è venuta in mente la soluzione al problema mentre ero fuori e appena sono tornato a casa l'ho terminato(sono malato.. lo so)

Se avete suggerimenti per migliorarlo li ascolterò volentieri!!!!!!!

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.

×