Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

Controllare migliaia di pesci con le particelle

Il problema con MeshInstance3D è che è costoso aggiornare il suo array di trasformazione. È ottimo per posizionare molti oggetti statici attorno alla scena, ma è comunque difficile muoverli.

Per far muovere ogni istanza in maniera interessante, useremo un nodo GPUParticles3D. Le particelle sfruttano l'accelerazione GPU calcolando e impostando le informazioni per istanza in uno Shader.

Innanzitutto crea un nodo Particles. Poi, sotto "Draw Passes", imposta "Draw Pass 1" del nodo Particles sul tuo Mesh. Poi, sotto "Process Material", crea un nuovo ShaderMaterial.

imposta shader_type su particles.

shader_type particles

Poi aggiungi le seguenti due funzioni:

float rand_from_seed(in uint seed) {
  int k;
  int s = int(seed);
  if (s == 0)
    s = 305420679;
  k = s / 127773;
  s = 16807 * (s - k * 127773) - 2836 * k;
  if (s < 0)
    s += 2147483647;
  seed = uint(s);
  return float(seed % uint(65536)) / 65535.0;
}

uint hash(uint x) {
  x = ((x >> uint(16)) ^ x) * uint(73244475);
  x = ((x >> uint(16)) ^ x) * uint(73244475);
  x = (x >> uint(16)) ^ x;
  return x;
}

Queste funzioni provengono dal ParticleProcessMaterial predefinito. Servono per generare un numero casuale dal RANDOM_SEED di ciascuna particella.

Una cosa peculiare degli shader di particelle è che alcune variabili integrate sono salvate tra un frame e l'altro. TRANSFORM, COLOR e CUSTOM sono tutte accessibili nello shader della mesh, nonché nello shader di particelle la prossima volta che viene eseguito.

Successivamente, configura la funzione start(). Gli shader di particelle contengono una funzione start() e una funzione process().

Il codice nella funzione start() è eseguito solo all'avvio del sistema di particelle. Il codice nella funzione process() è eseguito sempre.

Dobbiamo generare 4 numeri casuali: 3 per creare una posizione casuale e uno per lo scostamento casuale del ciclo di nuoto.

Innanzitutto, genera 4 seed all'interno della funzione start() tramite la funzione hash() fornita sopra:

uint alt_seed1 = hash(NUMBER + uint(1) + RANDOM_SEED);
uint alt_seed2 = hash(NUMBER + uint(27) + RANDOM_SEED);
uint alt_seed3 = hash(NUMBER + uint(43) + RANDOM_SEED);
uint alt_seed4 = hash(NUMBER + uint(111) + RANDOM_SEED);

Quindi, usa quei seed per generare numeri casuali usando rand_from_seed:

CUSTOM.x = rand_from_seed(alt_seed1);
vec3 position = vec3(rand_from_seed(alt_seed2) * 2.0 - 1.0,
                     rand_from_seed(alt_seed3) * 2.0 - 1.0,
                     rand_from_seed(alt_seed4) * 2.0 - 1.0);

Infine, assegna position a TRANSFORM[3].xyz, che è la parte della trasformazione che contiene le informazioni sulla posizione.

TRANSFORM[3].xyz = position * 20.0;

Ricorda, tutto questo codice finora va all'interno della funzione start().

Lo shader dei vertici per la tua mesh può rimanere esattamente così com'è dal tutorial precedente.

Ora puoi spostare ogni pesce individualmente in ogni frame, aggiungendo direttamente a TRANSFORM oppure scrivendo a VELOCITY.

Trasformiamo i pesci impostando la loro VELOCITY nella funzione start().

VELOCITY.z = 10.0;

Questo è il modo più semplice per impostare la VELOCITY: ogni particella (o pesce) avrà la stessa velocità.

Soltanto impostando VELOCITY puoi far nuotare il pesce come ti pare. Ad esempio, prova il codice qui sotto.

VELOCITY.z = cos(TIME + CUSTOM.x * 6.28) * 4.0 + 6.0;

Ciò darà a ciascun pesce una velocità unica compresa tra 2 e 10.

È anche possibile far variare la velocità di ciascun pesce nel tempo, impostando la velocità nella funzione process().

Se nel tutorial precedente hai utilizzato CUSTOM.y, puoi anche impostare la velocità dell'animazione di nuoto in base a VELOCITY. Basta usare CUSTOM.y.

CUSTOM.y = VELOCITY.z * 0.1;

Questo codice ti da il comportamento seguente:

../../../_images/scene.gif

Utilizzando un ParticleProcessMaterial è possibile rendere il comportamento del pesce semplice o complesso a piacere. In questo tutorial impostiamo solo la velocità, ma nei tui Shader puoi impostare anche il colore (tramite COLOR), la rotazione e la scala (tramite TRANSFORM). Consultate Particles Shader Reference per ulteriori informazioni sugli shader di particelle.