Use ‘real’ physics for that.
-
ball have parameters
- acceleration
a(ax,ay,az)
[m/s^2]… this is sum of all forces driving ball divided by its mass - velocity
v(vx,vy,vz)
[m/s]… actual speed = integration of accelerationv += a * dt
- position
p(x,y,z)
[m]… actual position = integration of velocityp += v * dt
- radius
r
[m] - mass
m
[kg] dt
[s] … iteration step (update time)
init start
a,v
values to(0,0,0)
andp
to start position - acceleration
-
apply gravity, friction, collision
- gravity for example
g(gx=0,gy=-9.81,gz=0)
- friction
f2 = -(|v|^2)*c2 * (v/|v|)
… in gas - friction
f3 = -(|v|^3)*c3 * (v/|v|)
… in liquid
if position before and after cross collision border reflect velocity * collision coef <=1 by impact normal also you can reflect position if crossing border is not possible.
- gravity for example
-
put it all together in some timer / updating code with
dt
intervala =g+(f2+f3+(driving force))/m v+=a*dt p+=v*dt test_collisions() redraw()
-
for manual change of position
just set
p(x,y,z)
to new position and also can setv=(0,0,0)
to stop the ball