Pular para o conteúdo principal
sandbox · operacionalengine · Godot 4.7física · Jolt / raycast vehiclemodelo · Kenney · hatchback-sports.glbfrente · PIBIC · Notas
Dossiê de dinâmica veicular

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.

Raiz da cena
VehicleBody3D
Rodas
4 × VehicleWheel3D
Tração
Traseira (2 rodas)
Direção
Dianteira (2 rodas)
Massa do corpo
40 (padrão)
O carro hatchback renderizado sobre o chão do world.tscn no Godot, com iluminação e ambiente.
O resultado rodando: o carro instanciado sobre o mundo, com chão, sol e ambiente — o ponto de chegada deste dossiê.
01

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.

◉ WorldNode3D · raiz do mundo
├─ 🚗 Car VehicleBody3D · instância de car.tscn
│  ├─ ▢ hatchback-sportsmodelo glTF · scale 0.7
│  │  └─ bodysó o visual da carroceria
│  ├─ ⬢ CollisionShape3DBoxShape3D · a física do chassi
│  ├─ ◎ WheelFrontLeftsteering
│  ├─ ◎ WheelFrontRightsteering
│  ├─ ◎ WheelBackLefttraction
│  ├─ ◎ WheelBackRighttraction
│  └─ 🎥 Camera3Dcâmera de perseguição, filha do carro
├─ ▦ StaticBody3Do chão · irmão do carro, não filho
├─ ☀ DirectionalLight3Do "sol" da cena
└─ ◐ WorldEnvironmentcéu e iluminação ambiente
Dock SceneTree do Godot mostrando a cena world.tscn com o World na raiz, o Car instanciado, o chão, a luz e o WorldEnvironment.
world.tscn — o palco: carro, chão, sol e ambiente.
Dock SceneTree do Godot mostrando a cena car.tscn com o VehicleBody3D na raiz, o modelo, a colisão, as quatro rodas e a câmera.
car.tscn — o veículo: corpo, colisão, 4 rodas e câmera.
Corpo do veículo — recebe as forçasRodas — raycast + tração/direçãoColisão — o que a física "sente"Malha — só o visual
A pegadinha do multicorpo. O VehicleBody3D não é um modelo multicorpo de verdade: é um corpo rígido único onde as rodas são raycasts com uma mola. A própria doc do Godot avisa que não foi feito pra física de veículo realista. Justamente por isso ele é um bom sandbox — no Tema 1, cada roda/corpo vira um nó rígido próprio ligado por articulações, com as forças resolvidas por restrições, não por raycast.
02

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 carrega texturas embutidas; OBJ não, e FBX é proprietário. Arrastar o .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.

O CollisionShape é irmão do modelo, não filho. Mover o modelo não arrasta a colisão junto: os transforms são independentes.

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.

Nós vindos de uma cena importada não podem ser apagados ("foreign scene") — a saída é escondê-los pelo ícone de olho.

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.

Posição de um nó é sempre relativa ao pai. Quando o pai tem escala ≠ 1, ela multiplica tanto o tamanho quanto a posição dos filhos.

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.

A luz e a câmera do editor são só prévia — não existem no jogo rodando. Toda cena precisa das suas próprias.
O veículo montado no editor do Godot: carroceria hatchback com as quatro rodas extraídas posicionadas nos cantos do chassi.
O carro montado: carroceria, colisão e as 4 rodas já extraídas e reposicionadas com a escala 0.7 aplicada.
03

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.

Painel Inspector do Godot com os campos de uma VehicleWheel3D: raio, comprimento de repouso, rigidez e amortecimento da suspensão, e aderência.
Os campos da VehicleWheel3D no Inspector — é isso que cada medidor abaixo destrincha.

Raio da roda

wheel_radiususado · 0.21 m

O 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.

Menor

A roda encosta mais embaixo da origem: o carro fica mais baixo e pode raspar o chassi no chão.

Maior

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 m

Quanto a roda 'desce' da sua origem quando o carro está parado, em repouso. É a folga que a suspensão usa pra acomodar o peso.

Menor

Suspensão trabalha num curso curto: resposta mais 'seca', o carro fica colado à altura da origem.

Maior

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.

Menor (→0)

O carro fica mais 'grudado': resiste muito mais a capotar nas curvas, de forma artificial mas eficaz.

Maior

Mais torque lateral chega ao corpo: o carro inclina e tomba com mais facilidade.

Aderência (grip)

wheel_friction_slipusado · 1.0

Quanto de agarre a roda tem contra o chão. Combina com o atrito da superfície. 0 é gelo, 1 é aderência normal.

Menor

A roda escorrega: o carro derrapa, perde tração e desliza nas curvas. Bom pra simular desgaste ou drift.

Maior

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 m

A 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).

Menor

Suspensão rígida e curta: o carro sente cada irregularidade, quica menos mas absorve pior os impactos.

Maior

Curso longo: absorve buracos e rampas com mais suavidade, mas o corpo balança e mergulha mais.

Rigidez da mola

suspension_stiffnessusado · 60 N/mm

A 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.

Menor

Mola macia (perfil off-road/rover): o carro 'boia', inclina mais nas curvas e mergulha ao frear. Bom pra terreno irregular.

Maior

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 · 40

O 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.

Menor

Se cair abaixo de ¼ da massa, a suspensão 'cede': o carro afunda e senta no chão, como se não tivesse mola.

Maior

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.3

Quanto a suspensão amortece ao comprimir (roda subindo em relação ao corpo). Entre 0 (sem amortecimento) e ~1.

Menor

A mola comprime livremente e devolve rápido: o carro quica ('boing') a cada solavanco.

Maior

O impacto é absorvido de forma controlada, sem quicar — mas exagerar deixa a suspensão 'dura' e lenta.

Amortecimento — relaxamento

damping_relaxationusado · 0.5

Quanto 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.

Menor

A mola volta muito rápido depois de comprimir: o carro é 'cuspido' pra cima, ganhando instabilidade.

Maior

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ção

Duas 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.

Traseiras · 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.

Dianteiras · direção

Só as rodas com direção marcada giram na curva. Marcá-las nas 4 dá comportamento de tração/direção integral.

Atalho perigoso que aprendi. Usar 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.
04

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.

A descoberta do "força bruta". Com 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.
05

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.

SSF = t / (2·h)Static Stability Factor · t = bitola (distância entre rodas) · h = altura do CG

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.

CGht (bitola)F lateral+carga−carga
O que dá pra brincar pra sentir isso. Baixar 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.
06

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.

Sintoma

Roda pula pra longe ao colar

Usei Paste as Child e a roda apareceu longe do carro.

Causa

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.

Sintoma

Roda fica gigante

Ao mover a roda pra fora do modelo, ela dobrou de tamanho.

Causa

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.

Sintoma

"Can't operate on nodes from a foreign scene"

Não deixava apagar as rodas originais.

Causa

Nó de cena importada é protegido

Editable Children deixa editar e copiar, mas não apagar. Esconder pelo ícone de olho basta.

Sintoma

Tela cinza ao rodar

O jogo abriu, mas tudo cinza.

Causa

Faltava Camera3D

A câmera do editor é só prévia. Sem uma Camera3D na cena, não há o que renderizar.

Sintoma

Cena escura demais

O carro aparecia, mas quase preto.

Causa

Faltava DirectionalLight3D

A luz de prévia do editor não existe no jogo. Um 'sol' + WorldEnvironment resolveram.

Sintoma

Carro não anda (velocity travada em 0)

O log confirmava engine_force: 40, mas a velocidade não subia.

Causa

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.

07

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.