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.
Checking the stable version of the documentation...
Contrôler des milliers de poissons en utilisant les Particles
Le problème avec les MeshInstance3D est qu'il est coûteux de mettre à jour leurs tableaux de transformations. Ils sont idéaux pour placer de nombreux objets statiques partout dans la scène, mais ça reste difficile de déplacer ces objets.
Pour faire bouger de manière intéressante chaque instance, nous allons utiliser un nœud de GPUParticles3D. Les particules profitent de l'accélération GPU en calculant et en définissant les informations par instance dans un Shader.
Créez d'abord un nœud Particles. Ensuite, sous "Draw Passes" définissez le "Draw Pass 1" de la particule sur votre Mesh. Puis sous "Process Material" créez un nouveau ShaderMaterial.
Définissez le shader_type sur particles.
shader_type particles
Ajoutez ensuite les deux fonctions suivantes :
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;
}
Ces fonctions proviennent du ParticleProcessMaterial par défaut. Elles sont utilisées pour générer un nombre aléatoire à partir du RANDOM_SEED de chaque particule.
A unique thing about particle shaders is that some built-in variables are saved across frames.
TRANSFORM, COLOR, and CUSTOM can all be accessed in the shader of the mesh, and
also in the particle shader the next time it is run.
Ensuite, configurez votre fonction start(). Les shaders de particules ne contiennent qu'une fonction start() et une fonction process().
The code in the start() function only runs when the particle system starts.
The code in the process() function will always run.
Nous devons générer 4 nombres aléatoires : 3 pour créer une position aléatoire et un autre pour le décalage aléatoire du cycle de nage.
Tout d'abord, générez 4 graines à l'intérieur de la fonction start() à l'aide de la fonction hash() fournie ci-dessus :
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);
Ensuite, utilisez ces graines pour générer des nombres aléatoires à l'aide de 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);
Enfin, affectez position à TRANSFORM[3].xyz, qui est la partie du transform qui contient l'information de position.
TRANSFORM[3].xyz = position * 20.0;
Rappelez-vous, tout ce code jusqu'à présent va à l'intérieur de la fonction start().
Le vertex shader de votre maillage peut rester exactement le même que dans le tutoriel précédent.
Vous pouvez maintenant déplacer chaque poisson individuellement à chaque image, soit en ajoutant directement à son TRANSFORM, soit en réécrivant sa VELOCITY.
Transformons les poissons en définissant leurs vitesses VELOCITY dans la fonction start().
VELOCITY.z = 10.0;
C'est la façon la plus simple de régler VELOCITY : chaque particule (ou poisson) aura la même vitesse.
Juste en définissant VELOCITY vous pouvez faire nager les poissons comme vous voulez. Par exemple, essayez le code ci-dessous.
VELOCITY.z = cos(TIME + CUSTOM.x * 6.28) * 4.0 + 6.0;
Cela donnera à chaque poisson une vitesse unique entre 2 et 10.
You can also let each fish change its velocity over time if you set the velocity in the process()
function.
Si vous avez utilisé CUSTOM.y dans le dernier tutoriel, vous pouvez également définir la vitesse de l'animation de nage en fonction de la VELOCITY. Utilisez simplement CUSTOM.y.
CUSTOM.y = VELOCITY.z * 0.1;
Ce code vous donne le comportement suivant :
En utilisant un ParticleProcessMaterial (matériau pour traitement des particules), vous pouvez rendre le comportement du poisson aussi simple ou complexe que vous le souhaitez. Dans ce tutoriel, nous ne définissons que la vitesse, mais dans vos propres shaders vous pouvez aussi définir la couleur COLOR, la rotation, l'échelle (via TRANSFORM). Pour plus d'informations sur les shaders de particules, reportez-vous à la page Référence des shaders de particules.