Programando veículos em jogos
(wassimulator.com)- Implementar veículos em jogos prioriza a experiência de jogo em vez de um motor físico realmente fiel
- Cada jogo de corrida e simulador tem diferenças na forma de controlar o carro e no nível de imersão
- A simulação de veículos é composta por três elementos: motor/câmbio, pneus e chassi
- A modelagem dos pneus e o conceito de slip são a chave para reproduzir uma sensação de direção realista
- O desenvolvedor precisa definir por conta própria o nível de simplificação e abstração adequado ao conceito do jogo
Por que veículos são especiais em jogos
Veículos dentro de jogos são usados como um elemento experiencial importante em vários gêneros
Tanto controles irreais quanto simulações de direção realistas conseguem transmitir a “sensação de dirigir”
Por exemplo, Mario Kart e Assetto Corsa buscam experiências fundamentalmente diferentes, mas a essência da programação de veículos é a mesma
Em vez de reproduzir com precisão as leis da física do mundo real, o foco está em como transmitir a sensação de direção que o usuário espera
O objetivo do desenvolvedor não é tanto a “simulação exata”, mas sim projetar a experiência pretendida
Tentativas iniciais e lições: AV Racer
No início do desenvolvimento de AV Racer, o veículo era movido com um modelo simples de mecânica newtoniana, mas isso não produzia a sensação de um carro real
Foram repetidos hardcodings e ajustes de parâmetros para rotação, drift, velocidade angular e outros aspectos
Isso criava uma sensação empírica de “deslizamento”, mas não atendia a situações extremas nem às expectativas de motoristas reais
Sem compreender a física real do veículo e a experiência do motorista, esbarra-se em limitações fundamentais
No fim, para implementar corretamente, tornou-se necessário estudar os princípios reais da dinâmica veicular
Estrutura da simulação de veículos para jogos
Um veículo em jogo pode ser dividido em três elementos conceituais: motor (e câmbio), rodas/pneus e chassi
Motor (incluindo o câmbio)
- Recebe entradas como acelerador e troca de marchas
- Calcula torque e RPM e os converte de acordo com a relação de marcha
- Interage com as rodas por feedback mútuo (ou seja, sincronização bidirecional entre motor e rodas)
Pneus (incluindo as rodas)
- Recebem várias entradas, como torque do motor, freio, esterçamento, peso e atrito com a pista
- Todas as forças são geradas no ponto de contato pneu-solo
- A modelagem dos pneus (por exemplo, Pacejka Magic Formula) permite reproduzir forças realistas
Chassi
- Atua como o corpo rígido do motor físico
- Reage a influências externas como força dos pneus, resistência do ar, gravidade e colisões
- Determina o movimento geral do veículo e afeta a variação de carga nos pneus
| Componente | Principais entradas | Principais saídas |
|---|---|---|
| Motor/câmbio | Acelerador, entrada de troca de marcha, velocidade das rodas | Torque rotacional, RPM |
| Pneus | Torque do motor, freio, esterçamento, carga, atrito | Forças no chassi, sincronização motor-roda |
| Chassi | Forças dos pneus, resultados aerodinâmicos | Carga nas rodas, deslocamento geral |
Implementar com 100% de fidelidade todos os detalhes físicos, como em um veículo real, é irrealista
A menos que se trate de um laboratório de pesquisa de uma montadora, a maioria dos jogos e simulações usa modelos de caixa-preta, fórmulas e abordagens simplificadas
Por isso, o essencial é o projetista decidir o que omitir e o que enfatizar
Projeto do motor e do trem de força
Motor (o núcleo do cálculo de torque)
- Embora na realidade seja extremamente complexo, em código ele pode ser modelado como uma simples caixa-preta de entrada (RPM, acelerador) → saída de torque
- A curva de torque/potência pode ser parametrizada por valores numéricos ou gráficos, permitindo simular motores com características distintas
- Exemplo: projetar diretamente a curva em ferramentas como o Desmos para ajustar a “personalidade do motor”
Câmbio
- Pode ser implementado de forma simples com uma tabela de relações de marcha
- A troca de marchas determina características de aceleração, velocidade máxima etc. do veículo
- É simples, mas tem grande impacto na experiência de jogo
| Marcha | Relação |
|---|---|
| R | -2.92 |
| N | 0 |
| 1 | 2.50 |
| 2 | 1.61 |
| 3 | 1.10 |
| 4 | 0.81 |
| 5 | 0.68 |
Sincronização de RPM entre motor e rodas
- O RPM do motor e a velocidade angular das rodas motrizes são interligados
- O cálculo numérico é feito por equações diferenciais com base na diferença entre essas duas variáveis de estado
- A cada frame, implementa-se uma convergência gradual no estilo de “perseguir o valor-alvo” até que coincidam
Isso permite expandir tanto para um estilo arcade quanto para um estilo de simulador
Quando o jogador ajusta vários parâmetros do motor (por exemplo, perfil de comando, turbo etc.), isso pode ser ligado a mudanças no som ou na curva de potência
Mesmo sem imitar exatamente o movimento de um motor real, é possível transmitir clareza na relação de causa e efeito e fortalecer a experiência de interação
Modelo de pneus
O papel dos pneus
- São a única parte do veículo que realmente entra em contato com a estrada
- Todas as forças de aceleração, frenagem e contorno de curva são geradas na área de contato do pneu
- A geração de forças gira em torno da deformação elástica e das características de atrito
Força longitudinal (aceleração/frenagem) e slip ratio
- O pneu oferece aderência máxima em estado de atrito estático; ao ultrapassar o limite, passa para atrito dinâmico (slip)
- O slip ratio é calculado pela diferença entre a velocidade de rotação da roda (tração/frenagem) e a velocidade de deslocamento no solo
- slip ratio = (velocidade angular da roda - velocidade angular de rotação livre) / velocidade angular de rotação livre
- Em geral, há slip quando a roda gira mais rápido que o solo durante a aceleração, ou mais devagar durante a frenagem
- A variação da aderência em função do slip ratio pode ser desenhada como uma curva em gráfico
- A aderência aumenta até certa faixa e, após o ponto máximo, cai bruscamente
Fórmulas de cálculo de força com slip ratio (Pacejka Magic Formula etc.)
- Usa-se o slip ratio como entrada para fórmulas que produzem curvas complexas (seno/arctan parametrizados)
- O cálculo precisa ser feito individualmente para cada pneu
Força lateral (contorno de curva) e slip angle
- Durante a curva, a área de contato se deforma e surge o slip angle
- slip angle = diferença angular entre a direção real de avanço do pneu e a direção para a qual a roda aponta
- À medida que o slip angle aumenta, mais aderência é gerada gradualmente, mas ao passar do limite ocorre derrapagem
- A relação entre slip angle e aderência também forma uma curva característica
- Muitos parâmetros influenciam isso, como carga, atrito e mudanças dinâmicas
Fenômenos como understeer e oversteer
- Understeer: quando o slip angle do eixo dianteiro é maior que o do traseiro, o carro gira menos do que o desejado
- Oversteer: quando o slip angle traseiro fica maior, a traseira do carro escapa para fora
- Com um modelo de pneus correto, essas características de dirigibilidade surgem naturalmente
Limitação mútua entre forças longitudinais/laterais (Friction Circle)
- Quando o pneu usa força ao mesmo tempo para aceleração/frenagem e para fazer curva, o máximo disponível em cada direção passa a afetar a outra
- Círculo de atrito (circle/ellipse): a soma dos dois vetores de força não pode ultrapassar um limite
- (F_{x}^2 + F_{y}^2 \le (\mu F_{z})^2)
- Exemplo: em frenagem forte com esterçamento acentuado, é fácil perder o controle
- Como pneus reais têm comportamento curvo/não linear, é preciso ajustar os parâmetros aos dados reais
Implementação no código
- Calcular separadamente, em cada pneu, as forças longitudinais e laterais
- Somar os dois vetores e normalizá-los (scaling) para dentro de um círculo de atrito virtual
- Ajustando os parâmetros dinamicamente, também é fácil experimentar mudanças sofisticadas na dirigibilidade
Integração ao motor físico do veículo completo
- Agregar ao chassi as forças dos pneus + a saída da suspensão + influências externas (gravidade, drag etc.)
- Atualizar aceleração/velocidade a cada frame com base nas leis do movimento de Newton
Elementos adicionais expansíveis
- Geometria da suspensão: cambagem, caster etc.
- Dinâmica avançada dos pneus: temperatura, desgaste, expansão, variação de carga etc.
- Aerodinâmica: downforce, drag, spoiler com ajuste automático
- Trem de força/diferencial, ABS, ESP, limite de esterçamento etc.
- Se necessário, consultar livros como Race Car Vehicle Dynamics (Milliken), Mechanics of Pneumatic Tires (S.K. Clark)
Conclusão
Só com os modelos acima já é possível implementar a base de um veículo para jogos que se comporta de forma semelhante a um carro real
Detalhes adicionais podem ser expandidos conforme o objetivo e a necessidade do desenvolvimento
O essencial é a simplificação/abstração dos princípios básicos obtidos do mundo real e uma filosofia de design centrada na experiência de jogo
Se houver dúvidas, opiniões ou sugestões de correção, entre em contato
2 comentários
Li errado como 'programando veículos em veículos' e pensei: isso não é meio perigoso?
Comentários do Hacker News
O interessante é que, na prática, o motor é a parte com mais componentes em movimento, mas no código acaba sendo a parte mais simples de toda a simulação do carro. Isso porque o papel central do motor é ser uma calculadora de torque. Ele recebe várias entradas e produz apenas uma saída, o torque de rotação, quase como uma caixa-preta. Recomendo muito a série de vídeos do simulador de motores do AngeTheGreat. É impressionante ver como foi otimizado a ponto de rodar em tempo real e ainda produzir sons de motor realistas. Veja o vídeo do simulador de motor do AngeTheGreat
O jogo Automation tem um construtor/simulador de motores extremamente aprofundado. Fazer todo tipo de experimento com motores é realmente divertido, e a parte de simulação de som também adota alguns conceitos abordados nos vídeos do AngeTheGreat
Isso me lembra o exemplo clássico de animar um cubo no Houdini. Há algo muito divertido nas surpresas que surgem em uma simulação em tempo real de motor a combustão interna. Exemplo de animação de cubo no Houdini
Comecei a programar porque meu pai escrevia um simulador de motores em BASIC. Ele era engenheiro mecânico e queria comparar as curvas de torque de vários projetos de motor. Quando ele desenhava wireframes de pistões, do conjunto do virabrequim e do próprio virabrequim se movendo em quadros de menos de um segundo com os comandos CIRCLE e LINE, fiquei chocado ao perceber que era possível desenhar e animar algo no computador. É realmente impressionante que esta pessoa tenha feito algo parecido para criar sons melhores de carros de corrida
Motores de EV não são, na verdade, muito simples? Motores a combustão são caros e complexos porque usam pequenas explosões para gerar torque. Por isso fico pensando se a maioria dos carros nos jogos não se comporta como EVs, a menos que se simule um ICE com mais precisão
Fui responsável por toda a simulação de veículos em Army of Two. Este texto é uma boa introdução. Aplicar o modelo de pneus de Pacejka e diferenciais de transmissão ajudou muito. Além disso, é surpreendente como a simulação física de barras estabilizadoras e da suspensão é extremamente importante para criar uma dirigibilidade “divertida”. Sem isso, a condução fica escorregadia e pouco imersiva. Dá para sentir isso até no vídeo de demonstração. Se você não implementar barras estabilizadoras e suspensão, o carro capota com facilidade, e aí você acaba mexendo sem parar no deslizamento dos pneus ou nas configurações de atrito da superfície, o que na verdade piora a experiência de dirigir
Muito obrigado por essa informação! Eu não fazia ideia de que a barra estabilizadora era tão importante em um modelo básico. Vou estudar mais sobre isso e, se conseguir implementar bem, pretendo atualizar o texto
Recentemente apareceu um problema na suspensão do meu carro, então acabei experimentando na prática o que é uma “dirigibilidade sem graça”. Isso me fez concordar ainda mais com o comentário
Isso é muito parecido com o que eu mesmo percebi ao fazer o jogo Flightle. Eu estava criando um simulador de voo lateral para celular, mas o movimento do avião parecia esquisito demais, então, irritado, pensei: “o que há de tão difícil nisso?” e comecei a fazer eu mesmo. Ao estudar os princípios de voo, percebi como é importante o nível certo de abstração. Se for irreal demais, não fica divertido; se for realista demais, fica difícil equilibrar a jogabilidade. Link do Flightle
Já é tarde para editar o comentário, mas reuni minhas experiências em mais detalhe em um texto separado. Dê uma olhada em como fiz um simulador de voo com rolagem lateral. Depois, mudei o avião de um ponto para uma estrutura com duas asas ligadas por uma barra, e sofri bastante para ajustar isso de um jeito divertido. Alguém mais habilidoso talvez tivesse feito melhor
Gostei bastante do jogo. Para usuários de desktop, eu sugeriria permitir controlar os sliders com a roda de rolagem do mouse
Há algum tempo fiz um jogo para iOS que simula carros e drift. Era baseado em SpriteKit, mas pode ser implementado facilmente em qualquer engine 2D. A ideia básica é conectar as duas rodas dianteiras à carroceria retangular com juntas de pino e aplicar força nas rodas. O ângulo da força é calculado assim: x = force * cos(bodyRotation + wheelRotation) y = force * sin(bodyRotation + wheelRotation) Também adicionei partículas de derrapagem. O drift foi implementado ajustando os valores de damping das rodas e da carroceria. App Drift Mania Infinite Car Racer
O jogo tem muita personalidade! Gostei de como ele começa na hora. As partículas de derrapagem são práticas. O visual também é bom. Mas, para mim, a dificuldade estava alta demais. Se tivesse algo como um “modo zen” em que bater na parede não reinicia, eu jogaria mais
O jogo é muito legal. A loja de apps é tão competitiva que conseguir 22 avaliações já é impressionante. Fiquei curioso para saber como você divulgou isso
“Este jogo oferece gráficos incríveis...” Esse humor autodepreciativo é muito fofo. Já estou baixando
Este texto foi sinceramente muito interessante. Só a parte sobre o modelo de pneus já vale várias releituras. Se a ideia é buscar diversão sem se preocupar com simulação ou realismo, nada supera o arcade Super Sprint dos anos 1980. Informações sobre o jogo Super Sprint
Vou colar aqui parte de alguns materiais de palestras relacionadas que eu tinha guardado nas minhas notas: Hamish Young, física de veículos e dinâmica de pneus em ‘Just Cause 4’ Vehicle Physics and Tire Dynamics in 'Just Cause 4' Jan Erik Steel & Patrick Donnelly, física de veículos supercharged em ‘Skylanders’ Supercharged! Vehicle Physics in 'Skylanders' Edward Pereira, palestra sobre a ciência do off-road The Science of Off-Roading Jared Cone, a física de ‘Rocket League’ It IS Rocket Science! The Physics of 'Rocket League' Detailed
O texto em si é ótimo, mas a introdução me pareceu um pouco confusa. Diz que carros oferecem vários tipos de experiências irreais nos jogos, mas armas não, e isso me parece questionável. Na verdade, os jogos estão cheios de armas irreais. Além disso, o texto afirma que nossas expectativas sobre dirigir vêm mais da mídia e da cultura do que da experiência direta, mas isso não se aplica ainda mais às armas? Até o salto é tratado de formas muito diferentes nos jogos, e minhas expectativas sobre salto vêm muito mais da experiência real de já ter pulado
Parece que você não tem muita experiência fazendo FPS. Armas reais são diferentes da experiência nos jogos. Se fossem exatamente iguais às reais, seriam bem menos divertidas e mais frustrantes. Com jogos de corrida é a mesma coisa: para ficar divertido, é preciso distorcer a realidade na medida certa
Acho que esse tema não é sobre “realismo”, e sim sobre “verossimilhança”. O importante é criar uma experiência que o jogador considere crível. As armas nos jogos são diferentes das reais, mas priorizam a fantasia de parecerem poderosas e ameaçadoras. O salto também não tem base realista, mas é desenhado da forma que melhor serve ao objetivo do jogo. Já em áreas como carros, em que há fatos físicos e sistematização possível, busca-se uma representação mais realista, comparável até a simulações industriais. Por outro lado, movimento humano, sistemas econômicos, fluxo de combate e coisas do tipo são muito mais difíceis de abordar com esse grau de realismo, então costumam ser retratados de forma bem mais cartunesca. O designer de jogos precisa encontrar um compromisso adequado que combine com as expectativas do jogador e com os objetivos gerais do jogo. Perseguir apenas um realismo excessivamente detalhado e estragar a estrutura do todo é uma armadilha comum
O exemplo de FPS foi algo que me veio à cabeça às pressas no palco, mas pensando melhor percebi que não é um bom exemplo. Obrigado por apontar isso
Acho que faltaram elementos como colinas, rampas e suspensão. A Unreal Engine tem até uma demo de veículo bem simples, e também existem demos com modelos reais de suspensão
No fim da apresentação e do texto há um vídeo curto mostrando o estado atual do engine, e no vídeo há vários tipos de terreno, incluindo colinas e rampas. Na apresentação foi usada uma grade plana simples. A suspensão também foi implementada, mas como não é tanto um problema especial de carros e sim uma funcionalidade mais geral para suportar peso, ela não foi abordada em profundidade por questão de tempo e de fluxo da apresentação
Como o Wassim mencionou no Q&A, a suspensão é tratada automaticamente pelo motor de física, e o efeito dela se reflete na carga do pneu, influenciando naturalmente também as forças do pneu
Há uma boa palestra da GDC sobre a física dos veículos em Rocket League. Veja a palestra sobre a física de Rocket League. Para contextualizar, eu era do time, mas não trabalhava no cliente do jogo, e sim em outra parte
Ao ler este texto, lembrei de uma boa palestra sobre física de corrida. Veja Andre Marziali - Physics of Racing