QuaternionSlerp function

Quaternion QuaternionSlerp(
  1. Quaternion q1,
  2. Quaternion q2,
  3. double amount
)

Implementation

Quaternion QuaternionSlerp(Quaternion q1, Quaternion q2, double amount) {
  var cosHalf = q1.x * q2.x + q1.y * q2.y + q1.z * q2.z + q1.w * q2.w;
  var q2x = q2.x, q2y = q2.y, q2z = q2.z, q2w = q2.w;
  if (cosHalf < 0) {
    q2x = -q2x;
    q2y = -q2y;
    q2z = -q2z;
    q2w = -q2w;
    cosHalf = -cosHalf;
  }
  if (cosHalf >= 1.0) return q1.clone();
  final half = math.acos(cosHalf);
  final sinHalf = math.sqrt(1.0 - cosHalf * cosHalf);
  if (sinHalf.abs() < 0.001) {
    return Quaternion(
      q1.x * 0.5 + q2x * 0.5,
      q1.y * 0.5 + q2y * 0.5,
      q1.z * 0.5 + q2z * 0.5,
      q1.w * 0.5 + q2w * 0.5,
    );
  }
  final ra = math.sin((1 - amount) * half) / sinHalf;
  final rb = math.sin(amount * half) / sinHalf;
  return Quaternion(
    q1.x * ra + q2x * rb,
    q1.y * ra + q2y * rb,
    q1.z * ra + q2z * rb,
    q1.w * ra + q2w * rb,
  );
}