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...
Controlando milhares de peixes com Partículas
O problema com o MeshInstance3D é que atualizar sua matriz de transformações é custoso. Ele é ótimo para colocar muitos objetos estáticos pela cena. Mas ainda é difícil mover os objetos pela cena.
Para fazer cada instância se mover de uma maneira interessante, usaremos um nó GPUParticles3D. As partículas aproveitam a aceleração por GPU computando e definindo as informações por instância em um Shader.
Primeiro, crie un nó de Partículas. Depois, sob "Draw Passes", defina o "Draw Pass 1" da Partícula para a sua Mesh. Em seguida, sob "Process Material", crie um novo ShaderMaterial.
Defina o shader_type para particles.
shader_type particles
Em seguida, acrescente as duas funções a seguir:
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;
}
Essas funções vêm do ParticleProcessMaterial padrão. Elas são usadas para gerar um número aleatório a partir do RANDOM_SEED de cada partícula.
Uma característica única dos shaders de partículas é que algumas variáveis embutidas são salvas entre os quadros. TRANSFORM, COLOR e CUSTOM podem ser acessadas no shader da malha e também no shader de partícula na próxima vez que ele for executado.
A seguir, configure sua função start(). Os shaders de partículas contêm uma função start() e uma função process().
O código na função start() roda apenas quando o sistema de partículas inicializa. O código na função process() rodará sempre.
Precisamos gerar 4 números aleatórios: 3 para criar uma posição aleatória e um para o deslocamento aleatório do ciclo de nado.
Primeiro, gere 4 sementes dentro da função start() usando a função hash() fornecida acima:
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);
Depois, use essas sementes para gerar números aleatórios 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);
Por fim, atribua position a TRANSFORM[3].xyz, que é a parte da transformação que guarda a informação de posição.
TRANSFORM[3].xyz = position * 20.0;
Lembre-se, todo esse código até agora vai dentro da função start().
O vertex shader da sua malha pode continuar exatamente igual ao do tutorial anterior.
Agora você pode mover cada peixe individualmente a cada quadro, seja adicionando diretamente ao TRANSFORM ou escrevendo no VELOCITY.
Vamos transformar os peixes definindo sua VELOCITY na função start().
VELOCITY.z = 10.0;
Esta é a forma mais básica de definir VELOCIDADE cada partícula (ou peixe) terá a mesma velocidade.
Apenas configurando VELOCITY você pode fazer o peixe nadar como quiser. Por exemplo, tente o código abaixo.
VELOCITY.z = cos(TIME + CUSTOM.x * 6.28) * 4.0 + 6.0;
Isso dará a cada peixe uma velocidade única entre 2 e 10.
Você também pode deixar que cada peixe mude sua velocidade ao longo do tempo se você definir a velocidade na função process().
Se você usou CUSTOM.y no último tutorial, também pode definir a velocidade da animação de nadar com base na VELOCIDADE. Basta usar CUSTOM.y.
CUSTOM.y = VELOCITY.z * 0.1;
Este código fornece o seguinte comportamento:
Usando um ParticleProcessMaterial, você pode tornar o comportamento dos peixes tão simples ou complexo quanto desejar. Neste tutorial, definimos apenas a Velocidade, mas em seus próprios Shaders você também pode definir COLOR, rotação, escala (através de TRANSFORM). Por favor, consulte a Referência de Shader de Partículas para mais informações sobre shaders de partículas.