1
1
from math import sqrt , sin , acos , pi , cos , floor
2
+ from math import hypot
2
3
from panda3d .core import Vec4 , LVector3f
3
4
from ursina .vec2 import Vec2
4
5
from ursina .vec3 import Vec3
@@ -71,6 +72,10 @@ def inverselerp(a, b, value): # get *where* between a and b, value is (0.0 - 1
71
72
_test (lerp , (0 , 100 , .5 ), 50 )
72
73
73
74
75
+ def lerp_exponential_decay (a , b , decay_rate ): # frame-rate independent lerp for use in update. use this instead of lerp(a, b, time.dt) in update.
76
+ return lerp (a , b , 1 - pow (0.01 , decay_rate ))
77
+
78
+
74
79
def lerp_angle (start_angle , end_angle , t ):
75
80
start_angle = start_angle % 360
76
81
end_angle = end_angle % 360
@@ -82,12 +87,12 @@ def lerp_angle(start_angle, end_angle, t):
82
87
83
88
def slerp (q1 , q2 , t ):
84
89
costheta = q1 .dot (q2 )
85
-
90
+
86
91
# ensure shortest path by flipping q2 if dot product is negative
87
92
if costheta < 0.0 :
88
93
q2 = - q2
89
94
costheta = - costheta
90
-
95
+
91
96
costheta = clamp (costheta , - 1.0 , 1.0 ) # ensure valid range for acos
92
97
93
98
theta = acos (costheta )
@@ -103,6 +108,9 @@ def slerp(q1, q2, t):
103
108
return (q1 * r1 ) + (q2 * r2 )
104
109
105
110
111
+ def slerp_exponential_decay (q1 , q2 , decay_rate ): # frame-rate independent version of slerp for use in update.
112
+ return slerp (q1 , q2 , 1 - pow (0.01 , decay_rate ))
113
+
106
114
107
115
def clamp (value , floor , ceiling ):
108
116
return max (min (value , ceiling ), floor )
@@ -175,15 +183,15 @@ def make_gradient(index_value_dict):
175
183
176
184
if __name__ == '__main__' :
177
185
_test (make_gradient , ({'0' :color .hex ('#ff0000ff' ), '2' :color .hex ('#ffffffff' )}, ), expected_result = [
178
- color .hex ('#ff0000ff' ),
179
- lerp (color .hex ('#ff0000ff' ), color .hex ('#ffffffff' ), .5 ),
186
+ color .hex ('#ff0000ff' ),
187
+ lerp (color .hex ('#ff0000ff' ), color .hex ('#ffffffff' ), .5 ),
180
188
color .hex ('#ffffffff' ),
181
189
])
182
190
_test (make_gradient , ({'0' :color .hex ('#ff0000ff' ), '4' :color .hex ('#ffffffff' )}, ), expected_result = [
183
- color .hex ('#ff0000ff' ),
184
- lerp (color .hex ('#ff0000ff' ), color .hex ('#ffffffff' ), .25 ),
185
- lerp (color .hex ('#ff0000ff' ), color .hex ('#ffffffff' ), .5 ),
186
- lerp (color .hex ('#ff0000ff' ), color .hex ('#ffffffff' ), .75 ),
191
+ color .hex ('#ff0000ff' ),
192
+ lerp (color .hex ('#ff0000ff' ), color .hex ('#ffffffff' ), .25 ),
193
+ lerp (color .hex ('#ff0000ff' ), color .hex ('#ffffffff' ), .5 ),
194
+ lerp (color .hex ('#ff0000ff' ), color .hex ('#ffffffff' ), .75 ),
187
195
color .hex ('#ffffffff' ),
188
196
])
189
197
_test (make_gradient , ({'0' :16 , '2' :0 }, ), expected_result = [16 , 8 , 0 ])
@@ -222,10 +230,14 @@ def __init__(self, start, end, center, size):
222
230
223
231
if __name__ == '__main__' :
224
232
from ursina import *
233
+ from ursinastuff import _assert , _test
225
234
app = Ursina ()
226
235
e1 = Entity (position = (0 ,0 ,0 ))
227
236
e2 = Entity (position = (0 ,1 ,1 ))
228
- distance (e1 , e2 )
237
+ _test (distance , (e1 , e2 ), expected_result = 1.4142135623730951 )
238
+
239
+ _test (distance_2d , (Vec2 (0 ,0 ), Vec2 (1 ,1 )), expected_result = 1.4142135623730951 )
240
+
229
241
distance_xz (e1 , e2 .position )
230
242
231
243
between_color = lerp (color .lime , color .magenta , .5 )
0 commit comments