Sei sulla pagina 1di 10

Partycles

Particle System Artist


Il lavoro del Particle System Artist comprende la comprensione di:

- Risultati visibilità di rendering

- Principi di animazione

o Anticipation, Secondary action: cosa succede prima di una detonazione

o Exaggeration, Squash & Stretch: spinge l’effetto più lontano di quanto pensi

o Timing: aumenta l’intensità emozionale

- L’abilità di visualizzare una reference per un effetto, spacchettarla e ricrearla in un game engine in
tempo reale

- Agire come ponte tra gli artisti e i programmatori che lavorano a un gioco

o Gli art assets devono essere semplici da integrare nel gioco, senza sacrificare né la visione
artistica né i limiti tecnici della piattaforma scelta

- Forte conoscenza degli effetti ambientali, simulazioni di vestiti, luci e dinamiche

- Photoshop, Maya, Adobe After Effects e 3D Studio Max

- Esperienza nel creare real time shaders ed effetti in post-process

- Lavorano alla fine della pipeline, ottenendo di più in meno tempo

Panello di un Particle Effect nella Scena


Comparirà selezionando un Particle Effect all’interno di una scena e permette di vederne i dati e di
simularlo anche non in play. Simulate Layers permette di avere un’anteprima di più particle, anche se non
sono in una relazione di parentela.

Attributi
I valori sono in Start e OverLifetime. Se sono basati su gradienti/curve, il tempo normalizzato è

- Valore Start: (SystemAge % Duration) / Duration

- Valore OverLifetime: ParticleAge / Particle Lifetime

o Moltiplicato per il valore Start. Applicato per uno scalare o un colore

 Dimensione: StartSize * SizeOverLifetime(t)


 Se StartSize è 0, anche se SizeOverLifetime dovesse andare a 1, il risultato sarà
sempre 0

o StartSpeed non è il valore iniziale della Velocity

- Main:

o Duration: tempo prima che inizi un nuovo loop

o Prewarm

o SimulationSpace: Local/World

o ScalingMode: supporta ufficialmente solo valori uniformi

 Local: se il parente scala, non ci sono cambiamenti (rimane a 0,0,0)

 Hierarchy: sia i Particle che la Shape scalano

 Shape: scala solamente la shape

o StartColor: non è ColorOverLifetime

 È buona norma utilizzare un colore loopable

 Particle/Additive Shader RGB = White

o StartSpeed: non è SpeedOverLifetime

 Se utilizziamo un gradiente con il colore centrale impostato sul rosso come


StartColor e impostiamo a 0 lo StartSpeed, vedremo solo particelle rosse sul
pavimento.

- Emission:

o RateOverTime: quante particelle emette al secondo

o RateOverDistance: può essere usato in combinazione con RateOverTime e indica quante


particelle emesse per unità di movimento. Un valore di 100 significa che se lo muovo di 1
unità, emetterà 100 particelle. In caso 100 fosse il numero massimo di particelle esistenti,
dovrò attendere DurationTime prima di poterle emettere di nuovo

o Bursts: simula un’emissione in successione e vengono emesse anche se


RateOverTime/Distance sono impostati a 0

- Shape:

o Can be on a 2D – 3D Shape/Mesh
o Spread: punti su cui sono distribuite le particelle emesse

 0: vengono distribuite lungo tutta la circonferenza

 1: vengono distribuite tutte in un solo punto

o Mode: Random/Loop/PingPong

o AlignToDirection

o SpherizeDirection: Box/Volume

o Texture: la texture deve avere Read/Write abilitato

 È possibile impostare un valore soglia per un canale sotto il quale la particella non
viene emessa

 Particelle possono fare il sample del colore dalla texture

o Mesh:

 SingleMaterial: emette solo da un material specifico della mesh

 RandomizePosition: si può creare un’animazione per rivelare la mesh da cui si sta


emettendo

- Velocity Over Lifetime

o Permette di variare la velocità sugli assi durante la vita della particella

- Limit Velocity Over Lifetime

o Drag: basato sulla dimensione (particelle più grandi hanno minor velocità) e sulla velocità
(partendo da una velocità negativa e andando verso una positiva, il drag diventa più
evidente)

- Inherit Velocity

o Initial: la particella emessa al tempo t prende la velocità tangenziale istantanea al tempo t


dell’emettitore

o Current: la particella emessa al tempo t prende la velocità istantanea corrente


dell’emettitore (un valore di 1 farà sì che la particella stia esattamente dove sta
l’emettitore, avendo la stessa velocità)

- Force Over Lifetime

- Color Over Lifetime

- Color By Speed
External Forces
Windzone:

- Influence Area: Directional (senza limiti), Spherical

- Main: forza principale

- Turbolence: variazione principale

- PulseMagnitude: è una forza addizionale che si aggiunge alla forza Main in accordo alla Frequency
per creare un effetto più naturale

Impostare un PulseFrequency o PulseMagnitude per avere un vento costante uniforme.

Multiplier: scala la forza applicata a questo particle system dalla Windzone

Collisioni
Le particelle hanno un collider circolare.

