Construindo um carro que dirige, freia e capota — e entendendo o porquê.
Registro do que aprendi montando um protótipo de veículo com VehicleBody3D no Godot. Não é o modelo multicorpo em C++ que vou escrever pro Tema 1 — é o arcade car: um corpo rígido único com rodas por raycast. Serve pra construir intuição sobre torque, suspensão, aderência e transferência de carga antes de partir pro modelo rigoroso.

A arquitetura da cena
Duas cenas separadas. O car.tscn é o veículo autossuficiente (corpo + rodas + câmera + script). O world.tscn é o palco: instancia o carro e adiciona o chão, a luz e o ambiente. A separação importa — se o chão fosse filho do carro, cairia junto com ele.


O processo de montagem
A ordem importou menos que os detalhes de transform que quase passaram batido. Cada etapa abaixo traz a lição que só apareceu quando algo saiu do lugar.
Importar o modelo em glTF (GLB)
O Kenney Car Kit traz FBX, OBJ e GLB. Usei o .glb — é o glTF binário, com malha, materiais e texturas num arquivo só. É o mesmo formato aberto que o rover vai usar depois.
.glb pra dentro da cena já instancia tudo pronto.Ajustar o CollisionShape3D do chassi
Um BoxShape3D com Size (1, 0.5, 2) cobrindo a carroceria. É essa caixa que a física usa — o modelo visual não colide sozinho.
Extrair as rodas do modelo
O hatchback-sports já vinha com as 4 rodas modeladas dentro. Com Editable Children, copiei cada malha de roda pra dentro do VehicleWheel3D correspondente e escondi as originais.
Posicionar as rodas — e a conta da escala
As posições locais das rodas (±0.3, 0.3, ±0.81) só valiam porque o modelo estava em (0,0,0). Como o hatchback-sports tem scale 0.7, a posição real de cada VehicleWheel3D é a local multiplicada por 0.7.
Fechar o mundo: chão, luz e câmera
Um StaticBody3D largo e fino como chão, uma DirectionalLight3D como sol e uma Camera3D atrás do carro. Sem isso, a cena roda preta ou o carro cai no vazio.

Os campos da VehicleWheel3D
O núcleo do aprendizado. Cada roda tem um conjunto de parâmetros que definem tamanho, suspensão, amortecimento e aderência. Abaixo, o que cada um faz — e, principalmente, o que muda quando diminuo e quando aumento. O valor à direita é o que usei neste sandbox.

