4

"Koppelnavigation ist der Prozess der Schätzung der aktuellen Position basierend auf einer zuvor bestimmten Position und Fortschreiten dieser Position basierend auf bekannten oder geschätzten Geschwindigkeiten über die verstrichene Zeit und Kurs." (Wikipedia)Wie wird die Koppelnavigation beim Drehen implementiert?

ich zur Zeit eine einfache Server-Implementierung, die Verwendung von Dead Reckoning Optimierung macht, die beide die Updates erforderlich minimiert, indem logische Annahmen auf den Clients und dem Server.

Die von Benutzern gesteuerten Objekte können als drehend oder nicht drehend bezeichnet werden. Dies stellt ein Problem mit der Koppelnavigation dar (so wie ich es sehe.)

Zum Beispiel, Sie haben einen Punkt A in Zeit definiert durch [Position, Geschwindigkeit, Drehen: links/rechts/nein]. Jetzt wollen Sie Punkt B nach t Menge an Zeit. Wenn Sie nicht drehen, ist die neue Position leicht zu extrapolieren. Die resultierende Richtung ist auch leicht zu extrapolieren. Aber was ist, wenn diese beiden Faktoren kombiniert werden? Die Richtung der Geschwindigkeit ändert sich entlang einer Kurve, wenn sich das Objekt um t Zeit dreht.

Sollte ich vielleicht mit einer anderen Lösung gehen (zum Beispiel, dass der Client ein Update für jede neue Richtung sendet, anstatt dem Server nur zu sagen "Ich gehe jetzt nach links")?

Dies ist übrigens in einem 2D-Raum, der Einfachheit halber.

Antwort

2

Der Einfachheit halber wollen wir sagen, dass Ihre Fahrzeuge einen von der Geschwindigkeit unabhängigen Drehradius haben. So die neue Position zu berechnen, die ersten Koordinaten gegeben und die Zeit:

  • die Entfernung berechnen (das ist Geschwindigkeit * Zeit)
  • berechnen, wie viel Sie gedreht (das ist Abstand/(2 * pi * r))
  • fügen Sie diesen Bogen zur ursprünglichen Position hinzu.

Die letzten Schritte müssen ausgearbeitet werden. Wenn der Winkel a in Schritt 2 berechnet wurde, wenn Sie bei (0,0) mit einem richtigen Nordkurs (dh pi/2 Radianten) begonnen haben und nach links abbiegen, dann lautet Ihre neue Position: (r cos (a) -1, r sin (a)).

Wenn Ihre ursprüngliche Überschrift anders war, sagen Sie es war "b", dann drehen Sie einfach die neue Position entsprechend, d.multiplizieren mit dieser Rotationsmatrix:

[ cos b , -sin b ] 
[ sin(b), cos(b) ] 

Schließlich, fügen Sie die Ausgangsposition hinzu und Sie sind fertig. Jetzt müssen Sie nur ein Update senden, wenn Sie die Geschwindigkeit oder Drehrichtung ändern.

1

Nun, ich denke, "Drehen: links/rechts/nein" ist nicht ausreichend, um Position B zu bestimmen - Sie müssen auch den Bogen kennen, an dem die Kurve gemacht wird. Wenn Sie auf einer Kreisbahn von Radius 1 nach links abbiegen, werden Sie an einer anderen Stelle landen, als wenn Sie eine Kreisbahn mit Radius 10 drehen, auch wenn Ihre ursprüngliche Position, Geschwindigkeit und Richtung der Windung alle die sein werden gleich.

Wenn der Client ein Update für jede neue Richtung sendet und sie als lineare Segmente behandelt, ist dies eine Option, die viel einfacher zu berechnen ist. Sie können einfach jeden neuen Bericht vom Client als Vektor behandeln und summieren. Die Berechnung eines Kurvenbündels wird komplexer.

+0

Ah ja, natürlich kenne ich die Geschwindigkeit, mit der sich die Richtung ändert, aber man kann annehmen, dass sie eine Konstante ist. – Blixt

Verwandte Themen