Beschleunigte Bewegung auf exakte Zielkoordinaten - Problem

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Kompensator

Betreff: Beschleunigte Bewegung auf exakte Zielkoordinaten - Problem

BeitragDo, Dez 15, 2016 2:43
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Dez 15, 2016 11:23
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Dez 16, 2016 8:47
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Dez 19, 2016 12:33
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group