transformQuat function

List<double> transformQuat(
  1. List<double> out,
  2. List<double> a,
  3. List<double> q
)

Transforms the vec4 with a quat

@param {vec4} out the receiving vector @param {ReadonlyVec4} a the vector to transform @param {ReadonlyQuat} q quaternion to transform with @returns {vec4} out

Implementation

List<double> transformQuat(List<double> out, List<double> a, List<double> q) {
  final x = a[0], y = a[1], z = a[2];
  final qx = q[0], qy = q[1], qz = q[2], qw = q[3];

  // calculate quat * vec
  final ix = qw * x + qy * z - qz * y;
  final iy = qw * y + qz * x - qx * z;
  final iz = qw * z + qx * y - qy * x;
  final iw = -qx * x - qy * y - qz * z;

  // calculate result * inverse quat
  out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;
  out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;
  out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;
  out[3] = a[3];
  return out;
}