b3d - langsames abbremsen eines objekts?

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

alliswrong

Betreff: b3d - langsames abbremsen eines objekts?

BeitragMi, Jul 08, 2009 22:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jul 09, 2009 9:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jul 09, 2009 11:40
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jul 09, 2009 17:40
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jul 09, 2009 20:43
Antworten mit Zitat
Benutzer-Profile anzeigen
danke angelo, genau sowas habe ich gemeint. das reicht vollkommen für meine zwecke Smile

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group