-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathslerp.cpp
30 lines (30 loc) · 828 Bytes
/
slerp.cpp
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
/**
*@author http://www.oschina.net/code/snippet_65674_781
*/
void CSlerp::slerp( float result[4], float starting[4], float ending[4], float t)
{
float cosa = starting[0]*ending[0] + starting[1]*ending[1] + starting[2]*ending[2] + starting[3]*ending[3];
if ( cosa < 0.0f ) {
ending[0] = -ending[0];
ending[1] = -ending[1];
ending[2] = -ending[2];
ending[3] = -ending[3];
cosa = -cosa;
}
float k0, k1;
if ( cosa > 0.9999f ) {
k0 = 1.0f - t;
k1 = t;
}
else {
float sina = sqrt( 1.0f - cosa*cosa );
float a = atan2( sina, cosa );
float invSina = 1.0f / sina;
k0 = sin((1.0f - t)*a) * invSina;
k1 = sin(t*a) * invSina;
}
result[0] = starting[0]*k0 + ending[0]*k1;
result[1] = starting[1]*k0 + ending[1]*k1;
result[2] = starting[2]*k0 + ending[2]*k1;
result[3] = starting[3]*k0 + ending[3]*k1;
}