Pular para o conteúdo principal
Quinzena · 27 jul – 10 ago

Rumo ao multicorpo: constraints, Jolt e os limites do Godot

Montei este roadmap pra semana de 27 de julho, mas não cheguei a desenvolver — então estico o mesmo arco pelas duas semanas até hoje (10 ago) e dobro dentro os pontos novos da reunião de hoje. O norte não mudou: entender, não construir. O professor foi explícito — devagar.

Traduzindo a direção

◈ O que ficou combinado

A pergunta arquitetural que ficou aberta: raycast (força de penalidade) vs. multicorpo (juntas e constraints). A direção agora é clara — explorar o caminho multicorpo, entendendo como o motor de física do Godot liga corpos rígidos e restringe o movimento entre eles.

O ponto central: o Godot usa o Jolt Physics por baixo. Então a quinzena é sobre três camadas — o conceito (o que é multicorpo e constraint), a ferramenta (como o Jolt resolve constraints) e a ponte (o que o Godot me deixa usar do Jolt, e o que fica de fora).

Achado que já responde uma das perguntas

Godot ↔ Jolt · paridade

O Godot 4.6 tornou o Jolt o motor de física 3D padrão. Mas a documentação oficial marca o módulo Jolt embutido como experimental e sem paridade total com a antiga extensão godot-jolt.

Na prática, isso é a "limitação do Godot em relação às constraints do Jolt": pela API Joint3D eu acesso os tipos padrão de junta, mas não os recursos ricos do Jolt (limites suaves, juntas quebráveis, iterações de solver por junta, nós tipo JoltHingeJoint3D) — e a VehicleConstraint própria do Jolt não é exposta.

A sprint, semana a semana

O arco de 27/jul esticado nas duas semanas: primeiro o conceito, depois a prática mínima, depois o Jolt por dentro — e fecha na reunião de hoje, que abre a próxima frente.

SEM 1 · 27 jul · conceito

O que é "multicorpo" (multibody)

Definir em uma frase: vários corpos rígidos + juntas que restringem o movimento relativo entre eles. Anotar a diferença essencial pro raycast — lá eu calculo e aplico forças; aqui eu declaro relações e o solver calcula as forças. Escrever, com minhas palavras, por que o VehicleBody3D e o raycast já eram "meio multicorpo escondido".

SEM 1 · constraints = GDL

Constraint = tirar graus de liberdade

Fixar o conceito de grau de liberdade (GDL): um corpo rígido livre no 3D tem 6 GDL (3 translação + 3 rotação). Toda junta é "quantos GDL eu removo": a dobradiça deixa só 1 rotação; a prismática deixa só 1 translação. Mapear os tipos de junta do Godot (tabela abaixo).

SEM 1 · prática mínima

Dois corpos + uma junta no Godot

Numa cena isolada (não tocar no rover): dois RigidBody3D + um HingeJoint3D ligando eles. Confirmar em Project Settings → Physics → 3D que o motor é Jolt. Rodar e só observar o corpo obedecer a restrição sem eu aplicar nenhuma força. Uma junta, dois corpos — só isso.

SEM 2 · 03 ago · Jolt por dentro

Como o Jolt resolve + o que o Godot esconde

Ler (sem implementar) como o Jolt organiza constraints: um solver de impulsos que, a cada passo, corrige velocidades pra manter a restrição — o oposto do "empurrão por penalidade". Explorar o repositório (Physics/Constraints, Physics/Vehicle, Samples) e listar o que o Godot não expõe do Jolt.

SEM 2 · consolidar

Mapear pro rover (no papel) + documentar

Só no papel: qual junta modela cada parte do rover (roda = hinge, curso da suspensão = slider, chassi = corpo-mãe). Escrever a entrada docs/multicorpo/visao-geral com o que aprendi e montar o briefing da quinzena.

SEM 2 · 10 ago · ▲ reunião

Nova direção: sample do Jolt → Godot

A reunião de hoje aterrissou o conceito em tarefas concretas — comparar e replicar um sample do Jolt no Godot, ler a doc do GDExtension e espelhar o GDChrono do professor pro Jolt. Detalhado na próxima seção.

Novos pontos · reunião de 10 ago

o que saiu de hoje · próxima frente

