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.

Sistema de Ragdoll

Introdução

O Godot suporta física de ragdoll. Ragdolls dependem de simulação física para criar animações procedurais realistas. Eles são usados para animações de morte em muitos jogos.

Neste tutorial, usaremos a demonstração do Platformer 3D para configurar um ragdoll.

Nota

Você pode baixar o demo do Platformer 3D no GitHub ou usando a Asset Library.

Você também pode conferir um exemplo de uma configuração completa de ragdoll na demonstração de Física de Ragdoll.

Configurando o ragdoll

Criando ossos físicos

Como muitos outros recursos no motor, existem dois nós que são usados para configurar um ragdoll:

  • Um nó PhysicalBoneSimulator3D. Este nó é o pai de todos os ossos físicos e é responsável por controlar a simulação.

  • Um ou mais filhos PhysicalBone3D. Cada nó representa um único osso no ragdoll.

Abra a demo do platformer no Godot e, em seguida, a cena player/player.tscn. Selecione o nó Skeleton3D. Um botão de esqueleto aparecerá no topo do viewport do editor 3D:

Criando um esqueleto físico no editor

Criando um esqueleto físico no editor

Clique nele e selecione a opção Create Physical Skeleton. O Godot gerará nós PhysicalBone3D e formas de colisão para cada osso no esqueleto e juntas de pino (pin joints) para conectá-los:

Árvore de cena da cena do jogador após a criação de um esqueleto físico

Árvore de cena da cena do jogador após a criação de um esqueleto físico

Alguns dos ossos gerados não são necessários, como o osso MASTER nesta cena. Vamos limpar o esqueleto removendo-os.

Limpar e otimizar o esqueleto

Para cada PhysicalBone3D que o motor precisa simular, há um custo de desempenho. Você desejará remover cada osso que seja pequeno demais para fazer diferença na simulação, bem como todos os ossos de utilidade.

Por exemplo, se pegarmos um humanoide, você não precisa ter ossos físicos para cada dedo. Você pode usar um único osso para a mão inteira, ou um para a palma, um para o polegar e um último para os outros quatro dedos.

Remova estes nós PhysicalBone3D: MASTER, waist, neck, headtracker. Isso nos dá um esqueleto otimizado e torna mais fácil controlar o ragdoll.

Ajustar articulações e restrições

Depois de ajustar as formas de colisão, seu ragdoll está quase pronto. Agora, você precisa ajustar as articulações de pinos para obter uma simulação melhor. Os nós PhysicalBone3D possuem uma articulação de pino sem restrições atribuída a eles por padrão. Para alterar a articulação de pino, selecione um nó PhysicalBone3D e altere o tipo de restrição na seção Joint do inspetor. Lá, você pode alterar a orientação da restrição e seus limites.

As articulações também possuem um gizmo visível no editor 3D, para que você possa ver suas restrições em ação.

Ajustando articulações no inspetor após selecionar um nó PhysicalBone3D

Ajustando articulações no inspetor após selecionar um nó PhysicalBone3D

Dica

Para obter uma visão melhor ao editar articulações e formas de colisão, você pode fazer o seguinte:

  • Oculte os nós PhysicalBone3D nos quais você não está trabalhando no momento, para poder se concentrar naqueles que está ajustando.

  • Oculte o MeshInstance3D do personagem clicando no ícone de olho ao lado dele no painel da árvore de cena.

  • Oculte os gizmos do Skeleton3D, para que os triângulos laranjas que representam o esqueleto não poluam o viewport enquanto deixa o restante visível. Para fazer isso, clique em View > Gizmos > Skeleton3D no topo do viewport do editor 3D até que o ícone do olho apareça fechado.

  • Desative o ambiente de pré-visualização clicando no ícone do globo no topo do viewport do editor 3D.

  • Defina a configuração de projeto Default Clear Color para preto puro nas Configurações de Projeto. Isso só é eficaz se o ambiente de pré-visualização estiver desativado.

  • Altere o modo de desenho de depuração usando o botão Perspective no canto superior esquerdo do viewport do editor 3D. As opções Display Wireframe e Display Overdraw são particularmente úteis ao ajustar formas de colisão, pois permitem ver através da malha original.

  • Use a câmera ortográfica clicando nos botões X/Y/Z no canto superior direito do viewport do editor 3D.

Aqui está a lista de juntas disponíveis:

  • None: Não realiza nenhuma restrição.

  • ConeJoint: Junta esférica. Útil para ombros, quadris, pescoço.

  • HingeJoint: Fornece uma restrição angular; pense nisso como uma dobradiça de porta. Útil para cotovelos e joelhos.

  • PinJoint: Mantém dois corpos conectados (padrão). Leva ao 'amassamento' dos ossos, por isso é recomendado usar outros tipos de junta para a maioria dos personagens.

  • SliderJoint: Desliza um osso ao longo de outro em um eixo específico.

  • 6DOFJoint: A articulação mais poderosa, oferecendo restrições tanto lineares quanto angulares, mas também a mais complexa de configurar.

