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...
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
Clique nele e selecione a opção . 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
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 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
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 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 no canto superior esquerdo do viewport do editor 3D. As opções e 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 // 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 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
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)
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()
public override void _Ready()
{
PhysicalBonesStartSimulation();
}
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"])
public override void _Ready()
{
PhysicalBonesStartSimulation(["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ó
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.