Ich habe ein einfaches Top-Down-Bike-Spiel, dem ich die Lenkung hinzufügen möchte. Ich würde gerne wissen, wie ich den Kurs des Vorderrads verwende, um den Kurs und die Geschwindigkeit des Fahrrads zu bestimmen.
void Update ()
{
//Get input from user Vertical: 0 to 1, Horizontal -1 to 1
float forwardInput = Input.GetAxis("Vertical");
float sidewaysInput = Input.GetAxis("Horizontal") * m_steeringAmount;
// Turn front wheel
m_frontWheelTransform.localEulerAngles = new Vector3(0, sidewaysInput, 90);
// get speed and drag
float speed = m_velocity.magnitude;
Vector3 forwardDrag = -m_forwardDragConstant * m_velocity * speed;
// calculate acceleration
float engineForce = forwardInput * m_enginePower;
Vector3 forwardTraction = transform.forward * engineForce;
Vector3 forwrdForce = forwardTraction + forwardDrag;
Vector3 acceleration = forwrdForce / m_mass;
// update velocity and position
m_velocity += acceleration * Time.deltaTime;
transform.localPosition += m_velocity * Time.deltaTime;
}
Ich habe versucht, die Fahrradgeschwindigkeit auf das Vorder- und Hinterrad anzuwenden und die Differenz der dortigen Positionen zu verwenden, um die Fahrradrichtung zu bestimmen, aber der Vorwärtswiderstand macht es verwirrend.
Bearbeiten basierend auf Madshogo-Kommentar
Antworten:
Ok, ich bin zurück mit Ergebnissen!
Ich habe zwei Ansätze ausprobiert:
Unter Verwendung der Festkörpermechanik wird eine Differentialgleichung abgeleitet, die die Bewegung der Radmitten regelt: Die Eingaben des Systems "Fahrrad" sind das Drehmoment am Hinterrad und der Winkel des Vorderrads, und die Ausgänge sind die Kinematik der Zentren der Räder. Aber ich habe aufgegeben, es war schwer!
Der Versuch zu erraten, was unter geometrischen Gesichtspunkten passiert, wenn das Hinterrad das Vorderrad nach vorne "drückt", wobei das Vorderrad nicht gerade ist. Diese Methode liefert direkt eine Gleichung mit infinitesimalen Inkrementen (siehe unten), aus der Sie eine tatsächliche Differentialgleichung erhalten können. Ich habe nicht versucht, diese erste Gleichung zu manipulieren, um die ODE zu erhalten, aber ich vermute, dass ich dieselbe ODE mithilfe der Festkörpermechanik erhalten hätte. Es fühlt sich einfach richtig an.
Notationen und Hypothesen:
Wir sind in der Ebene mit Basisvektoren ex und ey .
A ist die Mitte des Hinterrads. B ist die Mitte des Vorderrads. Die Länge des Motorrads L ist der Abstand zwischen A und B . Der Winkel zwischen ey und dem Vektor AB beträgt φ . Der Winkel zwischen AB und dem Vorderrad beträgt θ .
Intuitive Begründung:
Wir gehen davon aus, dass zu einem bestimmten Zeitpunkt t , A (t) eine Geschwindigkeit V (t) kolinear mit AB . Daher ist für einen infinitesimalen Zeitschritt dt ,
A (t + dt) = A (t) + V (t) .dt .
Wir nehmen auch an, dass zum Zeitpunkt t das Vorderrad nicht driftet, dh die Geschwindigkeit von B ist kolinear zur Richtung des Vorderrads, dh es bildet mit AB einen Winkel θ . Wir nennen Uθ den Einheitsvektor, der mit AB einen Winkel θ bildet , dh den Einheitsvektor mit der gleichen Richtung wie das Vorderrad.
Daher wird bei t + dt ,
B (t + dt) = B (t) + λ.Uθ
für ein bestimmtes reales, positives λ, so dass die Länge des Fahrrads L erhalten bleibt:
Abstand (A (t + dt), B (t + dt)) = L.
Berechnungen:
Diese letzte Gleichung übersetzt in
Norm² (B (t) + λ.Uθ - A (t) - V (t) .dt) = L²
aber B (t) ist per Definition A (t) + L.Uφ , so dass λ die Gleichung erfüllen muss
norm² (L.Uφ + λ.Uθ - V (t) .dt) = L² .
Die Lösung ist natürlich unabhängig von φ, da das Problem dasselbe ist, wenn das Fahrrad auf positives y zeigt . Wenn wir also R die Rotationsmatrix mit dem Winkel -φ nennen , muss λ die positive Lösung von sein
norm² (L.ey; + λ.Uθ - RV (t) .dt) = L² .
Wenn wir nach einigen Berechnungen v die Norm von V nennen , erhalten Sie
λ = L. (sqrt (1 - (sin (θ). (1-v.dt / L)) ²) - cos (θ)) + v.dt.cos (θ) .
Hier ist der Pseudocode, mit dem ich die obige Animation erhalten habe (anstelle von Uθ verwende ich u = U (θ + φ), weil es einfacher war):
Wenn Sie viel wiederholen und / oder den Lenkwinkel vergrößern, ist die Flugbahn ein Kreis, der meiner Meinung nach kohärent ist.
quelle