Como evito que as rodas do carro raycast deslizem para os lados?

11

Escrevi um mecanismo de física do carro não realista como exercício de aprendizado, usando este artigo como referência.

Eu tenho um carro que colide corretamente com um terreno e aplica as forças de suspensão corretas para cada roda. Meu próximo problema é impedir o movimento lateral das rodas. Por exemplo, se eu derrubar meu carro em uma ladeira, ele deslizará lateralmente pela ladeira e nunca mais parará de deslizar lateralmente (pois não há atrito de nenhum tipo).

O artigo vinculado diz que uma "força lateral" deve ser aplicada, combinada com a força de avanço, mas descreve como essa força lateral é calculada.

Dadas as informações de colisão de cada roda (interseção normal, etc.) e as informações sobre a carroceria rígida do carro, como posso calcular a força lateral apropriada a ser aplicada à carroceria rígida para evitar movimentos laterais?

Kazade
fonte

Respostas:

10

Essa força lateral é o componente horizontal da estrada normal em relação ao movimento para frente do carro. As estradas são inclinadas como você está discutindo para facilitar as curvas em velocidades mais altas sem sair do trilho, empurrando-as para o canto externo. O banco empurra de volta em uma direção em que os pneus não giram livremente e esperamos resistir; se as operações bancárias fossem íngremes o suficiente, o centro de gravidade alto o suficiente ou a velocidade lenta o suficiente, o próprio carro atuaria como uma roda e simplesmente rolaria.

Os pneus têm uma gama limitada de direção. As forças que agem perpendicularmente ao eixo longitudinal (da frente para a traseira) são resistidas em parte porque os pneus não rodam dessa maneira. Você pode calcular a força que age lateralmente contra a estrada a partir da gravidade e da velocidade para frente e, em seguida, calcular a força restante depois que o pneu remove um pouco desse atrito. Se a força restante for grande o suficiente para superar a força que empurra o carro para a estrada, o carro desliza / derrapa.

O seguinte ilustra isso e é discutido aqui (com e sem atrito) :

   https://upload.wikimedia.org/wikipedia/commons/thumb/5/5b/Banked_turn.svg/375px-Banked_turn.svg.png

A força que atua horizontalmente é de particular interesse aqui. Em repouso (apenas a força que atua sobre ela é devida à gravidade), o carro não descerá uma ladeira correndo perpendicularmente, a menos que o coeficiente de atrito seja excepcionalmente baixo ( por exemplo, uma estrada gelada).

Andon M. Coleman
fonte
7

A resposta de Andon não me deu solução, mas definitivamente me colocou no caminho certo!

Quando comecei a pensar nas rodas no seu próprio plano (o normal sendo o vetor saindo do centro - vou me referir a isso como o "normal" da roda)), percebi que a força lateral é apenas o vetor necessário para 'empurre' a velocidade do carro para este plano. Esse vetor é simplesmente o "normal" da roda multiplicado por um escalar, que é o produto escalar entre a velocidade e o "normal".

Aqui está o código que eu decidi que funciona perfeitamente:

            // Now calculate the side force. Get the linear velocity
            auto vel = car->body()->linear_velocity();
            auto side_force = car->wheel_right_axis(i, closest_normal);

            // Find the length of the vector necessary to nullify the horizontal movement
            auto dot = kmVec3Dot(&vel, &side_force);

            // Scale the right vector to that length
            kmVec3Scale(&side_force, &side_force, -dot);

No código acima, "closest_normal" é o normal do terreno em que a roda colidiu e que é usado como um vetor 'up' ao calcular o "normal" da roda.

Kazade
fonte
2
Sim, eu realmente não acho que ia lhe dar a resposta que precisava, mas era muito tempo para colocar em um comentário;)
Andon M. Coleman