Raio da roda
wheel_radiususado · 0.21 mO tamanho físico da roda, em metros. Precisa bater com o raio visual do modelo (0.3 × escala 0.7 = 0.21), senão o carro flutua ou afunda no chão.
A roda encosta mais embaixo da origem: o carro fica mais baixo e pode raspar o chassi no chão.
Roda maior levanta o corpo; se destoar do visual, a roda parece 'boiar' longe do pneu desenhado.
Comprimento de repouso
wheel_rest_lengthusado · 0.05 mQuanto a roda 'desce' da sua origem quando o carro está parado, em repouso. É a folga que a suspensão usa pra acomodar o peso.
Suspensão trabalha num curso curto: resposta mais 'seca', o carro fica colado à altura da origem.
A roda parte de mais baixo, elevando o corpo em repouso — carro mais alto e com mais margem pra comprimir.
Influência de rolagem
wheel_roll_influenceusado · 0.1 (padrão)Parâmetro específico do Godot: quanto do torque de rolagem lateral aquela roda transmite ao corpo. É o 'atalho' mais direto pra domar o tombamento sem mexer na geometria.
O carro fica mais 'grudado': resiste muito mais a capotar nas curvas, de forma artificial mas eficaz.
Mais torque lateral chega ao corpo: o carro inclina e tomba com mais facilidade.
Aderência (grip)
wheel_friction_slipusado · 1.0Quanto de agarre a roda tem contra o chão. Combina com o atrito da superfície. 0 é gelo, 1 é aderência normal.
A roda escorrega: o carro derrapa, perde tração e desliza nas curvas. Bom pra simular desgaste ou drift.
Mais agarre: aceleração e curva mais firmes — mas grip alto demais deixa o carro mais sujeito a capotar (a força vira torque em vez de escorregão).
Curso da suspensão
suspension_travelusado · 0.15 mA distância que a suspensão pode percorrer comprimindo e estendendo. Como as unidades do Godot são metros, mantém-se baixo (0.1 a 0.3).
Suspensão rígida e curta: o carro sente cada irregularidade, quica menos mas absorve pior os impactos.
Curso longo: absorve buracos e rampas com mais suavidade, mas o corpo balança e mergulha mais.
Rigidez da mola
suspension_stiffnessusado · 60 N/mmA dureza da mola da suspensão. A doc dá faixas de referência: abaixo de 50 pra off-road, 50–100 pra carro de corrida, ~200 pra Fórmula 1.
Mola macia (perfil off-road/rover): o carro 'boia', inclina mais nas curvas e mergulha ao frear. Bom pra terreno irregular.
Mola dura (perfil esportivo): o corpo balança pouco, fica firme e estável — parecido com o efeito de uma barra estabilizadora.
Força máxima da suspensão
suspension_max_forceusado · 40O limite de força que a mola consegue resistir. A regra: precisa ser maior que ¼ da massa do veículo, senão a mola não aguenta o peso e o carro afunda.
Se cair abaixo de ¼ da massa, a suspensão 'cede': o carro afunda e senta no chão, como se não tivesse mola.
Margem folgada pra segurar o peso mesmo em impactos fortes; bons resultados costumam vir com 3× a 4× o mínimo.
Amortecimento — compressão
damping_compressionusado · 0.3Quanto a suspensão amortece ao comprimir (roda subindo em relação ao corpo). Entre 0 (sem amortecimento) e ~1.
A mola comprime livremente e devolve rápido: o carro quica ('boing') a cada solavanco.
O impacto é absorvido de forma controlada, sem quicar — mas exagerar deixa a suspensão 'dura' e lenta.
Amortecimento — relaxamento
damping_relaxationusado · 0.5Quanto a suspensão amortece ao estender (roda descendo, mola voltando). Regra prática: sempre um pouco maior que a compressão — pra 0.3 de compressão, 0.5 de relaxamento.
A mola volta muito rápido depois de comprimir: o carro é 'cuspido' pra cima, ganhando instabilidade.
O retorno é suave e controlado; o carro se reassenta calmamente depois de um buraco ou rampa.
Papéis da roda
use_as_traction · use_as_steeringtraseiras · tração · dianteiras · direçãoDuas flags que definem o papel de cada roda. use_as_traction recebe o engine_force global e empurra o carro. use_as_steering gira com o steering. Definem a arquitetura de tração.
Só as rodas com tração marcada movem o carro. Se nenhuma estiver marcada, o motor gira mas o carro não sai do lugar.
Só as rodas com direção marcada giram na curva. Marcá-las nas 4 dá comportamento de tração/direção integral.
Copy Properties → Paste Properties pra replicar a config nas 4 rodas copia tudo, inclusive as flags de tração/direção. Isso igualou as 4 rodas sem eu perceber — a direção funcionava, mas a tração não. Vale conferir cada roda uma a uma depois de copiar.O controle: engine_force, brake, steering
Estas três propriedades ficam no VehicleBody3D (o corpo), não na roda. O script lê o teclado no _physics_process e escreve nelas a cada passo de física.
engine_force
O torque que as rodas de tração aplicam contra o chão pra empurrar o carro. Não é um valor em Newtons reais — é um botão de sensação. Negativo = ré. Mais força = mais aceleração e maior velocidade final.
brake
A força de frenagem. Só age com as rodas em contato com o chão. Depende da massa: pra massa 1000, a doc sugere 25–30 pra freada forte.
steering
O ângulo de esterço, em radianos no código (graus no Inspector). Suavizado com move_toward pra virar como um carro de verdade, não instantâneo.
engine_force = 40 o carro nem saía do lugar (a velocidade ficava travada em zero no log). Subir pra 2000 provou que a física funcionava — era só ordem de grandeza. Acabei em ~250: forte o bastante pra andar bem, e é aí que o tombamento nas curvas começou a aparecer.Por que o carro capota na curva
O engine_force não capota o carro — ele só empurra pra frente. Quem capota é a velocidade que ela permite atingir: a força lateral numa curva cresce com o quadrado da velocidade. Dobrar a velocidade no mesmo raio = 4× a força lateral tentando derrubar o carro.
Transferência de carga
Numa curva, a inércia atua no centro de gravidade (CG) puxando o carro pra fora. Isso transfere peso da roda de dentro pra roda de fora. Se a de dentro fica sem carga, o carro pivota sobre a de fora e tomba.
Se a aceleração lateral (em g) passar do SSF, o carro tende a capotar. Baixo e largo (t grande, h pequeno) = estável. Alto e estreito = tomba fácil — por isso carros de corrida são baixos e largos, e SUVs capotam mais.
wheel_roll_influence (0.1 → 0.05 → 0.02) deixa o carro cada vez mais colado. Baixar a Position.y do CollisionShape reduz o CG (h menor). Afastar as rodas aumenta a bitola (t maior). Enrijecer a suspensão reduz a inclinação na curva. Todos empurram o SSF pra cima.Diário de bugs
Metade do aprendizado veio das coisas que deram errado. Registro dos sintomas e das causas — porque quase todos vão reaparecer no modelo de verdade, só que mais difíceis de enxergar.
Roda pula pra longe ao colar
Usei Paste as Child e a roda apareceu longe do carro.
Posição local somada duas vezes
A posição era relativa ao modelo; ao virar filha do wheel já deslocado, o offset entrou de novo. Zerar a Position da cópia resolveu.
Roda fica gigante
Ao mover a roda pra fora do modelo, ela dobrou de tamanho.
Perdeu a escala herdada
O hatchback-sports tem scale 0.7. Dentro dele a roda herdava isso; fora, voltou a 1.0. Reaplicar 0.7 corrigiu.
"Can't operate on nodes from a foreign scene"
Não deixava apagar as rodas originais.
Nó de cena importada é protegido
Editable Children deixa editar e copiar, mas não apagar. Esconder pelo ícone de olho basta.
Tela cinza ao rodar
O jogo abriu, mas tudo cinza.
Faltava Camera3D
A câmera do editor é só prévia. Sem uma Camera3D na cena, não há o que renderizar.
Cena escura demais
O carro aparecia, mas quase preto.
Faltava DirectionalLight3D
A luz de prévia do editor não existe no jogo. Um 'sol' + WorldEnvironment resolveram.
Carro não anda (velocity travada em 0)
O log confirmava engine_force: 40, mas a velocidade não subia.
Força fraca demais pra vencer a inércia
Freeze e Axis Lock estavam OK; o chassi não raspava. Era ordem de grandeza — subir o engine_force resolveu.
Como rodar pra apresentar
Dois níveis, do mais rápido ao mais "produto pronto".
Main Scene
Em Project → Project Settings → Application → Run → Main Scene, aponto pra world.tscn. Aí o botão ▶ grande sempre roda o mundo direto, sem escolher aba.
Executável
Em Project → Export, com o preset Linux/X11 e os export templates instalados, gero um binário que roda com duplo-clique — sem abrir o Godot.