- World/Plane collisions: le particelle possono rimbalzare tra più piani (infiniti, la dimensione è solo
per poterli vedere)

- Dampen: quando una particella collide, perde una frazione della propria velocità

- Bounce

- Lifetime Loss: quando una particella collide, perde una frazione della propria StartLifetime

- Min/Max Kill Speed: se una particella esce fuori dal range [min, max], muore nella collisione

- Max collision shapes: i terreni hanno la priorità

- Radius Scale: i collider sono scalati per questo valore

- Send Collision Message

o OnParticleCollision(GameObject objVal): se invocato da uno script attaccato a un game


object con il collider, objVal è il particle system, altrimenti se invocato dal particle system, è
il game object

o ParticleSysyem.GetCollisionEvents(GameObject objVal, List<ParticleCollisionEvent>


cEventList): può essere usato per recuperare tutte le collisioni che avvengono sul game
object

 cEventList[i].intersection/normal/velocity

Per recuperare le informazioni sul particle system, dobbiamo accedere ai suoi moduli:
particleSystem.main.startSpeed.constantMax (accede al modulo main)
Scripting
Per accedere al particle system si usa un metodo “allocation free”, in quanto l’array di particle è già
preallocato. Solo una piccola parte dell’array delle particle potrebbe essere usato, in quanto dipende da
quante particelle sono vive nel sistema quando si richiama GetParicles().

- ParticleSystem.Particle[] particles = new


ParticleSystem.Particle[ParticleSystem.main.maxParticles]

- int numParticlesAlive = ParticleSystem.GetParticles(Particle[] particles)

- ParticleSystem.SetParticles(m_Particles, numParticlesAlive)

Per cambiare le proprietà del particle system, bisogna accedere ai suoi moduli

ParticleSystem.EmissionModule emissionModule = GetComponent<ParticleSystem>().emission


emissionModule.enabled = true
emissionModule.rateOverTime = 15

Non si assegna nuovamente al particle system il modulo, in quanto sono un’interfaccia interna al sistema.

Attraverso la classe ParticleSystem.MinMaxCurve è possibile descrivere il cambio di un valore attraverso il


tempo. Abbiamo a disposizione 4 modi:

- Constant

- Random Between 2 Constants

- Curve: salvato in 2 modi a seconda se abbia o meno più di 3 chiavi (in caso è possibile ottimizzarla)

- Random Between 2 Curves

È possibile valutare la curva via script attraverso MinMaxCurve.Evaluate(). Queste curve possono essere
usate anche al di fuori di un Particle System.

Trigger
Modifica i particle quando interagiscono con un Physic Collider e permette di avere più controllo sugli
eventi di collisione e trigger rispetto al modulo collision in quanto non ci sono risposte automatiche e
modifica le particle in una callback OnParticleTrigger() in uno script del Particle System.
Sono disponibili gli eventi: Inside/Outside/Enter/Exit

Per modificare le particelle che hanno attivato il trigger:


- Prendere le particelle: ParticleSystem.GetTriggerParticles(ParticleSystemTriggerEventType.Enter,
List<ParticleSystem.Particle> enter)

- Iterare su di loro e modificarne il comportamento/le proprietà

- Reimpostarle nel Particle System: ParticlePhysicsExtension.SetTriggerParticles(ParticleSystem,


ParticleSystemTriggerEventType, Particle[], offset, count)

Sub Emitters
Sono utili per effetti come: fuochi d’artificio, pioggia, bombe, esplosioni, etc. Possono ereditare le proprietà
Start del Particle System padre.
I trigger per i SubEmitter sono Birth, Collision e Death.

Trail Renderer
Permette di lasciare un trail dietro il GameObject mentre si muove, sottolineando il percorso o
enfatizzandone il movimento e dovrebbe essere l’unico Renderer usato sull’oggetto.

- MinVertexDistance: quanto lontano l’oggetto che contiene il trail deve viaggiare prima che un
segmento del trail venga solidificato

- Corner/Endcap Vertices: rifinisce la geometria alla fine in mezzo ai segmenti del trail

- Autodestruct: distrugge l’oggetto se non si muove per Time secondi

Il Trail Renderer spesso produce artefatti, sarebbe meglio, quindi, usare altri prodotti nello store

Trails
Come il TrailRenderer, permette di lasciare una scia dietro le particelle. Il material del trail è impostato nel
modulo Renderer. Per poter renderizzare solo i trail, va impostato RenderModule/RenderMode: None.

- WorldSpace: se attivato, il trail si muove in WorldSpace anche se il sistema usa il LocalSpace

- TextureMode: come viene ripetuta la texture del trail

- GenerateLightingData: calcola anche le normali e le tangenti

- Mode:

o Particle:

 Ratio: probabilità per ogni particella di avere un trail

 MinVertexDistance: distanza che la particella deve avere prima che il suo trail
riceva un nuovo vertice

o Ribbon:
 RibbonCount: quanti ribbon renderizzare attraverso il particle system

 1: crea un singolo ribbon connettendo ogni particella

 N>1: crea ribbon che connettono ogni N particelle