Em caso de dúvida, comece com HingeJoint e ConeJoint, pois eles cobrem a maioria dos casos de uso:

  • Para HingeJoint, certifique-se de ativar Angular Limit na seção Joint Constraints do inspetor. Depois de ativá-lo, você poderá ver o ângulo ao qual ele está sendo restringido no viewport. Você pode rotacionar o PhysicalBone3D para alterar o eixo onde a articulação está restringida e, em seguida, ajustar os ângulos.

  • Para ConeJoint, geralmente é melhor limitar o Swing Span entre 20 e 90 graus, e o Twist Span entre 20 e 45 degrees.

Ajustar formas de colisão

A próxima tarefa é ajustar a forma de colisão e o tamanho dos ossos físicos para corresponder à parte do corpo que cada osso deve simular.

É recomendado ajustar as formas de colisão após ajustar as articulações e restrições, pois rotacionar uma articulação também rotacionará a forma de colisão. Para evitar ter que ajustar as formas de colisão duas vezes, é melhor ajustar as articulações primeiro.

Note que é possível ter múltiplas formas de colisão como filhas de um nó PhysicalBone3D. Isso pode ser útil para representar formas de membros particularmente complexas que, de outra forma, seriam rígidas.

Dica

Para pausar a reprodução da animação enquanto ajusta o ragdoll, selecione o nó AnimationTree e desative a propriedade Active no Inspetor. Lembre-se de ativá-la novamente quando terminar, pois ela controla a reprodução da animação durante a jogabilidade.

Ajustando formas de colisão no editor 3D

Ajustando formas de colisão no editor 3D

Este é o resultado final:

Resultado após ajustar as articulações e formas de colisão (a malha do jogador está oculta para fins de visibilidade)

Resultado após ajustar as articulações e formas de colisão (a malha do jogador está oculta para fins de visibilidade)

Simular o ragdoll

O ragdoll agora está pronto para uso. Para iniciar a simulação e reproduzir a animação do ragdoll, você precisa chamar o método PhysicalBoneSimulator3D.physical_bones_start_simulation(). Anexe um script ao nó PhysicalBoneSimulator3D que é o pai de todos os nós PhysicalBone3D em nossa cena e, em seguida, chame-o no método _ready do script:

func _ready():
    physical_bones_start_simulation()

Para parar a simulação, chame o método PhysicalBoneSimulator3D.physical_bones_stop_simulation().

Você também pode limitar a simulação a apenas alguns ossos. Isso pode ser útil para criar efeitos como membros ragdoll ou acessórios que podem interagir com o mundo. Para fazer isso, passe os nomes dos ossos (não os nomes dos nós PhysicalBone3D) como parâmetro. Para ver o nome do osso, olhe para la propriedade Bone Name no inspetor após selecionar um nó PhysicalBone3D.

Dica

Ao usar um esqueleto físico gerado automaticamente como mostrado neste tutorial, o nome do osso também está contido no nome do nó. Por exemplo, em Physical Bone l-arm, l-arm é o nome do osso.

func _ready():
    physical_bones_start_simulation(["l-arm", "r-arm"])

Note que nomes de ossos inexistentes não imprimirão nenhum erro ou aviso. Se nada acontecer ao iniciar a simulação (oi se o corpo inteiro entrar em ragdoll em vez de apenas ossos específicos), verifique novamente a lista de ossos fornecida.

Aqui está um exemplo de simulação parcial de ragdoll:

Dica

Para controlar a intensidade com que a simulação de ragdoll parcial afeta a animação geral, você pode ajustar a propriedade Influence no nó PhysicalBoneSimulator3D que é o pai de todos os nós PhysicalBone3D. Por padrão, ela é definida como 1.0, o que significa que a simulação de ragdoll substitui totalmente o restante da animação.

Camadas e Máscaras de colisão

Certifique-se de configurar suas camadas e máscaras de colisão corretamente para que a cápsula do CharacterBody3D não fique no caminho da simulação de física. Lembre-se de ajustar a camada e a máscara de colisão na cena da moeda também, para que o jogador ainda possa coletar moedas:

As camadas e máscaras devem ser ajustadas para esses valores no inspetor para cada nó

As camadas e máscaras devem ser ajustadas para esses valores no inspetor para cada nó

Você pode encontrar o GridMap na demo do platformer 3D em stage/grid_map.scn. O nó Area3D da moeda (no qual as camadas e máscaras devem ser ajustadas) pode ser encontrado em coin/coin.tscn.

Dica

Para selecionar todos os nós PhysicalBone3D rapidamente, digite t:PhysicalBone3D na barra de pesquisa no topo do painel da árvore de cena. Isso filtra a árvore de cena para mostrar apenas nós PhysicalBone3D, permitindo que você selecione todos de uma vez usando Shift + Botão esquerdo do mouse nas entradas inicial e final.

Se isso não for feito, a colisão se comportará incorretamente, pois o jogador colidirá com seu próprio ragdoll (inativo). Isso pode fazer com que o jogador salte descontroladamente ou fique preso.

Como o RigidBody3D, o PhysicalBone3D suporta exceções de colisão via código usando os métodos physical_bones_add_collision_exception() e physical_bones_remove_collision_exception(). Isso pode ser usado para evitar colisões com um objeto específico sem depender de camadas e máscaras.

Ver também

Para mais informações, veja Camadas e Máscaras de colisão.