12 #ifndef hifi_DualQuaternion
13 #define hifi_DualQuaternion
17 #include <glm/glm.hpp>
18 #include <glm/gtc/quaternion.hpp>
20 class DualQuaternion {
23 explicit DualQuaternion(
const glm::mat4& m);
24 DualQuaternion(
const glm::quat& real,
const glm::quat& imag);
25 DualQuaternion(
const glm::quat& rotation,
const glm::vec3& translation);
26 DualQuaternion(
const glm::vec4& real,
const glm::vec4& imag);
27 DualQuaternion operator*(
const DualQuaternion& rhs)
const;
28 DualQuaternion operator*(
float scalar)
const;
29 DualQuaternion operator+(
const DualQuaternion& rhs)
const;
31 const glm::quat& real()
const {
return _real; }
32 glm::quat& real() {
return _real; }
34 const glm::quat& dual()
const {
return _dual; }
35 glm::quat& dual() {
return _dual; }
37 glm::quat getRotation()
const;
38 glm::vec3 getTranslation()
const;
40 glm::vec3 xformPoint(
const glm::vec3& rhs)
const;
41 glm::vec3 xformVector(
const glm::vec3& rhs)
const;
43 DualQuaternion inverse()
const;
44 DualQuaternion conjugate()
const;
46 DualQuaternion normalize()
const;
47 float dot(
const DualQuaternion& rhs)
const;
48 DualQuaternion operator-()
const;
51 friend QDebug operator<<(QDebug debug,
const DualQuaternion& pose);
57 inline QDebug operator<<(QDebug debug,
const DualQuaternion& dq) {
58 debug <<
"DualQuaternion, real = (" << dq._real.x << dq._real.y << dq._real.z << dq._real.w <<
"), dual = (" << dq._dual.x << dq._dual.y << dq._dual.z << dq._dual.w <<
")";