simple motion question

Blitz3D Forums/Blitz3D Beginners Area/simple motion question

tvtom(Posted 2004) [#1]
I'm trying to get my 3d object to ease to a stop and not stop suddenly when I release the key triggering it's movement. I don't have a clue how to do this. Can someone at least give me a hint?


-=Darkheart=-(Posted 2004) [#2]
Sounds like you want to be using a simple accleration/deceleration routine.

It's quite easy, set a max speed then when the acceleration key is pressed increase the speed by x increment when the key is not down reduce speed by y increment.

So accleration is:

speed=speed+x
if speed > maxspeed then speed=maxspeed


This will allow you object ot smoothly acclerate and decelerate.

Darkheart


Rob Farley(Posted 2004) [#3]
For a more complete example:

Graphics 640,480

SetBuffer BackBuffer()

; keyboard controls
Const KUp=200
Const KDown=208
Const KLeft=203
Const KRight=205

; position and speed
xs#=0
ys#=0
x#=320
y#=240

; acceleration and friction
accel#=.2
friction#=.99

Repeat
Cls

; accelerate in direction
If KeyDown(kup) Then ys=ys-accel
If KeyDown(kdown) Then ys=ys+accel
If KeyDown(kright) Then xs=xs+accel
If KeyDown(kleft) Then xs=xs-accel

; apply friction
xs=xs*friction
ys=ys*friction

; add resultant speed to x and y positions
x=x+xs
y=y+ys

; bounce off sides
If x>639 Then x=639:xs=-xs
If x<0 Then x=0:xs=-xs
If y>479 Then y=479:ys=-ys
If y<0 Then y=0:ys=-ys

Oval x-6,y-6,13,13,True

Flip
Until KeyHit(1)



tvtom(Posted 2004) [#4]
I got the first one to work but I really like the simplicity of Rob's code and it works really well on the 2d oval... but when I add the same code to my 3d object on the x and z I can't seem to get ahold of the settings. Here it is:

Graphics3D 800,600

SetBuffer BackBuffer()

camera=CreateCamera()
PositionEntity camera,0,20,20

light=CreateLight()
RotateEntity light,90,0,0

cube=CreateCube()
PositionEntity cube,0,0,7
ScaleEntity cube,.5,.5,.5

PointEntity camera,cube


; keyboard controls
Const KUp=200
Const KDown=208
Const KLeft=203
Const KRight=205

; position and speed
xs#=0
zs#=0

; acceleration and friction
accel#=.2
friction#=.99

While Not KeyHit(1)
Cls

; accelerate in direction
If KeyDown(kup) Then zs=zs-accel
If KeyDown(kdown) Then zs=zs+accel
If KeyDown(kright) Then xs=xs+accel
If KeyDown(kleft) Then xs=xs-accel


; apply friction
xs=xs*friction
zs=zs*friction

; add resultant speed to x and y positions
x=x+xs
z=z+zs

MoveEntity cube,x,0,z



UpdateWorld
RenderWorld



Text 0,20,"xs value:"+xs
Text 0,40,"accel value:"+accel

Flip


Wend
End


P.S. how do you make the sceen black with green text?


Jeppe Nielsen(Posted 2004) [#5]
How about this :)
; keyboard controls 
Const KUp=200 
Const KDown=208 
Const KLeft=203 
Const KRight=205 

Graphics3D 800,600,16,2

Global friction#=.98 
Global acc#=0.2
Global vx#,vy#,vz#

CreateLight

cube=CreateCube()

camera=CreateCamera()
PositionEntity camera,0,20,-20
PointEntity camera,cube

Repeat
	
	If KeyDown(KLeft) Then TurnEntity cube,0,2,0
	If KeyDown(KRight) Then TurnEntity cube,0,-2,0
	If KeyDown(KUp)
	
		TFormVector 0,0,acc,cube,0
		vx#=vx#+TFormedX()
		vy#=vy#+TFormedY()
		vz#=vz#+TFormedZ()
	
	EndIf
	
	vx#=vx#*friction
	vy#=vy#*friction
	vz#=vz#*friction
	
	TranslateEntity cube,vx,vy,vz
	
	RenderWorld
	
	;green text
	Color 0,255,0
	Text 400,10,"Green text",1
	
	Flip
	 
Until KeyDown(1)
End



xmlspy(Posted 2004) [#6]
.


xmlspy(Posted 2004) [#7]
.