9zenkit::Quat
slerp(
const zenkit::Quat& x,
const zenkit::Quat& y,
float a) {
12 float cosTheta = x.x*y.x +x.y*y.y + x.z*y.z + x.w*y.w;
24 if(cosTheta > 1.f - std::numeric_limits<float>::epsilon()) {
26 return zenkit::Quat(
mix(x.w, z.w, a),
33 float angle = std::acos(cosTheta);
34 float kx = std::sin((1.f - a) * angle);
35 float kz = std::sin(a * angle);
36 float div = std::sin(angle);
37 return zenkit::Quat((x.w*kx + z.w*kz)/div,
38 (x.x*kx + z.x*kz)/div,
39 (x.y*kx + z.y*kz)/div,
40 (x.z*kx + z.z*kz)/div);
44zenkit::AnimationSample
mix(
const zenkit::AnimationSample& x,
const zenkit::AnimationSample& y,
float a) {
45 zenkit::AnimationSample r {};
47 r.rotation =
slerp(x.rotation,y.rotation,a);
48 r.position.x =
mix(x.position.x,y.position.x,a);
49 r.position.y =
mix(x.position.y,y.position.y,a);
50 r.position.z =
mix(x.position.z,y.position.z,a);
55static Tempest::Matrix4x4
mkMatrix(
float x,
float y,
float z,
float w,
56 float px,
float py,
float pz) {
59 m[0][0] = w * w + x * x - y * y - z * z;
60 m[0][1] = 2.0f * (x * y - w * z);
61 m[0][2] = 2.0f * (x * z + w * y);
62 m[1][0] = 2.0f * (x * y + w * z);
63 m[1][1] = w * w - x * x + y * y - z * z;
64 m[1][2] = 2.0f * (y * z - w * x);
65 m[2][0] = 2.0f * (x * z - w * y);
66 m[2][1] = 2.0f * (y * z + w * x);
67 m[2][2] = w * w - x * x - y * y + z * z;
73 return Tempest::Matrix4x4(
reinterpret_cast<float*
>(m));
76Tempest::Matrix4x4
mkMatrix(
const zenkit::AnimationSample& s) {
77 return mkMatrix(s.rotation.x,s.rotation.y,s.rotation.z,s.rotation.w,
78 s.position.x,s.position.y,s.position.z);
static Tempest::Matrix4x4 mkMatrix(float x, float y, float z, float w, float px, float py, float pz)