/* ================ InterpolateStaticPState ================ */ staticPState_t InterpolateStaticPState( const staticInterpolatePState_t& previous, const staticInterpolatePState_t& next, float fraction ) { staticPState_t result; result.origin = Lerp( previous.origin, next.origin, fraction ); result.axis = idQuat().Slerp( previous.axis, next.axis, fraction ).ToMat3(); result.localOrigin = Lerp( previous.localOrigin, next.localOrigin, fraction ); result.localAxis = idQuat().Slerp( previous.localAxis, next.localAxis, fraction ).ToMat3(); return result; }
/* ============ idRotation::ToQuat ============ */ idQuat idRotation::ToQuat( void ) const { float a, s, c; a = angle * ( idMath::M_DEG2RAD * 0.5f ); idMath::SinCos( a, s, c ); return idQuat( vec.x * s, vec.y * s, vec.z * s, c ); }
/* ================= idAngles::ToQuat ================= */ idQuat idAngles::ToQuat( void ) const { float sx, cx, sy, cy, sz, cz; float sxcy, cxcy, sxsy, cxsy; idMath::SinCos( DEG2RAD( yaw ) * 0.5f, sz, cz ); idMath::SinCos( DEG2RAD( pitch ) * 0.5f, sy, cy ); idMath::SinCos( DEG2RAD( roll ) * 0.5f, sx, cx ); sxcy = sx * cy; cxcy = cx * cy; sxsy = sx * sy; cxsy = cx * sy; return idQuat( cxsy*sz - sxcy*cz, -cxsy*cz - sxcy*sz, sxsy*cz - cxcy*sz, cxcy*cz + sxsy*sz ); }
/* ===================== Slerp Spherical linear interpolation between two quaternions. ===================== */ idQuat Slerp( const idQuat& from, const idQuat& to, const float t ) { return idQuat().Slerp( from, to, t ); }