@@ -41,10 +41,19 @@ pub fn lerp(v1: f32, v2: f32, u: f32) -> f32 {
4141}
4242
4343#[ pyfunction]
44- pub fn lerp_vec ( v1 : ( f32 , f32 ) , v2 : ( f32 , f32 ) , u : f32 ) -> ( f32 , f32 ) {
44+ pub fn lerp_2d ( v1 : ( f32 , f32 ) , v2 : ( f32 , f32 ) , u : f32 ) -> ( f32 , f32 ) {
4545 ( lerp ( v1. 0 , v2. 0 , u) , lerp ( v1. 1 , v2. 1 , u) )
4646}
4747
48+ #[ pyfunction]
49+ pub fn lerp_3d ( v1 : ( f32 , f32 , f32 ) , v2 : ( f32 , f32 , f32 ) , u : f32 ) -> ( f32 , f32 , f32 ) {
50+ (
51+ lerp ( v1. 0 , v2. 0 , u) ,
52+ lerp ( v1. 1 , v2. 1 , u) ,
53+ lerp ( v1. 2 , v2. 2 , u) ,
54+ )
55+ }
56+
4857#[ pyfunction]
4958pub fn lerp_angle ( start_angle : f32 , end_angle : f32 , u : f32 ) -> f32 {
5059 let temp_start = start_angle % 360.0 ;
@@ -130,7 +139,7 @@ pub fn rand_on_line(pos1: (f32, f32), pos2: (f32, f32)) -> (f32, f32) {
130139 let mut rng = thread_rng ( ) ;
131140 let u: f32 = rng. gen_range ( 0.0 ..1.0 ) ;
132141
133- lerp_vec ( pos1, pos2, u)
142+ lerp_2d ( pos1, pos2, u)
134143}
135144
136145#[ pyfunction]
@@ -164,6 +173,29 @@ pub fn rand_vec_magnitude(angle: f32, lo_magnitude: f32, hi_magnitude: f32) -> (
164173 vel. as_tuple ( )
165174}
166175
176+ #[ pyfunction]
177+ pub fn quaternion_rotation (
178+ axis : ( f32 , f32 , f32 ) ,
179+ vector : ( f32 , f32 , f32 ) ,
180+ angle : f32 ,
181+ ) -> ( f32 , f32 , f32 ) {
182+ let angle_rads = -angle. to_radians ( ) ;
183+ let ( c2, s2) = ( f32:: cos ( angle_rads / 2.0 ) , f32:: sin ( angle_rads / 2.0 ) ) ;
184+
185+ let ( q0, q1, q2, q3) = ( c2, s2 * axis. 0 , s2 * axis. 1 , s2 * axis. 2 ) ;
186+ let ( q0_2, q1_2, q2_2, q3_2) = ( q0. powi ( 2 ) , q1. powi ( 2 ) , q2. powi ( 2 ) , q3. powi ( 2 ) ) ;
187+ let ( q01, q02, q03, q12, q13, q23) = ( q0 * q1, q0 * q2, q0 * q3, q1 * q2, q1 * q3, q2 * q3) ;
188+
189+ let x = vector. 0 * ( q0_2 + q1_2 - q2_2 - q3_2)
190+ + 2.0 * ( vector. 1 * ( q12 - q03) + vector. 2 * ( q02 + q13) ) ;
191+ let y = vector. 1 * ( q0_2 - q1_2 + q2_2 - q3_2)
192+ + 2.0 * ( vector. 0 * ( q03 + q12) + vector. 2 * ( q23 - q01) ) ;
193+ let z = vector. 2 * ( q0_2 - q1_2 - q2_2 + q3_2)
194+ + 2.0 * ( vector. 0 * ( q13 + q02) + vector. 1 * ( q01 + q23) ) ;
195+
196+ ( x, y, z)
197+ }
198+
167199// This is only a subset of _Vec2 methods defined in arcade.math.py
168200struct _Vec2 {
169201 x : f32 ,
@@ -262,14 +294,23 @@ mod tests {
262294 }
263295
264296 #[ test]
265- fn test_lerp_vec ( ) {
266- let mut result = lerp_vec ( ( 0.0 , 2.0 ) , ( 8.0 , 4.0 ) , 0.25 ) ;
297+ fn test_lerp_2d ( ) {
298+ let mut result = lerp_2d ( ( 0.0 , 2.0 ) , ( 8.0 , 4.0 ) , 0.25 ) ;
267299 assert_eq ! ( result, ( 2.0 , 2.5 ) ) ;
268300
269- result = lerp_vec ( ( 0.0 , 2.0 ) , ( 8.0 , 4.0 ) , -0.25 ) ;
301+ result = lerp_2d ( ( 0.0 , 2.0 ) , ( 8.0 , 4.0 ) , -0.25 ) ;
270302 assert_eq ! ( result, ( -2.0 , 1.5 ) ) ;
271303 }
272304
305+ #[ test]
306+ fn test_lerp_3d ( ) {
307+ let mut result = lerp_3d ( ( 0.0 , 2.0 , 4.0 ) , ( 8.0 , 4.0 , 8.0 ) , 0.25 ) ;
308+ assert_eq ! ( result, ( 2.0 , 2.5 , 5.0 ) ) ;
309+
310+ result = lerp_3d ( ( 0.0 , 2.0 , 4.0 ) , ( 8.0 , 4.0 , 8.0 ) , -0.25 ) ;
311+ assert_eq ! ( result, ( -2.0 , 1.5 , 3.0 ) ) ;
312+ }
313+
273314 #[ test]
274315 fn test_lerp_angle_normal ( ) {
275316 //normal
0 commit comments