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.

Aviso

Há um problema conhecido com colisão de partículas GPU que impede a cull mask de funcionar corretamente no Godot 4.0. Atualizaremos a documentação assim que isso for corrigido.

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

Particle collision SDF

Colisão SDF na lista de nós

Nós de colisão SDF criam um signed distance field com o qual as partículas podem colidir. A colisão SDF é semelhante à colisão por height field no sentido de que transforma múltiplas malhas dentro de seus limites em um único volume de colisão para partículas. Uma diferença importante é que signed distance fields podem representar buracos, túneis e saliências, o que é impossível de fazer apenas com height fields. O custo de desempenho é maior em comparação com height fields, portanto eles são mais indicados para ambientes de pequeno a médio porte.

Para criar um nó de colisão SDF, adicione um novo nó filho à sua cena e selecione GPUParticlesCollisionSDF3D na lista de nós disponíveis. Os nós de colisão SDF precisam ser pré-calculados para influenciarem as partículas no nível. Para isso, clique no botão Bake SDF na barra de ferramentas do viewport enquanto o nó de colisão SDF estiver selecionado e escolha um diretório para armazenar os dados bakeados. Como a colisão SDF precisa ser bakeada no editor, ela é estática e não pode mudar em tempo de execução.

SDF particle collision

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.

Resolution comparison

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

A propriedade Thickness confere ao campo de distância, que geralmente é oco por dentro, uma espessura para impedir que as partículas penetrem em altas velocidades. Se você perceber que algumas partículas não colidem com a geometria do nível e, em vez disso, atravessam-no, tente definir essa propriedade para um valor mais alto.

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.