41QuaternionProduct(
const Quat<T> &z,
const Quat<T> &w, Quat<T> &zw)
47 assert_quat_length_1(z);
48 assert_quat_length_1(w);
52 zw.w = z.w * w.w - z.x * w.x - z.y * w.y - z.z * w.z;
53 zw.x = z.w * w.x + z.x * w.w + z.y * w.z - z.z * w.y;
54 zw.y = z.w * w.y - z.x * w.z + z.y * w.w + z.z * w.x;
55 zw.z = z.w * w.z + z.x * w.y - z.y * w.x + z.z * w.w;
62UnitQuaternionRotatePoint(
const Quat<T> &q,
const Vec3<T> &pt, Vec3<T> &result)
65 T uv0 = q.y * pt.z - q.z * pt.y;
66 T uv1 = q.z * pt.x - q.x * pt.z;
67 T uv2 = q.x * pt.y - q.y * pt.x;
71 result.x = pt.x + q.w * uv0;
72 result.y = pt.y + q.w * uv1;
73 result.z = pt.z + q.w * uv2;
74 result.x += q.y * uv2 - q.z * uv1;
75 result.y += q.z * uv0 - q.x * uv2;
76 result.z += q.x * uv1 - q.y * uv0;
82UnitQuaternionRotateAndScalePoint(
const Quat<T> &q,
const Vec3<T> &pt,
const T scale, Vec3<T> &result)
84 T uv0 = q.y * pt.z - q.z * pt.y;
85 T uv1 = q.z * pt.x - q.x * pt.z;
86 T uv2 = q.x * pt.y - q.y * pt.x;
90 result.x = pt.x + q.w * uv0;
91 result.y = pt.y + q.w * uv1;
92 result.z = pt.z + q.w * uv2;
93 result.x += q.y * uv2 - q.z * uv1;
94 result.y += q.z * uv0 - q.x * uv2;
95 result.z += q.x * uv1 - q.y * uv0;
105AngleAxisToQuaternion(
const Vec3<T> angle_axis, Quat<T> &result)
107 const T &a0 = angle_axis.x;
108 const T &a1 = angle_axis.y;
109 const T &a2 = angle_axis.z;
110 const T theta_squared = a0 * a0 + a1 * a1 + a2 * a2;
113 if (likely(theta_squared > T(0.0))) {
114 const T theta = sqrt(theta_squared);
115 const T half_theta = theta * T(0.5);
116 const T k = sin(half_theta) / theta;
117 result.w = cos(half_theta);