b3d - langsames abbremsen eines objekts?
Übersicht

alliswrongBetreff: b3d - langsames abbremsen eines objekts? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hey ho, wie realisiere ich ein langsames abbremsen eines objekts? habe es derzeit so:
Code: [AUSKLAPPEN] speed = 0.1 smoothspeed = 0.01 Function playerWASDcontrol(p.player) If p\movex < 0 Then p\movex = p\movex + p\smoothspeed If p\movex > 0 Then p\movex = p\movex - p\smoothspeed If KeyDown(KEY_D) Then p\moveX = + p\speed If KeyDown(KEY_A) Then p\moveX = - p\speed MoveEntity p\model, p\x + p\moveX, p\y, p\z End Function das problem hierbei: fliege ich nach rechts und lasse dann die taste los, erreicht p\movex niemals "0" sondern immer -0.000000999 und ich bleibe nicht stehen. wie mache ich also soetwas wie ein "ausrollen" oder "langsames abbremsen"? sitze schon seit paar stunden daran (neben nem anderen problem mit objektgrößen aber das ist erstmal nicht so schlimm). habe auch schon das forum durchsucht aber bislang nichts gefunden da ich kein passenden suchbegriff finde. danke euch |
||
Krischan |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Du solltest den Speedwert mit einem Wert von sagen wir mal 0.95 multiplizieren, das führt zu immer kleineren Werten und wenn die eine gewisse Grenze unterschritten haben (z.B. 0.01) dann setze den Wert auf 0. Geht auch beim Beschleunigen, dann halt mal 1.05 multiplizieren und nach oben hin begrenzen. Gibt auch komplexere Varianten mit z.B. "1.0/Exp(wert*faktor1^faktor2)" oder mit Log/Log10. Das hier reicht aber meist aus.
Den richtigen Wert musst Du experimentell herausfinden, wie es am besten aussieht. Hab mal schnell ein Codebeispiel mit graphischer Ausgabe gebastelt: Code: [AUSKLAPPEN] Graphics 400,300,32,2
speed#=2.0 factor#=0.95 While speed>0.01 speed=speed*factor Plot x,200-(speed*100) x=x+2 Wend WaitKey End |
||
Pitje Puck |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Für hübscheres langsam werden könntest du auch eine Sinus Interpolation nehmen.
Dafür müsstest du vielleicht deinen Code stark umbauen, dafür kriegst du aber echt schöne Bewegungen. Hier mal ein kleines Beispiel. Die Funktion MoveFast2Slow ist das was du willst, die anderen sind halt die anderen Möglichkeiten mit Cos statt Sin. Code: [AUSKLAPPEN] Local start_Zeit# , pos# Local start_pos#=50, end_pos#=650, dauer#=700 start_Zeit# = MilliSecs() While pos#<1 Cls pos# = (MilliSecs()-start_Zeit#) / dauer# Rect MoveFast2Slow(start_pos#, end_pos#, pos#), 50, 10, 10, 1 Flip Wend Function MoveStraight( start_pos#, end_pos#, pos#) Return (end_pos# - start_pos#)*pos# + start_pos# End Function Function MoveFast2Slow( start_pos#, end_pos#, pos#) Return Sin(90 * pos#) * (end_pos#-start_pos#) + start_pos# End Function Function MoveSlow2Fast( start_pos#, end_pos#, pos#) Return (1-Cos(90 * pos#)) * (end_pos#-start_pos#) + start_pos# End Function Function MoveSlow2Fast2Slow( start_pos#, end_pos#, pos#) Return (1-Cos(180 * pos#))/2 * (end_pos#-start_pos#) + start_pos# End Function Ersetzte in der Schleife die Move-Function durch eine andere um die verschiedenen Effekte zu sehen. (Original mit Erklärung ist irgendwo im GLBasic Forum.) |
||
![]() |
Angelo |
![]() Antworten mit Zitat ![]() |
---|---|---|
So würde es auch gehen.
Code: [AUSKLAPPEN] Graphics3D 640, 480
SetBuffer BackBuffer() camera = CreateCamera() light = CreateLight() RotateEntity light, 90, 0, 0 cube = CreateCube() RotateEntity cube, 20, 50, 50 PositionEntity cube, 0, 0, 100 speed#=0.01 stopspeed#=0.01 While Not KeyHit(1) beschleunigen=0 If KeyDown(205) Then espeed#=espeed#+speed# beschleunigen=1 richtung$="vor" If KeyDown(203) Then espeed#=espeed#-speed# beschleunigen=1 richtung$="zurück" If beschleunigen=0 And richtung$="vor" Then espeed#=espeed#-stopspeed# If beschleunigen=0 And richtung$="vor" And espeed#<0 Then espeed#=0 richtung$="" If beschleunigen=0 And richtung$="zurück" Then espeed#=espeed#+stopspeed# If beschleunigen=0 And richtung$="zurück" And espeed#>0 Then espeed#=0 richtung$="" TranslateEntity cube,espeed#,0,0 RenderWorld Text 0,0,"espeed#: " +espeed# Text 0,16,"richtung: " +richtung$ Flip Wend musst dir halt die richtige methode raussuchen.^^ |
||
Alles was ich sagen kann, können auch andere ^^ |
alliswrong |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
danke angelo, genau sowas habe ich gemeint. das reicht vollkommen für meine zwecke ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group