¿Cómo evito que las ruedas de los automóviles Raycast se deslicen de lado?

11

He estado escribiendo un motor de física de automóviles no realista como ejercicio de aprendizaje, utilizando este artículo como referencia.

Tengo un automóvil que choca correctamente con un terreno y aplica las fuerzas de suspensión correctas para cada rueda. Mi siguiente problema es evitar el movimiento lateral de las ruedas. Por ejemplo, si dejo caer mi automóvil en una pendiente, se deslizará hacia los lados y luego nunca dejará de deslizarse hacia los lados (ya que no hay fricción de ningún tipo).

El artículo vinculado dice que se debe aplicar una "fuerza lateral", combinada con la fuerza de avance, pero se pasa por alto cómo se calcula esa fuerza lateral.

Dada la información de colisión para cada rueda (intersección normal, etc.) y la información sobre el cuerpo rígido del automóvil, ¿cómo puedo calcular la fuerza lateral adecuada para aplicar al cuerpo rígido para evitar el movimiento lateral?

Kazade
fuente

Respuestas:

10

Esa fuerza lateral es el componente horizontal de la carretera normal con respecto al movimiento de avance del automóvil. Las carreteras están inclinadas como si estuvieras discutiendo para facilitar las curvas a velocidades más altas sin volar fuera de la pista por el impulso que las empuja hacia la esquina exterior. La banca empuja hacia atrás en una dirección en la que los neumáticos no giran libremente y, con suerte, pueden resistir; Si la inclinación fuera lo suficientemente empinada, el centro de gravedad lo suficientemente alto o la velocidad lo suficientemente lenta, el automóvil en sí mismo actuaría como una rueda y simplemente giraría.

Los neumáticos tienen un rango limitado de dirección. Las fuerzas que actúan perpendicularmente al eje longitudinal (de adelante hacia atrás) se resisten en parte porque los neumáticos no rotarán de esa manera. Puede calcular la fuerza que actúa lateralmente contra la carretera a partir de la gravedad y la velocidad de avance y luego calcular la fuerza restante después de que la llanta elimina parte de esta fricción. Si la fuerza restante es lo suficientemente grande como para superar la fuerza que empuja el automóvil hacia la carretera, el automóvil se deslizará / patinará.

Lo siguiente ilustra esto y se discute aquí (con y sin fricción) :

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

La fuerza que actúa horizontalmente es de particular interés aquí. En reposo (solo la fuerza que actúa sobre él se debe a la gravedad), el automóvil no se va a deslizar por una pendiente perpendicular a menos que el coeficiente de fricción sea excepcionalmente bajo ( por ejemplo, una carretera helada).

Andon M. Coleman
fuente
7

La respuesta de Andón no me dio la solución, ¡pero definitivamente me puso en el camino correcto!

Una vez que comencé a pensar que las ruedas estaban en su propio plano (la normal de las cuales era el vector que sobresalía del centro, me referiría a esto como la "normal" de la rueda) me di cuenta de que la fuerza lateral es solo el vector requerido para 'empuje' la velocidad del automóvil en este avión. Este vector es simplemente el "normal" de la rueda multiplicado por un escalar que es el producto de punto entre la velocidad y el "normal".

Aquí está el código que resolví que funciona perfectamente:

            // 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);

En el código anterior, "más cercano_normal" es la normalidad del terreno con el que colisionó la rueda con la que se utiliza como un vector "arriba" al calcular la "normalidad" de la rueda.

Kazade
fuente
2
Sí, realmente no pensé que eso iba a darte la respuesta que necesitabas, pero fue demasiado largo para poner un comentario;)
Andon M. Coleman