-
-
Notifications
You must be signed in to change notification settings - Fork 124
/
CubicTweenUtils.lua
90 lines (80 loc) · 1.68 KB
/
CubicTweenUtils.lua
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
--[=[
Utility functions to do a cubic spline. Don't use this directly.
@class CubicTweenUtils
]=]
local CubicTweenUtils = {}
--[=[
Constants to be multiplied as p0*a0 + v0*a1 + p1*a2 + v1*a3
@param l number
@param t number
@return number -- a0
@return number -- a1
@return number -- a2
@return number -- a3
]=]
function CubicTweenUtils.getConstants(l, t)
local r = l - t
local a0 = r*r*(r + 3*t)/(l*l*l)
local a1 = r*r*t/(l*l)
local a2 = t*t*(t + 3*r)/(l*l*l)
local a3 = -t*t*r/(l*l)
return a0, a1, a2, a3
end
--[=[
@param l number
@param t number
@return number -- a0
@return number -- a1
@return number -- a2
@return number -- a3
]=]
function CubicTweenUtils.getDerivativeConstants(l, t)
local r = l - t
local b0 = -6*r*t/(l*l*l)
local b1 = r*(r - 2*t)/(l*l)
local b2 = 6*r*t/(l*l*l)
local b3 = t*(t - 2*r)/(l*l)
return b0, b1, b2, b3
end
--[=[
Applies the constants for the given nodes
@param c0 number
@param c1 number
@param c2 number
@param c3 number
@param a T
@param u T
@param b T
@param v T
@return T
]=]
function CubicTweenUtils.applyConstants(c0, c1, c2, c3, a, u, b, v)
return c0*a + c1*u + c2*b + c3*v
end
--[=[
Tweens betweeen nodes
@param a T
@param u T
@param b T
@param v T
@param l number
@param t number
@return T
]=]
function CubicTweenUtils.tween(a, u, b, v, l, t)
local a0, a1, a2, a3 = CubicTweenUtils.getConstants(l, t)
return a0*a + a1*u + a2*b + a3*v
end
--[=[
Computes acceleration
@param a T
@param u T
@param b T
@param v T
@param l number
@return T
]=]
function CubicTweenUtils.getAcceleration(a, u, b, v, l)
return (12*(b - a)*(b - a) - 12*l*(b - a)*(u + v) + 4*l*l*(u*u + u*v + v*v))/(l*l*l)
end
return CubicTweenUtils