Estou em um ponto no meu veículo em que, quando estou indo rápido e girando, o veículo age de maneira estranha porque os pneus internos estão se movendo mais rapidamente do que os pneus externos. Então, eu preciso descobrir como programar em um diferencial, mas eu não consigo fazê-lo funcionar corretamente, então eu estou aqui para ver se alguém tem experiência com isso.
Eu verifiquei online a física, mas isso parece levar mais informações do que eu posso fornecer no meu jogo (como a influência da gravidade real no veículo). Atualmente, uso a seguinte lógica para determinar as velocidades diferenciais das rodas. Vou tentar explicar da maneira mais clara e simples possível, e peço desculpas se é confuso ou simplificado demais, é confuso para mim!
Aqui está o que eu faço: divido meu grau de turno atual pelo valor máximo de turno para obter uma porcentagem, depois pego essa porcentagem e a aplico a uma porcentagem modificadora (apenas uma porcentagem que inventei e aprimorei para reduzir o número passado para o diferencial, não tenho certeza do que realmente deveria ser. Velocidade do motor? Velocidade?). Então, no meu diferencial, verifico se o veículo está virando para a esquerda ou direita e reduzo a velocidade de um lado em x% e aumento a velocidade do outro lado no mesmo x%
Estou certo de que meu maior problema é o número que estou inventando para reduzir a porcentagem de turnos, mas não sei dizer o que colocar lá. Eu sei que passar diretamente o turn% para o diferencial (digamos, 40%) reduziria um lado em 40 e aumentaria o outro em 40 e isso claramente não está certo.
Tenho acesso à velocidade do motor, transmissão, velocidade de cada roda, torque, velocidade do veículo, etc., mas não tenho certeza de quais delas devo levar em consideração ao fazer esta fórmula.
Talvez eu esteja complicando demais ou talvez esteja simplificando demais. Qualquer ajuda para entender isso seria ótimo!
Respostas:
Eu realmente acho que você não deve fazê-lo dessa maneira e que você deveria examinar mais a física real (veja meu comentário). No entanto, posso dizer por que sua abordagem atual não funciona. (Muito tempo para os comentários, então eu vou postar isso como resposta)
Vamos primeiro explorar o que acontece (você provavelmente já fez isso sozinho).
A localização é basicamente como na figura acima, mas vamos simplificar um pouco os números:
Digamos que o carro C tenha 2 metros de largura e um círculo de viragem mínimo de 5 metros. Agora eu dirijo completamente à esquerda. A roda dianteira esquerda agora segue um círculo com um diâmetro de 5 metros. A roda dianteira direita segue agora um círculo com o diâmetro de 7 metros. Ao completar um círculo completo, a roda esquerda percorre 10 * pi metros. A roda direita percorre 14 * pi metros. Agora dizer que as rodas de C todos têm o mesmo tamanho, e que o perímetro das rodas é de 0,5 metros * pi (sim essas são as rodas grandes, mas ninguém disse que não poderia modelar um caminhão monstro!) O diferencial será é necessário garantir que, a cada 20 rotações da roda esquerda, a roda direita gire 28 vezes para que nenhuma delas deslize.
Então você pode dizer agora que o diff-% deve ser ajustado, digamos, para a esquerda completa, deve diferenciar + 40%, e vamos ler isso para a direita direita -40% e então somos dourados?
Infelizmente, como você viu, isso não funciona. Vamos encontrar uma fórmula geral para o diferencial neste carro. Aqui x é o círculo de viragem desejado.
Eu argumentaria que o diff deve funcionar na fração ((x + 2) * 4 / (x * 4)) [*]. (Vezes 100%, se você quiser em porcentagens) Vamos traçar isso:
Como você pode ver claramente, essa função não é linear. Portanto, apenas ter o diferencial depende linearmente de quanto sua direção para a esquerda ou para a direita nunca vai funcionar.
Agora vejo que é tentador usar apenas a fórmula acima, mas acho que provavelmente é melhor se você não usar, pelas razões descritas acima :). Além disso, você precisará implementar 2 diferenciais, a menos que, se sua direção envolver as quatro rodas, o que dificulta ainda mais a implementação, consulte a 1ª imagem novamente.
[*]: que podemos simplificar: (x + 2) * 4 / (x * 4) => (x + 2) / x
fonte