Do conceito ao sample rodando

  1. Comparativo Jolt × Godot. Pegar um dos Samples do Jolt, rodar, e mapear feature a feature o que o Jolt tem e o Godot não expõe. Vira o comparativo formal que fundamenta a decisão arquitetural.
  2. Replicar um sample no Godot. Escolher um sample do Jolt e tentar reconstruir o mesmo cenário no Godot com os nós Joint3D — medir até onde o Godot chega e onde bate no limite do achado acima.
  3. Ler a doc do GDExtension. Entender como estender o Godot em C++ — é a ponte pra, um dia, expor o que o Jolt tem e o Godot esconde (ler a doc, não construir uma extensão de produção).
  4. Espelhar o GDChrono do professor pro Jolt. O professor fez uma GDExtension ligando o Godot ao Project Chrono; estudar como ele fez e fazer o mesmo raciocínio pro Jolt. Casa direto com o ponto 2 — é a mesma proposta de pegar um sample e replicar, só que pela via da extensão.
◈ a costuraGDChrono → Jolt e "replicar um sample" são o mesmo movimento visto de dois ângulos: um vai pela API de nós do Godot, o outro pela ponte C++. Os dois medem a mesma coisa — o vão entre o que o Jolt entrega e o que o Godot deixa alcançar.

Esta quinzena eu NÃO vou

✕ trava de escopo

Porque "explorar" vira "reconstruir tudo" com uma facilidade assustadora.

  • Construir o rover de 4/6 rodas em multicorpo
  • Trocar ou aposentar o protótipo raycast
  • Integrar a ExoPhysics ou mexer no sinkage
  • Escrever uma GDExtension de produção (ler a doc, sim)
  • Implementar a VehicleConstraint do Jolt
  • Modelar suspensão + direção juntas

Cola conceitual · penalidade vs. constraint

Raycast

força de penalidade · o que já tenho

Eu empurro. A cada frame eu calculo as forças (mola-amortecedor, tração, lateral) e aplico no corpo. O corpo é livre; o comportamento certo emerge das forças que eu escolho.

A favor: controle total, física explícita, troca fácil pra ExoPhysics. Contra: instabilidade do integrador, eu reimplemento tudo.

Multicorpo

junta + constraint · o caminho a explorar

Eu restrinjo. Eu declaro uma relação geométrica ("estes dois corpos giram juntos neste eixo") e o solver do Jolt calcula os impulsos que mantêm a relação. Não empurro — amarro.

A favor: junções rígidas estáveis, suspensão/direção "de graça". Contra: menos controle da física interna, preso ao que o Godot expõe.

◈ a ponteNão é "um ou outro". O modelo de veículo do próprio Jolt usa raycast/shapecast nas rodas combinado com o solver de constraints. Meu protótipo raycast não foi trabalho jogado fora — ele é metade do que um veículo multicorpo maduro faz.

Referência · juntas do Godot e graus de liberdade

junta (Godot) → análogo · GDL que sobra · uso no rover
PinJoint3D
rótula / ponto · 3 rotação · ponto de articulação livre
HingeJoint3D
dobradiça / revoluta · 1 rotação · eixo da roda girando; braço de suspensão
SliderJoint3D
prismática · 1 translação · curso vertical da suspensão
ConeTwistJoint3D
esférica limitada · cone + twist · juntas com limite angular
Generic6DOFJoint3D
configurável · eu escolho · trava/libera cada eixo + motores

Guia de exploração · repositórios

Constraints/Só ler os headers. HingeConstraint, SliderConstraint, SixDOFConstraint — reparar nos parâmetros de cada uma (eixo, limites, motor). É o "de verdade" por trás dos nós do Godot.
Vehicle/Olhar, não implementar. A WheeledVehicleConstraint. O objetivo é só perceber que o Jolt já tem um modelo de veículo pronto — e que ele usa raycast nas rodas por baixo. A ponte entre meus dois mundos.
Samples/Intuição visual + o sample a replicar. Os exemplos rodáveis (ConstraintTests, Vehicle) — é daqui que sai o sample pra comparar e reconstruir no Godot (pontos 1 e 2 da reunião).
GDChronoO molde do professor. A GDExtension que ele fez ligando o Godot ao Project Chrono. Estudar a estrutura e espelhar o mesmo raciocínio pro Jolt (ponto 4).

Para o dossiê e a próxima reunião

O que sai desta quinzena

  • Entrada no Docusaurus — ✔ publicada em Constraints, juntas e o Jolt: o quadro penalidade × constraint, a tabela de GDL, o experimento com HingeJoint3D e a nota Godot↔Jolt.
  • Cena de teste versionada — ✔ feita: os dois corpos + hinge em Teste_junta/, com os prints do pêndulo no dossiê.
  • Comparativo Jolt × Godot — a partir de um sample: o que o Jolt entrega e o Godot não expõe, feature a feature.
  • Sample replicado no Godot — a tentativa de reconstruir o cenário do Jolt, mais o paralelo GDChrono → Jolt via GDExtension.
  • Posição escrita sobre a decisão arquitetural — com o dado novo: o Godot não expõe a VehicleConstraint do Jolt, e o próprio Jolt mistura raycast + constraint.