Wie verhindere ich, dass Raycast-Autoräder seitwärts rutschen?

11

Ich habe eine nicht realistische Fahrzeugphysik-Engine als Lernübung geschrieben und diesen Artikel als Referenz verwendet.

Ich habe ein Auto, das korrekt mit einem Gelände kollidiert und für jedes Rad die richtigen Aufhängungskräfte anwendet. Mein nächstes Problem ist es, eine seitliche Bewegung der Räder zu verhindern. Wenn ich zum Beispiel mein Auto auf einen Hang fallen lasse, rutscht es seitwärts den Hang hinunter und hört dann nie auf, seitwärts zu rutschen (da es keinerlei Reibung gibt).

Der verlinkte Artikel besagt, dass eine "Seitenkraft" angewendet werden muss, kombiniert mit der Vorwärtskraft, aber er beschönigt, wie diese Seitenkraft berechnet wird.

Wie kann ich angesichts der Kollisionsinformationen für jedes Rad (Kreuzungsnormal usw.) und der Informationen über die starre Karosserie des Fahrzeugs die geeignete Seitenkraft berechnen, die auf die starre Karosserie ausgeübt werden muss, um eine Seitwärtsbewegung zu verhindern?

Kazade
quelle

Antworten:

10

Diese Seitenkraft ist die horizontale Komponente der Straßennormalen in Bezug auf die Vorwärtsbewegung des Fahrzeugs. Die Straßen sind wie von Ihnen besprochen steil, um Kurvenfahrten mit höheren Geschwindigkeiten zu ermöglichen, ohne von der Strecke abzukommen, wenn der Schwung sie in die Außenecke drückt. Das Bankstück drückt in eine Richtung zurück, in der sich die Reifen nicht frei drehen und hoffentlich widerstehen können. Wenn die Bank steil genug, der Schwerpunkt hoch genug oder die Geschwindigkeit langsam genug wäre, würde das Auto selbst als Rad fungieren und einfach umdrehen.

Reifen haben einen begrenzten Lenkbereich. Kräfte, die senkrecht zur Längsachse (von vorne nach hinten) wirken, werden teilweise widerstanden, da sich die Reifen nicht auf diese Weise drehen. Sie können die seitlich gegen die Straße wirkende Kraft aus der Schwerkraft und der Vorwärtsgeschwindigkeit berechnen und dann die verbleibende Kraft berechnen, nachdem der Reifen einen Teil dieser Reibung entfernt hat. Wenn die verbleibende Kraft groß genug ist, um die Kraft zu überwinden, die das Auto auf die Straße drückt, rutscht / rutscht das Auto.

Das Folgende veranschaulicht dies und wird hier (mit und ohne Reibung) diskutiert :

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

Von besonderem Interesse ist hier die horizontal wirkende Kraft. Im Ruhezustand (nur die auf ihn einwirkende Kraft ist auf die Schwerkraft zurückzuführen) rutscht das Auto nicht senkrecht einen Hang hinunter, es sei denn, der Reibungskoeffizient ist außergewöhnlich niedrig ( z. B. eine vereiste Straße).

Andon M. Coleman
quelle
7

Andons Antwort gab mir keine Lösung, aber sie brachte mich definitiv auf den richtigen Weg!

Als ich anfing, daran zu denken, dass sich die Räder in ihrer eigenen Ebene befinden (deren Normalität der aus der Mitte ragende Vektor ist - ich werde dies als "normal" des Rads bezeichnen), wurde mir klar, dass die Seitenkraft nur der erforderliche Vektor ist Schieben Sie die Geschwindigkeit des Autos auf dieses Flugzeug. Dieser Vektor ist einfach die "Normal" des Rades multipliziert mit einem Skalar, der das Punktprodukt zwischen der Geschwindigkeit und der "Normalen" ist.

Hier ist der Code, für den ich mich entschieden habe und der perfekt funktioniert:

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

Im obigen Code ist "next_normal" die Normalen des Geländes, mit dem das Rad kollidiert ist und das bei der Berechnung der "Normalen" des Rads als Aufwärtsvektor verwendet wird.

Kazade
quelle
2
Ja, ich dachte nicht wirklich, dass das dir die Antwort geben würde, die du brauchst, aber es war viel zu lang, um einen Kommentar abzugeben;)
Andon M. Coleman