Maximalgeschwindigkeit berechnen.
Übersicht

MatthiasBetreff: Maximalgeschwindigkeit berechnen. |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hay.
Ich hoffe mir kann jemand helfen. Folgendendes Problem. Mein Fahrzeug fährt immer schön die Wegpunkte entlang. Mit konstanter Geschwindigkeit. Nun will ich aber das es in den Kurven so weit abbremmst wie es sein Fahrwerk zuläst. Die frage ist also wie hoch darf die Maximalgeschwindigkeit sein wenn: das Fahrzeug eine Beschleunigung von .01 hat. Einen Maximalen Drehwinkel(Fahrwerk) von 1. Darüber hinaus gibs noch die Differenze zwischen den Momentanen Winkel des Fahrzeuges und des nästen Wegpunktes. Sowie die Entfernung von einander. Wäre über jede hilfe glücklich. ![]() |
||
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also, ich weiß jetzt nicht ganz genau was du willst, aber ich denke mal, dass du ausrechnenwillst wie viel Geschwindigkeit man in einer Kurve verliert.
Ich würd dir mal folgende Formeln an die Hand geben: 1. Geschwindigkeit in abhängigkeit von der Beschleunigung: v = a * t + v(0) v ist die Geschwindigkeit, a die Beschleunigung und t die Zeit. v0 ist die alte Geschwindigkeit. Das ganze kannst du auf dem Pc umstellen in v = a+v(0) Die Zeit interessiert dann weniger. Wenn du jetzt einen Bogen fährst dann sieht die Formel für die Geschwindigkeit so aus: v = s/t S ist die Strecke die sich aus dem Umfang des Kreises ergiebt. Also s = 2*Pi*r wobei r der Kreisradius ist. Desto näher du im Kreismittelpunkt bist desto niedriger ist die Geschwindigkeit. Denn t ist die Zeit die man für eine Umrundung auf der äußersten Bahn bräuchte. Also gibst du den Maximalradius für den Kreis vor, berechnest dafür die benötigte Zeit und nimmst diese Zahl dann für einen kleineren Radius etc. Ein Beispiel: Der größte Kreis hat einen Radius von 500 Dann rechnest du für s 2*pi*500 Dann kannst du mit entsprechender Zeit das ganze vorgeben Wenn dein Radius kleiner ist hast du trotzdem die gleiche Zeit. Also wird deine Geschwindigkeit automatisch kleiner. Lg, M0rgenstern |
||
Matthias |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@M0rgenstern. Danke für deine Hilfe. Leider besteht das Problem drozdem noch.
Ich habe mal ein Beispiel gemacht. Ich hoffe weiterhin auf Hilfe. Code: [AUSKLAPPEN] Graphics 800,600,32,2 Global GameTimer=CreateTimer(60) Global MaxWayPoint Dim WayPointX(1000),WayPointY(1000) Global WayPoint Global PosX#,PosY#,Crad#,MaxCrad#=1,MaxSpeed#=1,Speed# AddWayPoint(100,100) AddWayPoint(200,100) AddWayPoint(250,150) AddWayPoint(250,300) AddWayPoint(150,350) AddWayPoint(100,150) AddWayPoint(100,50) PosX=WayPointX(0) PosY=WayPointY(0) Crad=-90 Move=1 SetBuffer BackBuffer() Repeat Cls DrawPfad() If Move=1 Then MoveUnit() If KeyHit(57)=1 Then Move=1-Move Color 255,0,0 Oval PosX-5,PosY-5,10,10 Text 10,10,"Speed:"+Speed Flip 0:WaitTimer(GameTimer) Until KeyDown(1)=1 End Function AddWayPoint(X,Y) WayPointX(MaxWayPoint)=X WayPointY(MaxWayPoint)=Y MaxWayPoint=MaxWayPoint+1 End Function Function DrawPfad() Color 255,255,0 For P=0 To MaxWayPoint-2 X1=WayPointX(P) X2=WayPointX(P+1) Y1=WayPointY(P) Y2=WayPointY(P+1) Line X1,Y1,X2,Y2 Next End Function Function MoveUnit() If Crad<0 Then Crad=Crad+360 If Crad>359 Then Crad=Crad-360 PosX=PosX-Sin(Crad)*Speed PosY=PosY+Cos(Crad)*Speed X#=PosX-WayPointX(WayPoint) Y#=PosY-WayPointY(WayPoint) WStep#=ATan2(X,-Y)-Crad D=Sqr(X*X+Y*Y) If D<20 Then WayPoint=WayPoint+1 If WStep<-179 Or WStep>179 Then If WStep=>0 Then WStep=WStep-360 Else WStep=WStep+360 End If Speed#=MaxCrad/Float(Abs(WStep)/Float(D)) If WStep<-MaxCrad Then WStep=-MaxCrad If WStep>+MaxCrad Then WStep=+MaxCrad Crad=Crad+WStep If Speed>MaxSpeed Then Speed=MaxSpeed End Function Das Fahrzeug (Roter Kreis) fährt zwar den Pfad entlang doch verläst ihn wenn die Kurve zu eng ist. Nun suche ich eine Möglichkeit das das Fahrzeug soweit abbremst damit es noch die Kurve schaft und nicht den Pfad verläßt. |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Durch das kürzen der Geschwindigkeit kommst du niemals auf ein vernünftiges Ergebnis.
Du hast immer das Problem, das bis zum letzen Moment der nächste Waypoint nicht berücksichtigt wird. Wenn Du ihn berücksichtigst, dann ist das für die engen Radien schon zu spät. Du müsstest praktisch "vorahnen" wie steil die nächste Kurve wird. Bis jetzt ist ja das Fahrverhalten deiner letzten Kurve davon geprägt, dass der letzte Waypoint so weit weg ist. Teste das System mal mit weiteren waypoints. Denn das ist die Lösung. Setze bei Richtungswechseln vor der Kurve und nach der Kurve zwei neue waypoint, die in absolut gleichem Abstand (z.b. 25) zum alten waypoint auf der Strecke eingeführt werden. Ersetze das wirkunglose BlitzBasic: [AUSKLAPPEN] Speed#=MaxCrad/Float(Abs(WStep)/Float(D)) durch BlitzBasic: [AUSKLAPPEN] Speed#=MaxCrad -WSTep/100
Ich nehme einmal an, das Fahrzeug soll schon "rund" um, die kurven fahren. Daher ist es wichtig, dass die kurven auch rund sind. Sonst erreichts du niemals das gewünschte Ergebnis. Versuch mal diese Waypoint, nur um das System zu verstehen. Die neuen waypoint sind hier 25 vor und nach dem alten punkt. Der 90° Winkel wurde entschärft. BlitzBasic: [AUSKLAPPEN] AddWayPoint(100,100) Oder hier einmal etwas "enger" mit Radius 10: BlitzBasic: [AUSKLAPPEN] AddWayPoint(100,100) nun ist es an dir die Strecke wirklich so aufzubereiten, oder für das Fahrzeug zur Laufzeit einen virtuellen Verlauf der Strecke zu errechnen. Bei einer ev. Berechnung entscheidest du dich für eine Änderung am waypoint W , wenn die Richtungsänderung z.b. >30° wäre. Da setzt du per algo 2 neue waypoints X Y auf die Strecke und berechnest einen Punkt P genau auf die Mitte der gedachten Verbindungslinie von X nach Y. Nun bewegt den alten waypoint W auf die Mitte der gedachten Verbindungslinie von P nach W. Code: [AUSKLAPPEN] | Y + | | P | + | + | neu +----------+----<------ W X Damit ist der Winkel halbiert. Jetzt kommt erneut die abfrage nach dem winkel bei allen 3 Punkten und u.u. eine erneute Streckenteilung, bis es überall unter 30° Richtungsänderungen sind. Und noch ein ganz anderer Ansatz: Angenommer, du würdest gerne die Eckpunkte mit einem ganz bestimmten Radius R durchfahren wollen. Dann könnte man bis zu einem best. Punkt sich dem Waypoint nähern, dann in eine Kurverfahrt übergehen und dann wenn die andere Richtung erreicht ist, wieder dem nächsten Waypoint folgen. Dazu müßte man sich zwei parallele Wegstrecken denken, die genau R von den original Wegstrecken entfernt sind. Dort wo sie sich schneiden, wäre der Drehpunkt M für die Kurvenfahrt: Code: [AUSKLAPPEN] | : | : |.......:........ | : M | : | : | : +-------:-----<-------- W M lässt sich sicher ganz leicht berechnen. Solange nun die Distanz der aktuelle Fahrzeugposition zu M größer R ist, passiert nix und du näherst dich dem Wegpunkt W . Sobald die Distanz <=r ist geht es in die Kurverfahrt. die so lange dauert wie der Winkel bei W groß war. Erreichts du diesen Winkel geht es wieder geradeaus auf den nächsten Wegpunkt zu. Ausblick: Du könntest sogar in deine Waypointliste einen neuen Parameter "mit diesem Radius durchfahren " aufnehmen und hättest für jeden Waypoint individuelle Radien (weite oder enge kurven). Im Radius führst Du das Fahrzeug in festen (z.b. 5°) Schritten, dann sieht es in engen Radien langsam, in großen Radien schneller aus. Jetzt wird es wirklich abgefahren!!! Wenn dir das system mit den Radien gefällt, dann kann man es sogar fast ohne Berechnungen verwirklichen: Dein Wegpunkt bekommt einige neue Eigenschaften: "Drehe hier immer um den Winkel W% mit dem Radius R% in Schritten von S% Grad, bevor du zum nächsten Wegpunkt aufbrichst." Immer, wenn du einen Wegpunkt erreichtst, wir jetzt eine Drehung gemacht, Kann auch 0 Grad sein, das heisst dann es geht gleich weiter geradeaus. Kann auch Radius 0 sein, dann drehtst du auf der Stelle. Kann auch 90er Schritt sein, dann knickst du ganz wild ab. Kommst du nun an einen solchen Wegpunkt wird M berechnet (jetzt sehr einfach zu machen, liegt ja genau 90° neben dem Weg und R weit weg ). Dann fährt das Fahrzeug einen Radius R in die Winkel-Richtung. Hat es den Endpunkt erreicht, wird der nächste Wegpunkt angepeilt wie gewohnt. Die Wegpunkte deines Beispiels müßten dann immer ca 25 Einheiten früher auf dem Weg vor dem ursprünglichen Waypoint neu bestimmt werden, wen der Radius 25 sein soll. Na wie ist das? |
||
BIG BUG |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Zitat: Dein Wegpunkt bekommt einige neue Eigenschaften: "Drehe hier immer um den Winkel W% mit dem Radius R% in Schritten von S% Grad, bevor du zum nächsten Wegpunkt aufbrichst." ... Na wie ist das? Zu kompliziert. Der Ansatz mehr Wegpunkte zur Berechnung zu verwenden und damit schöne Kurven zu beschreiben ist aber sinnvoll. Zusätzliche Wegpunkte oder gar eine komplette Wunschlinie können durchaus auch berechnet werden. Stichwort: Bézierkurve. Oder Du gibst einfach jedem Wegpunkt noch einen Parameter Geschwindigkeit mit. Abhängig von der Entfernung zum Wegpunkt wird dann entsprechend abgebremst. |
||
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final) |
Matthias |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Vielen dank für eure Interessanten Ideen.
Vorgestern abend ist es mir nach unzähligen versuchen doch endlich gelungen das Problem selbst zu lösen. Vobei Noobodys Winkelberechnungsformel der Durchbruch war. https://www.blitzforum.de/foru...440#358440 Nun wird der Winkel zwischen den nästen und den übernästen Wegpunkt berechnet. Dieser wird duch die maximale Drehgeschwindigkeit gerechnet und mann erhält die Mindestgeschwindigkeit. Nun kann mann die Fahrzeuggeschwindigkeit minus den Bremsfaktor mal die Distance zum nästen Wegpunkt rechnen, und erfährt so wann mann abbremmsen muß um genau am nästen Wegpunkt auf die Mindestgeschwindigkeit zu kommen. PS: Jetzt wo das Problem gelößt ist, kann ich auch endlich weiter schrauben an meinem RTS Spiel. https://www.blitzforum.de/worklogs/311/ |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group