26 template <
class QUAT_TYPE>
inline
27 DualQuaternion<QUAT_TYPE>::DualQuaternion()
32 template <
class QUAT_TYPE>
inline
33 DualQuaternion<QUAT_TYPE>::DualQuaternion(
const DualQuaternion<QUAT_TYPE> &d)
39 template <
class QUAT_TYPE>
inline
40 DualQuaternion<QUAT_TYPE>::DualQuaternion(
const Quaternion<QUAT_TYPE> &q,
41 const Quaternion<QUAT_TYPE> &p)
47 template <
class QUAT_TYPE>
inline void
48 DualQuaternion<QUAT_TYPE>::Invert()
54 template <
class QUAT_TYPE>
inline DualQuaternion<QUAT_TYPE>
55 DualQuaternion<QUAT_TYPE>::Inverse()
const
57 DualQuaternion<QUAT_TYPE> res(*
this);
62 template <
class QUAT_TYPE>
inline void
63 DualQuaternion<QUAT_TYPE>::MakeUnique()
72 template <
class QUAT_TYPE>
inline void
73 DualQuaternion<QUAT_TYPE>::Normalize()
78 dual -= dual.ScalarProduct(real) * real;
81 template <
class QUAT_TYPE>
inline void
82 DualQuaternion<QUAT_TYPE>::GetDualNorm(QUAT_TYPE &r, QUAT_TYPE &d)
const
85 r = (QUAT_TYPE)real.NormL2();
87 d = (QUAT_TYPE)(real.ScalarProduct(dual) + dual.ScalarProduct(real));
90 template <
class QUAT_TYPE>
inline void
91 DualQuaternion<QUAT_TYPE>::Add(
const DualQuaternion<QUAT_TYPE>& r)
97 template <
class QUAT_TYPE>
inline void
98 DualQuaternion<QUAT_TYPE>::Add(
const DualQuaternion<QUAT_TYPE>& r,
99 DualQuaternion<QUAT_TYPE>& res)
const
105 template <
class QUAT_TYPE>
inline void
106 DualQuaternion<QUAT_TYPE>::Sub(
const DualQuaternion<QUAT_TYPE>& r)
112 template <
class QUAT_TYPE>
inline void
113 DualQuaternion<QUAT_TYPE>::Sub(
const DualQuaternion<QUAT_TYPE>& r,
114 DualQuaternion<QUAT_TYPE>& res)
const
120 template <
class QUAT_TYPE>
inline void
121 DualQuaternion<QUAT_TYPE>::Mult(
const QUAT_TYPE &scalar)
127 template <
class QUAT_TYPE>
inline void
128 DualQuaternion<QUAT_TYPE>::Mult(
const QUAT_TYPE &scalar,
129 DualQuaternion<QUAT_TYPE> &res)
const
135 template <
class QUAT_TYPE>
inline void
136 DualQuaternion<QUAT_TYPE>::Div(
const QUAT_TYPE &scalar)
142 template <
class QUAT_TYPE>
inline void
143 DualQuaternion<QUAT_TYPE>::Div(
const QUAT_TYPE &scalar,
144 DualQuaternion<QUAT_TYPE> &res)
const
152 template <
class QUAT_TYPE>
inline void
153 DualQuaternion<QUAT_TYPE>::Mult(
const DualQuaternion<QUAT_TYPE> &r)
155 dual = (real * r.dual) + (dual * r.real);
159 template <
class QUAT_TYPE>
inline void
160 DualQuaternion<QUAT_TYPE>::Mult(
const DualQuaternion<QUAT_TYPE> &r,
161 DualQuaternion<QUAT_TYPE> &res)
const
167 template <
class QUAT_TYPE>
inline void
168 DualQuaternion<QUAT_TYPE>::MultLeft(
const DualQuaternion<QUAT_TYPE> &l)
170 dual = (l.real * dual) + (l.dual * real);
171 real.MultLeft(l.real);
174 template <
class QUAT_TYPE>
inline void
175 DualQuaternion<QUAT_TYPE>::MultLeft(
const DualQuaternion<QUAT_TYPE> &l,
176 DualQuaternion<QUAT_TYPE> &res)
const
182 template <
class QUAT_TYPE>
inline void
183 DualQuaternion<QUAT_TYPE>::MultVec(
const Vector3<QUAT_TYPE> &vec,
184 Vector3<QUAT_TYPE> &res)
const
189 template <
class QUAT_TYPE>
inline Vector3<QUAT_TYPE>
190 DualQuaternion<QUAT_TYPE>::MultVec(
const Vector3<QUAT_TYPE> &vec)
const
192 Vector3<QUAT_TYPE> res;
199 template <
class QUAT_TYPE>
inline void
200 DualQuaternion<QUAT_TYPE>::SetIdentity()
206 template <
class QUAT_TYPE>
inline void
207 DualQuaternion<QUAT_TYPE>::Set(
const Quaternion<QUAT_TYPE> &q,
208 const Quaternion<QUAT_TYPE> &p)
214 template <
class QUAT_TYPE>
inline void
215 DualQuaternion<QUAT_TYPE>::SetRealPart(
const Quaternion<QUAT_TYPE> &q)
220 template <
class QUAT_TYPE>
inline void
221 DualQuaternion<QUAT_TYPE>::SetDualPart(
const Quaternion<QUAT_TYPE> &p)
226 template <
class QUAT_TYPE>
inline Quaternion<QUAT_TYPE>
227 DualQuaternion<QUAT_TYPE>::GetRealPart()
const
232 template <
class QUAT_TYPE>
inline Quaternion<QUAT_TYPE>
233 DualQuaternion<QUAT_TYPE>::GetDualPart()
const
238 template <
class QUAT_TYPE>
inline Vector<QUAT_TYPE>
239 DualQuaternion<QUAT_TYPE>::GetVector()
const
241 Vector<QUAT_TYPE> vec(8);
242 for (
register int i = 0; i < 4; i++) {
249 template <
class QUAT_TYPE>
inline void
250 DualQuaternion<QUAT_TYPE>::
251 GetRigidMotion(RMatrixBase &rotation,
252 Vector3<QUAT_TYPE> &translation)
const
254 Quaternion<QUAT_TYPE> quat;
255 GetRigidMotion(quat, translation);
256 rotation.SetFromQuaternion(Quaternion<ROTATION_MATRIX_TYPE>((ROTATION_MATRIX_TYPE)quat[0],
257 (ROTATION_MATRIX_TYPE)quat[1],
258 (ROTATION_MATRIX_TYPE)quat[2],
259 (ROTATION_MATRIX_TYPE)quat[3]));
262 template <
class QUAT_TYPE>
inline void
263 DualQuaternion<QUAT_TYPE>::
264 SetFromRigidMotion(
const RMatrixBase &rotation,
265 const Vector3<QUAT_TYPE> &translation)
267 Quaternion<ROTATION_MATRIX_TYPE> quat;
268 rotation.GetQuaternion(quat);
269 SetFromRigidMotion(Quaternion<QUAT_TYPE>((QUAT_TYPE)quat[0],
272 (QUAT_TYPE)quat[3]), translation);