Beschleunigte Bewegung auf exakte Zielkoordinaten - Problem
Übersicht

KompensatorBetreff: Beschleunigte Bewegung auf exakte Zielkoordinaten - Problem |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo,
ich habe ein Problem, daß recht simpel klingt, mir aber schon lange Kopfzerbrechen bereitet. Ich habe ein Objekt welches mit einer Beschleunigung a beschleunigt. Daraus errechnet sich die Geschwindigkeit v=v+a. Ich muß rechtzeitig mit b abbremsen (v=v-b), damit ich exakt auf den vorgegebenen Zielkoordinaten lande und nicht 0.00152 oder so daneben. Hat jemand eine Idee, wie man sowas üblicherweise macht? Beispiel-Code: Code: [AUSKLAPPEN] Graphics3D 800,600,0,2 camera=CreateCamera() PositionEntity camera, 0, 20, -30 ground=CreatePlane() EntityColor ground,40,40,40 c=CreateCube() ScaleEntity c,0.5,0.5,0.5 ziel=CreateCube() ScaleEntity ziel,0.5,0.5,0.5 EntityColor ziel,220,0,0 a# = 0.002 ; Beschleunigungs-Wert b# = 0.1 ; Brems-Wert v# = 0 ; Geschwindigkeit unseres Objekts c vMax# = 0.3 ; Maximalgeschwindigkeit MoveMouse 100,100 SetBuffer BackBuffer() While Not KeyHit(1) Or MouseHit(2); solange Esc nicht gedrückt wird durchführen PointEntity camera,c ;Ziel neu setzen If MouseHit(1)=1 Then PositionEntity c,0,0,0 PositionEntity ziel,Rand(-50,50),0,Rand(0,50) PointEntity c,ziel v=0 EndIf ;Geschwindigkeit und Bewegung ;Gesucht ist der Moment, ab dem ; v = v - b ;einsetzt, damit ich GENAU auf den Zielkoordinaten zum stehen komme. v = v + a ; aktuelle Geschwindigkeit berechnen If v > vMax Then v = vMax ; auf maximale Geschwindigkeit begrenzen MoveEntity c,0,0,v ; bewegen RenderWorld Text 10,10,"Linke Maustaste um Ziel neu zu setzen." Text 10,30,"Rechte Maustaste oder Esc zum Beenden." Text 10,70,"Geschwindigkeit v "+v Text 10,90,"Zielposition x/z "+EntityX(ziel)+" / "+EntityZ(ziel) Text 10,110,"Objektposition x/z "+EntityX(c)+" / "+EntityZ(c) Flip Wend End |
||
- Zuletzt bearbeitet von Kompensator am Fr, Dez 16, 2016 8:35, insgesamt einmal bearbeitet
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Kurvendiskussion! Endlich mal ein Fall, wofür man den Schwachsinn, der in der Schule mehr als ein Jahr in Mathematik kostet, auch tatsächlich verwenden kann.
Erst mal die Grundformeln: t ist die Zeit, die für das Bremsen benötigt wird, v0 ist die Ursprungsgeschwindigkeit, b ist die bremsende gleichförmige Beschleunigung (b>0). t = v0 / b Daraus ergibt sich ein Bremsweg von: s = -0.5 * b * t² + v0 * t Damit weißt du, dass du mit dem Bremsen anfangen musst, wenn du s weit weg bist vom Ziel. Geringe Abweichungen vom Ziel können aufgrund von Rundungsfehlern (Floats sind ja nicht unendlich genau) entstehen. Hier würde ich an deiner Stelle schummeln. Ist man nah genug am Ziel, dann ist man am Ziel. Du kannst z.B. einen Check machen, wenn du weniger als 0.002 vom Ziel entfernt bist und deine Geschwindigkeit kleiner als 0.0001 ist, dann werden deine Koordinaten auf die exakten Koordinaten des Ziels und deine Geschwindigkeit auf 0 gesetzt. |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
Kompensator |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke DAK, für deine schnelle Antwort und die gute Erklärung. Mit Kurvendiskussion hat das zwar eher weniger zu tun und zuerst war mir nicht klar, wo du die Streckenberechnungsformel her hattest, ich hab sie dann aber in meinem Buch "Spuken leicht gemacht für Jedermann" (Formelsammlung) tatsächlich gefunden. Von alleine wäre ich nie auf die Lösung gekommen.
Hier das Ergebnis: Code: [AUSKLAPPEN] Graphics3D 800,600,0,2 camera=CreateCamera() PositionEntity camera, 0, 70, 0 ground=CreatePlane() EntityColor ground,40,40,40 c=CreateCube() ScaleEntity c,0.5,0.5,0.5 ziel=CreateCube() ScaleEntity ziel,0.5,0.5,0.5 EntityColor ziel,220,0,0 PointEntity camera,ziel a# = 0.002 ; Beschleunigungs-Wert b# = 0.004 ; Brems-Wert v# = 0 ; Geschwindigkeit unseres Objekts c vMax# = 0.3 ; Maximalgeschwindigkeit MoveMouse 100,100 SetBuffer BackBuffer() While Not KeyHit(1) Or MouseHit(2); solange Esc nicht gedrückt wird durchführen ;c neu setzen If MouseHit(1)=1 Then PositionEntity c,Rand(-50,50),0,Rand(0,50) PointEntity c,ziel v=0 EndIf ; Geschwindigkeit berechnen t# = v / b s# = -0.5 * b * t*t + v * t d#=EntityDistance(c,ziel) If d<=s Then v=v-b Else v=v+a If v > vMax Then v = vMax ; auf maximale Geschwindigkeit begrenzen If d<v Then v=0 : PositionEntity c,EntityX(ziel),EntityY(ziel),EntityZ(ziel) MoveEntity c,0,0,v ; bewegen RenderWorld Text 10,10,"Linke Maustaste um Ziel neu zu setzen." Text 10,30,"Rechte Maustaste oder Esc zum Beenden." Text 10,70,"Geschwindigkeit v "+v Text 10,90,"Objektposition x/z "+EntityX(c)+" / "+EntityZ(c) Text 10,130,d Text 10,150,s Flip Wend End |
||
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja, nicht Kurvendiskussion selbst aber Analysis. Bei uns in der Schule ist das damals so Hand in Hand gegangen, dass sie für mich synonym sind, ob wohl sie es in echt wohl nicht sind.
Die Formeln kriegst du über Ableitung und Integration raus. |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group