Auto fährt um die Kurve
Verfasst: 10.11.2007 19:42
Hi Leute,
ich hab mal nen Code geschrieben, der ein Auto realistisch um die Kurve fahren lässt. Also Drehpunkt ist die Hinterachse, man kann beliebig hart das Lenkrad einschlagen und das ganze bezieht auch die Länge des Fahrzeugs mit ein.
[edit]
So hier schon das erste Update:
Der Lenkeinschlag dreht langsam auf Null zurück
[/edit]
Gruß
Scarabol
ich hab mal nen Code geschrieben, der ein Auto realistisch um die Kurve fahren lässt. Also Drehpunkt ist die Hinterachse, man kann beliebig hart das Lenkrad einschlagen und das ganze bezieht auch die Länge des Fahrzeugs mit ein.
[edit]
So hier schon das erste Update:
Der Lenkeinschlag dreht langsam auf Null zurück
[/edit]
Code: Alles auswählen
InitSprite()
InitSprite3D()
InitKeyboard()
OpenScreen(1024, 768, 32, "test")
CreateSprite(1, 64, 64, #PB_Sprite_Texture)
StartDrawing(SpriteOutput(1))
Box(0, 16, 32, 32, RGB(192,192,192))
Box(32, 16, 32, 32, #Gray)
StopDrawing()
CreateSprite3D(1, 1)
; startposition Auto
carx.f = 200
cary.f = 200
; startwinkel Auto
cara.f = 0
; Geschwindigkeit
cars.f = 5
; radabstand
l = 32
; lenkeinschlag
alpha.f = 0*#PI/180
; gegenwinkel zu alpha
beta.f = 90*#PI/180-alpha
; winkel des Autos
angle.f = cara*#PI/180
; max Lenkausschlag
maxlenk.f = 25*#PI/180
Repeat
FlipBuffers()
ClearScreen(0)
ExamineKeyboard()
; Lenkung
If KeyboardPushed(#PB_Key_Left)
alpha - 0.05
ElseIf KeyboardPushed(#PB_Key_Right)
alpha + 0.05
EndIf
If alpha > maxlenk
alpha = maxlenk
ElseIf alpha < -maxlenk
alpha = -maxlenk
EndIf
; beta neu berechnen: beta=90-alpha
beta.f = 0.5*#PI-alpha
; Radius der Vorderachse
r1.f = l/Cos(beta)
; Radius der Hinterachse
r2.f = Tan(beta)*l
; Wendepunkt der Kurve bestimmen
mx.f = carx + Sin(angle)*r2
my.f = cary + Cos(angle)*r2
If KeyboardPushed(#PB_Key_Up)
; speed (cars) auf dem Bogen vorangehen
angle - cars/r1
If Abs(beta-#PI/2) > 0.01
; neue Position des Autos bestimmen
carx = mx - Sin(angle)*r2
cary = my - Cos(angle)*r2
Else
; neue Position des Autos bestimmen
carx + Cos(angle)*cars
cary - Sin(angle)*cars
EndIf
If alpha < 0
alpha + 0.02
If alpha > 0
alpha = 0
EndIf
ElseIf alpha > 0
alpha - 0.02
If alpha < 0
alpha = 0
EndIf
EndIf
EndIf
Start3D()
; Sprite drehen
RotateSprite3D(1, -angle*180/#PI, 0)
; Sprite auf der Hinterachse zentrieren
DisplaySprite3D(1, carx-32+Cos(angle)*16, cary-32-Sin(angle)*16)
Stop3D()
StartDrawing(ScreenOutput())
; Hinterachse anzeigen
Circle(carx, cary, 3, #Red)
; Drehpunkt anzeigen
Circle(mx, my, 3, #Green)
DrawingMode(4)
; Auto Richtung anzeigen
Line(carx, cary, Cos(angle)*l, -Sin(angle)*l, #Red)
; Radius Vorderachse
Circle(mx, my, l/Cos(beta), #Red)
; Radius Hinterachse
Circle(mx, my, Tan(beta)*l, #Blue)
; Lenkung anzeigen
Line(carx+Cos(angle)*l, cary-Sin(angle)*l, Cos(angle-alpha)*10, -Sin(angle-alpha)*10, #White)
Line(carx+Cos(angle)*l, cary-Sin(angle)*l, Cos(angle-alpha+#PI)*10, -Sin(angle-alpha+#PI)*10, #White)
DrawingMode(1)
FrontColor(#White)
DrawText(10, 10, "Lenkeinschlag: "+Str(alpha*180/#PI)+"°", #White)
DrawText(10, 30, "CarAngle: "+StrF(angle*180/#PI, 2)+"°", #White)
DrawText(10, 50, "r2: "+StrF(r2,2), #White)
StopDrawing()
Until KeyboardReleased(#PB_Key_Escape)
End
Scarabol