o Es 2: un ribbon connette le particelle 1, 3, 5 e uno le 2, 4, 6 con


l’ordine impostato in base alla loro età

Force Field
Il particle system, per interagire con un Force Field, deve avere il modulo External Forces attivo. La
proprietà Focus agisce come uno spazio interno dove le particelle sono attratte. È un valore normalizzato
tra 0 (il centro del Force Field) e 1 (raggio finale).

Noise
Basato sul Curl Noise, è un campo vettore. Il Curl è un operatore vettore che descrive la rotazione
infinitesimale di un campo vettore all’interno di uno spazio Euclideo tridimensionale. Si possono calcolare i
Curl in uno spazio usando una Curl Function che faccia il sample delle celle vicine. Il Curl Noise, quindi, è
una Curl Function del Perling Noise (un tipo di rumore-gradiente sviluppato da Ken Perlin negli anni 80 per
Tron). È usato per la simulazione di gas e fluidi.
Perling Noise > Perling Noise Vector Field > Curl Noise Vector Field

Il noise permette di aumentare il movimento errante delle particle

- Octaves: aggiunge un livello di rumore (computazionalmente costoso)

- Scroll: muove il campo di noise per cambiarne il pattern

- Quality: quanti sample unici di rumore sono generati

o 1D e 2d: riusano sempre gli stessi sample lungo gli assi combinandoli in modo differenti per
nascondere il riuso, con un beneficio importante sulle prestazioni

- Damping: se abilitato, Strength è proporzionale alla Frequency

Noise Remap
I valori del rumore sono normalizzati sull’asse della X e sono rimappati usando una funzione curva.
Permette inoltre di definire una forma personalizzata del rumore, anche potendolo togliere completamente
in alcuni range. Curve casuali faranno sembrare il rumore meno prevedibile.

Renderer
- Renderer Mode:
o Billboard: per le particle rappresentanti volumi che vengono visti allo stesso modo da tutte
le direzioni (nuvole)

o Stretched Billboard: tecnica “Stretch & Squash” applicata alle particle, allineate per vedere
la camera

o Mesh:

- Normals:

o 1: la normale punta verso la camera

o 0: la normale punta verso la direzione angolare della particella

- Sorting Fudge: deve essere un valore basso se si vuole che il sistema appaia davanti le altre particle
o altri oggetti trasparenti

- Pivot: se la dimensione del particle cambia e il pivot rimane lo stesso, la posizione cambia

- Render Alignment: Facing vs View

Lights
Aggiunge luci alle particle e supporta lo Shadow Casting (ha un costo elevato). Le luci possono ereditare il
colore dalle particle.
Il numero di luci emesse dal sistema dipende da:

- LightModule/Maximum Light

- Material shader usati sulle superfici illuminate

- Edit/Project Settings/Quality/PixelLightCount (se viene usato il Forward Rendering)

L’attributo Ratio in caso RandomDistribution fosse disabilitato, rappresenta la percentuale di particelle che
avrà le luci, altrimenti la probabilità che ogni particella abbia la luce.

Custom Data
Definisce nell’editor 2 formati di dati personalizzati (Vector4/Color) che possono essere attaccati alle
particle. Possono essere impostati anche attraverso gli script. Genera dati personalizzati per ogni particella
che possono essere usati sia negli script che negli shader.

Script

- List<Vector4> cData = new List<Vector4>();

- ParticleSystem.GetCustomParticleData(cData, ParticleSystemCustomData.Custom1);

- Ritorna la lista nello stesso ordine delle particle nel GetParticles(); e questo è utile, perché se uno di
questi valori è una curva da 0 a 10, la particles[i] a tempo normalizzato 0.5 avrà un valore 5
Shaders

- Passato attraverso un canale TEXCOORD

- Abilitato nel Renderer Module

Performances
RingBuffer
Una volta che la lista di particle raggiunge il numero massimo di particle, non ne possono più apparire altre.
Nel RingBufferMode invece di morire quando il Lifetime finisice, la particle rimane in vita finché il buffer
MaxParticle non è pieno per poi essere rimpiazzata da una particle nuova.

- PauseUntilReplace: effettua la normale animazione del particle, ma invece di farla morire e


rimuoverla alla fine, rimane viva in uno stato di pausa

- LoopUntilReplace: imposta un punto di loop, così può effettuare continuamente l’animazione tra
due punti di loop così che quando dovrà essere rimossa, farà il loop rimanente (?)

Le prestazioni per valutare una curva sono differenti

I particle system sono:

- Multithreading

- SIMD Math Library (operazioni su vettori 4D in una singola istruzione, 2.5x più veloci)

- Procedural Mode

o Può predire lo stato di un sistema in ogni momento e questo significa che non dobbiamo
aggiornarlo continuamente anche se fuori dallo schermo

o Se si vuole fare una simulazione di un sistema, si può saltare in un punto preciso


istantaneamente

 Questa funzione è persa se si abilitano alcuni moduli come:


 Collisions

 RateOverDistance

 SimulationSpaceWorld

- AnimationClips può contenere tutte le proprietà di un Particle System. Può migliorare le prestazioni