Moving an object is not smooth.. why?

Blitz3D Forums/Blitz3D Programming/Moving an object is not smooth.. why?

Hi there,

I have got a problem with Blitz3D. If you try the following small program:

Graphics3D 640,480
SetBuffer BackBuffer()
camera=CreateCamera()
cube=CreateCube()
While not KeyDown(1)
ms% = MilliSecs()
PositionEntity cube,0,0,5.0+Sin(0.01*Float(ms))
RenderWorld
Flip
Wend
End


You will see a cube waving on Z axis on a sinus move.

But the move is not smooth, it seems to move step by step.

I don't understand why.

Where is the error in my code? What did I do wrong?

It seems Blitz uses integer instead of float somewhere but I cannot understand where is my error..

thanks for any help

alain

It's because you are using Sin( EnormousAngle ). The bigger the angle the less accurate Sin( angle ).

In your case a change to Sin( ms Mod 360 ) is probably good enough.

In general you might want to record StartTime = Millisecs() near the start of you program. Then use ms = Millisecs() - StartTime. This will keep the values relatively small.

I think your problem is that millisecs are too fast... If your screen is updating 60htz that means that means your values are increasing by 16.66 each time (1000/60).

Try millisecs() / 100 and you might see a better result as it won't be skipping.

Dividing by 100 would probably help. But the underlying problem is still that the angle values are far too big.

That's why it ends up moving in steps. A very big floating point number can't change by a small amount. In this example the smallest possible change is 8:

Graphics3D 640, 480, 0, 1

BIG# = 123123000

For n# = 1 To 30
	Print Int( BIG + n )
Next

WaitKey


Thanks Floyd I understand well your theory: it is a good point, but it does not fix my problem.

Let's try the following program

Graphics3D 640,480,32,2
SetBuffer BackBuffer()
camera=CreateCamera()
cube=CreateCube()
start% = MilliSecs()
While Not KeyDown(1)
ms% = MilliSecs() - start
z# = 13.0+ms/10000.0
PositionEntity cube,0,0,z
RenderWorld
Text 0,0,"Z pos     :"+z
Text 0,15,"Entity pos:"+EntityZ(cube)
Flip
Wend
End


You can see the value of EntityZ on the screen: it is changing smoothly, but the cube on the screen is only moving once per second...

I think it is an optimization of Blitz3D engine, but it is a problem for me because sometimes I have very slow moves and it looks crap.

alain, you're doing an animation at the subpixel level. I can see that because of the antialiasing mode I use. The problem imho will always be there, as further you get away from the objects, since they move too slow.

Graphics3D 640,480
SetBuffer BackBuffer()
camera=CreateCamera()
cube=CreateCube()
a# = 0
While Not KeyDown(1)
   a = (a + 0.25) Mod 360
   PositionEntity cube,0,0,5.0+Sin(a)
   RenderWorld
   Flip
Wend
End


yep

that's just what I understood.

I feel a bit stupid.

anyway thanks for the help dudes :)

With your equation [z# = 13.0+ms/10000.0] I just realise :

floating values , I'm surprised it return a float...

(1/10) => Integer
Print(1/10.0) => float
Print(1.0/10) => float

I beleived the only way to get float was [a# * b = c#]
( So "a" should always be a float ... ) it seems it's (a# Or b#)