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.

3D Particle collisions

Particle collisions

Como as partículas de GPU são processadas inteiramente na GPU, elas não têm acesso ao mundo físico do jogo. Se você precisar que as partículas colidam com o ambiente, será necessário configurar nós de colisão de partículas. Existem quatro tipos deles: GPUParticlesCollisionBox3D, GPUParticlesCollisionSphere3D, GPUParticlesCollisionSDF3D e GPUParticlesCollisionHeightField3D.

Common properties

Common particle collision properties

Common collision properties

Existem algumas propriedades que você pode encontrar em todos os nós de colisão. Elas estão localizadas na seção GPUParticlesCollision3D no inspetor.

A propriedade Cull Mask controla quais sistemas de partículas são afetados por um nó de colisão com base nas camadas de visibilidade de cada sistema. Um sistema de partículas colide com um nó de colisão apenas se pelo menos uma das camadas de visibilidade do sistema estiver habilitada na cull mask do colisor.

Box collision

Particle collision box

Box collision in the node list

Nós de colisão do tipo caixa têm o formato de um sólido retangular. Você controla o tamanho deles com a propriedade Extents. As extensões da caixa sempre medem metade dos lados de seus limites, então um valor de (X=1.0,Y=1.0,Z=1.0) cria uma caixa que tem 2 metros de largura em cada lado. Nós de colisão do tipo caixa são úteis para simular geometrias de chão e paredes contra as quais as partículas devem colidir.

Para criar um nó de colisão do tipo caixa, adicione um novo nó filho à sua cena e selecione GPUParticlesCollisionBox3D na lista de nós disponíveis. Você pode animar a posição da caixa ou anexá-la a um nó em movimento para obter efeitos mais dinâmicos.

Box collision with particle systems

Dois sistemas de partículas colidem com um nó de colisão de caixa

Sphere collision

Particle collision sphere

Colisão de esferas na lista de nós

Nós de colisão do tipo esfera têm o formato de uma esfera sólida. A propriedade Radius controla o tamanho da esfera. Enquanto nós de colisão do tipo caixa não precisam ser cubos perfeitos, nós de colisão do tipo esfera serão sempre esferas. Se você quiser definir a largura independentemente da altura, será necessário alterar a propriedade Scale na seção Node3D.

Para criar um nó de colisão do tipo esfera, adicione um novo nó filho à sua cena e selecione GPUParticlesCollisionSphere3D na lista de nós disponíveis. Você pode animar a posição da esfera ou anexá-la a um nó em movimento para obter efeitos mais dinâmicos.

Colisão de esferas com sistemas de partículas

Dois sistemas de partículas colidem com um nó de colisão de esfera

Height field collision

Particle collision height field

Nó de colisão por mapa de altura na lista de nós

A colisão de partículas com mapa de altura é muito útil para grandes áreas externas que precisam colidir com partículas. Em tempo de execução, o nó cria um mapa de altura a partir de todas as meshes dentro de seus limites que correspondem à sua cull mask. As partículas colidem com a mesh que esse mapa de altura representa. Como a geração do mapa de altura é feita dinamicamente, ele pode seguir a câmera do jogador e reagir a mudanças no nível. Diferentes configurações para a densidade do mapa de altura oferecem uma ampla gama de ajustes de desempenho.

Para criar um nó de colisão por mapa de altura, adicione um novo nó filho à sua cena e selecione GPUParticlesCollisionHeightField3D na lista de nós disponíveis.

Um nó de colisão por mapa de altura tem o formato de uma caixa. A propriedade Extents controla seu tamanho. As extensões sempre medem metade dos lados de seus limites, então um valor de (X=1.0,Y=1.0,Z=1.0) cria uma caixa com 2 metros de largura em cada lado. Qualquer coisa fora das extensões do nó é ignorada na criação do mapa de altura.

A propriedade Resolution controla o quão detalhado é o mapa de altura. Uma resolução mais baixa oferece desempenho mais rápido às custas da precisão. Se a resolução do mapa de altura for muito baixa, pode parecer que as partículas penetram a geometria do nível ou ficam presas no ar durante eventos de colisão. Elas também podem ignorar completamente algumas meshes menores.

Height field resolutions

Em resoluções baixas, a colisão por mapa de altura perde alguns detalhes mais finos (esquerda)

