blob: 31aada4a0f2f555b0ad7e628cd2aa08beddd4f07 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
-- we want to find the location based on inital velocity and position, constant acceleration, and delta time
-- Each function should be called with a `PredictedComponent` as `self`.
-- In a normal simulation, velocity adds
-- acceleration * delta time
-- every tick, minus some friction:
-- coefficient * current velocity
-- i.e. velocity = (acceleration * delta) - (friction * velocity)
-- every tick
-- velocity[tick] = (acceleration * delta[tick]) - (friction * velocity[tick - 1])
-- velocity[4] = (acceleration * delta[4]) - (friction * velocity[3])
-- = (acceleration * delta[4]) - (friction * ((acceleration * delta[3]) - (friction * velocity[2])))
-- = (acceleration * delta[4]) - (friction * ((acceleration * delta[3]) - (friction * ((acceleration * delta[2]) - (friction * velocity[inital])))))
-- = (acceleration * delta[4]) - (friction * ((acceleration * delta[3]) - ((friction * acceleration * delta[2]) - (friction * friction * velocity[inital]))))
-- = (acceleration * delta[4]) - (friciton * ((acceleration * delta[3]) - (friction * acceleration * delta[2]) + (friction^2 * velocity[inital])))
-- = (acceleration * delta[4]) - ((friction * acceleration * delta[3]) - (friction * friction * acceleration * delta[2]) + (friction^3 * velocity[inital]))
-- = (acceleration * delta[4]) - (friction * acceleration * delta[3]) + (friction^2 * acceleration * delta[2]) - (friction^3 * velocity[inital])
-- as delta approaches 0 (high fidelity simulation), the middle components become e^(-friction * delta), and acceleration needs to be divided by friction
-- Position is a second layer on top
-- position[tick] = position[tick-1] + velocity[tick]
-- position[2] = position[inital] + velocity[2]
-- = position[inital] + (acceleration * delta[2]) - (friction * velocity[inital])
-- position[delta] = (delta * (acceleration / friction) ) - ((1 / friction) * (velocity[inital] - (acceleratin / friction)) * e^(-friction * delta) + position[inital]
friction = 0.3
{
acc:() =>
acc = vec3(unpack(@net.properties.acc))
movement_speed = 1/1000 -- @net.properties.move_speed?
freeze = 1 -- @net.properties.frozen?
newacc = acc * (movement_speed) * (freeze)
{newacc.x, newacc.y, newacc.z}
vel: () =>
acc = vec3(unpack(@properties.acc))
vel = vec3(unpack(@net.properties.vel))
now = am.eval_js("Date.now();")
--print("Net is ", @net.properties)
delta = (now - @net.properties.last_update) / 1000
newvel = (acc / friction) + ((vel - (acc / friction)) * math.exp(-friction * delta))
{newvel.x, newvel.y, newvel.z}
pos: () =>
now = am.eval_js("Date.now();")
delta = (now - @net.properties.last_update) / 1000
vel = vec3(unpack(@properties.vel))
pos = vec3(unpack(@properties.pos))
acc = vec3(unpack(@properties.acc))
friction_loss = acc / friction
-- when delta = 0 (up to date)
-- pos = (1/friction) * (velocity - friction_loss) * 1 + position
-- = 2 * (2 - 2) * 1 + position
-- = position
newpos = (friction_loss * delta) - ((1/friction) * (vel - friction_loss) * (math.exp(-friction * delta))) + pos
{newpos.x, newpos.y, newpos.z}
}
|