transformQuat function
Transforms the vec3 with a quat Can also be used for dual quaternions. (Multiply it with the real part)
@param {vec3} out the receiving vector @param {ReadonlyVec3} a the vector to transform @param {ReadonlyQuat} q quaternion to transform with @returns {vec3} out
Implementation
List<double> transformQuat(List<double> out, List<double> a, List<double> q) {
// benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed
final qx = q[0], qy = q[1], qz = q[2], qw = q[3];
final x = a[0], y = a[1], z = a[2];
// var qvec = [qx, qy, qz];
// var uv = vec3.cross([], qvec, a);
double uvx = qy * z - qz * y, uvy = qz * x - qx * z, uvz = qx * y - qy * x;
// var uuv = vec3.cross([], qvec, uv);
double uuvx = qy * uvz - qz * uvy, uuvy = qz * uvx - qx * uvz, uuvz = qx * uvy - qy * uvx;
// vec3.scale(uv, uv, 2 * w);
final w2 = qw * 2;
uvx *= w2;
uvy *= w2;
uvz *= w2;
// vec3.scale(uuv, uuv, 2);
uuvx *= 2;
uuvy *= 2;
uuvz *= 2;
// return vec3.add(out, a, vec3.add(out, uv, uuv));
out[0] = x + uvx + uuvx;
out[1] = y + uvy + uuvy;
out[2] = z + uvz + uuvz;
return out;
}