A propriedade Update Mode controla quando o mapa de altura é recriado a partir das meshes dentro de seus limites. Defina-a como When Moved para que seja atualizado apenas quando o nó se mover. Isso oferece bom desempenho e é adequado para cenas estáticas que não mudam com frequência. Se você precisar que as partículas colidam com objetos dinâmicos que mudam de posição frequentemente, pode selecionar Always para atualizar a cada quadro. Isso tem um custo de desempenho e deve ser usado apenas quando necessário.

Nota

É importante lembrar que, quando Update Mode está definido como When Moved, é o nó do height field cuja movimentação aciona a atualização. O height field não é atualizado quando uma das meshes dentro dele se move.

A propriedade Follow Camera Enabled faz com que o height field siga a câmera atual quando ativada. Ele será atualizado sempre que a câmera se mover. Essa propriedade pode ser usada para garantir que sempre exista colisão de partículas ao redor do jogador, sem desperdiçar desempenho em regiões que estão fora de vista ou muito distantes.

SDF collision

Nota

A colisão SDF de partículas só é suportada nos renderizadores Forward+ e Mobile, não na Compatibilidade.

Colisão de partículas SDF

Colisão SDF na lista de nós

Os nós de colisão SDF criam um campo de distância signed que as partículas podem colidir com. A colisão SDF é semelhante à colisão de campo de altura em que transforma várias malhas dentro de seus limites em um único volume de colisão para partículas. Uma grande diferença é que os campos de distância assinados podem representar buracos, túneis e sobressaltos, o que é impossível fazer apenas com campos de altura. A sobrecarga de desempenho é maior em comparação com campos de altura, então eles são mais adequados para ambientes pequenos a médios.

Para criar um nó de colisão SDF, adicione um novo nó de criança à sua cena e selecione GPUParticlesCollisionSDF3D na lista de nós disponíveis. Os nós de colisão SDF têm de ser assados para ter qualquer efeito em partículas no nível. Para fazer isso, clique no botão Bake SDF na barra de ferramentas do viewport enquanto o nó de colisão SDF é selecionado e escolha um diretório para armazenar os dados assados. Uma vez que a colisão SDF precisa ser assada no editor, é estática e não pode mudar no tempo de execução.

Colisão de partículas SDF

A colisão de partículas SDF permite formas de colisão tridimensionais muito detalhadas

Um nó de colisão SDF tem formato de caixa. A propriedade Extents controla seu tamanho. Os extents sempre medem metade do comprimento dos lados de seus limites, então um valor de (X=1.0,Y=1.0,Z=1.0) cria uma caixa com 2 metros de largura em cada lado. Qualquer coisa fora dos extents do nó é ignorada para colisão.

A propriedade Resolution controla o quão detalhado é o campo de distância. Uma resolução mais baixa tem desempenho melhor, mas reduz a precisão. Se a resolução for muito baixa, pode parecer que partículas penetram na geometria do nível ou ficam presas no ar durante colisões. Elas também podem ignorar completamente algumas malhas menores.

Comparação da resolução

A mesma área coberta por um Campo de Distância com Sinal em diferentes resoluções: 16 (esquerda) e 256 (direita)

A propriedade ``Thickness` dá o campo de distância, que geralmente é oco no interior, uma espessura para evitar que as partículas penetrem em altas velocidades. Se você descobrir que algumas partículas não colidem com a geometria de nível e, em vez disso, atire diretamente através dele, tente definir esta propriedade para um valor mais elevado.

A propriedade Bake Mask controla quais malhas serão consideradas quando o SDF for assado. Somente malhas renderizadas nas camadas ativas na máscara de assado contribuem para a colisão de partículas.

Solução de problemas

Para que a colisão de partículas funcione, a visibility AABB da partícula deve se sobrepor com a AABB do colisor. Se as colisões não estiverem funcionando, apesar de os colisores estarem configurados, gere uma AABB de visibilidade atualizada selecionando o nó GPUParticles3D e escolhendo GPUParticles3D > Generate Visibility AABB… no topo da viewport do editor 3D.

Se as partículas se movem rapidamente e os aceleradores são finos, há duas soluções para isso:

  • Torne os colliders mais espessos. Por exemplo, se as partículas não puderem passar abaixo de um piso sólido, você pode tornar o collider que representa o piso mais espesso do que sua representação visual real. O collider de heightfield lida automaticamente com isso por design, já que heightfields não podem representar colisão de “sala sobre sala”.

  • Aumente o Fixed FPS no nó GPUParticles3D, o que fará com que as verificações de colisão sejam realizadas com mais frequência. Isso tem um custo de desempenho, então evite definir um valor muito alto.