HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
dualQuatf.h
Go to the documentation of this file.
1 //
2 // Copyright 2021 Pixar
3 //
4 // Licensed under the terms set forth in the LICENSE.txt file available at
5 // https://openusd.org/license.
6 //
7 ////////////////////////////////////////////////////////////////////////
8 // This file is generated by a script. Do not edit directly. Edit the
9 // dualQuat.template.h file to make changes.
10 
11 #ifndef PXR_BASE_GF_DUALQUATF_H
12 #define PXR_BASE_GF_DUALQUATF_H
13 
14 /// \file gf/dualQuatf.h
15 /// \ingroup group_gf_LinearAlgebra
16 
17 #include "pxr/pxr.h"
18 #include "pxr/base/gf/api.h"
19 #include "pxr/base/gf/declare.h"
20 #include "pxr/base/gf/traits.h"
21 
22 #include "pxr/base/gf/quatf.h"
23 #include "pxr/base/tf/hash.h"
24 
25 #include <iosfwd>
26 
28 
29 template <>
30 struct GfIsGfDualQuat<class GfDualQuatf> { static const bool value = true; };
31 
32 /// Return the dot (inner) product of two dual quaternions.
33 float GfDot(const GfDualQuatf& dq1, const GfDualQuatf& dq2);
34 
35 
36 /// \class GfDualQuatf
37 /// \ingroup group_gf_LinearAlgebra
38 ///
39 /// Basic type: a real part quaternion and a dual part quaternion.
40 ///
41 /// This class represents a generalized dual quaternion that has a real part
42 /// and a dual part quaternions. Dual quaternions are used to represent a
43 /// combination of rotation and translation.
44 ///
45 /// References:
46 /// https://www.cs.utah.edu/~ladislav/kavan06dual/kavan06dual.pdf
47 /// https://faculty.sites.iastate.edu/jia/files/inline-files/dual-quaternion.pdf
48 ///
49 class GfDualQuatf final
50 {
51  public:
52  typedef float ScalarType;
53 
54  /// GfDualQuatf value-initializes to zero and performs no default
55  /// initialization, like float or double.
56  GfDualQuatf() = default;
57 
58  /// Initialize the real part to \p realVal and the imaginary part
59  /// to zero quaternion.
60  ///
61  /// Since quaternions typically must be normalized, reasonable values for
62  /// \p realVal are -1, 0, or 1. Other values are legal but are likely to
63  /// be meaningless.
64  ///
65  explicit GfDualQuatf( float realVal ) : _real( realVal ), _dual( 0 ) {}
66 
67  /// Initialize the real part to \p real quaternion and the imaginary part
68  /// to zero quaternion.
69  ///
70  explicit GfDualQuatf( const GfQuatf &real )
71  : _real( real ), _dual( 0 ) {
72  }
73 
74  /// This constructor initializes the real and dual parts.
75  GfDualQuatf( const GfQuatf &real, const GfQuatf &dual )
76  : _real( real ), _dual( dual ) {
77  }
78 
79  /// This constructor initializes from a rotation and a translation components.
80  GfDualQuatf( const GfQuatf &rotation, const GfVec3f &translation )
81  : _real( rotation ) {
82  SetTranslation( translation );
83  }
84 
85  /// Construct from GfDualQuatd.
86  GF_API
87  explicit GfDualQuatf(const GfDualQuatd &other);
88  /// Implicitly convert from GfDualQuath.
89  GF_API
90  GfDualQuatf(const GfDualQuath &other);
91 
92  /// Sets the real part of the dual quaternion.
93  void SetReal(const GfQuatf &real) {
94  _real = real;
95  }
96 
97  /// Sets the dual part of the dual quaternion.
98  void SetDual(const GfQuatf &dual) {
99  _dual = dual;
100  }
101 
102  /// Returns the real part of the dual quaternion.
103  const GfQuatf &GetReal() const {
104  return _real;
105  }
106 
107  /// Returns the dual part of the dual quaternion.
108  const GfQuatf &GetDual() const {
109  return _dual;
110  }
111 
112  /// Returns the zero dual quaternion, which has a real part of (0,0,0,0) and
113  /// a dual part of (0,0,0,0).
114  static GfDualQuatf GetZero() {
116  }
117 
118  /// Returns the identity dual quaternion, which has a real part of (1,0,0,0) and
119  /// a dual part of (0,0,0,0).
122  }
123 
124  /// Returns geometric length of this dual quaternion.
125  GF_API
126  std::pair<float, float> GetLength() const;
127 
128  /// Returns a normalized (unit-length) version of this dual quaternion.
129  /// If the length of this dual quaternion is smaller than \p
130  /// eps, this returns the identity dual quaternion.
131  GF_API
133 
134  /// Normalizes this dual quaternion in place.
135  /// Normalizes this dual quaternion in place to unit length, returning the
136  /// length before normalization. If the length of this dual quaternion is
137  /// smaller than \p eps, this sets the dual quaternion to identity.
138  GF_API
139  std::pair<float, float> Normalize(float eps = GF_MIN_VECTOR_LENGTH);
140 
141  /// Returns the conjugate of this dual quaternion.
142  GF_API
143  GfDualQuatf GetConjugate() const;
144 
145  /// Returns the inverse of this dual quaternion.
146  GF_API
147  GfDualQuatf GetInverse() const;
148 
149  /// Set the translation component of this dual quaternion.
150  GF_API
151  void SetTranslation( const GfVec3f &translation );
152 
153  /// Get the translation component of this dual quaternion.
154  GF_API
155  GfVec3f GetTranslation() const;
156 
157  /// Hash.
158  friend inline size_t hash_value(const GfDualQuatf &dq) {
159  return TfHash::Combine(dq.GetReal(), dq.GetDual());
160  }
161 
162  /// Component-wise dual quaternion equality test. The real and dual parts
163  /// must match exactly for dual quaternions to be considered equal.
164  bool operator ==(const GfDualQuatf &dq) const {
165  return (GetReal() == dq.GetReal() &&
166  GetDual() == dq.GetDual());
167  }
168 
169  /// Component-wise dual quaternion inequality test. The real and dual
170  /// parts must match exactly for dual quaternions to be considered equal.
171  bool operator !=(const GfDualQuatf &dq) const {
172  return ! (*this == dq);
173  }
174 
175  /// Component-wise unary sum operator.
177  _real += dq._real;
178  _dual += dq._dual;
179  return *this;
180  }
181 
182  /// Component-wise unary difference operator.
184  _real -= dq._real;
185  _dual -= dq._dual;
186  return *this;
187  }
188 
189  /// Post-multiplies dual quaternion \p dq into this dual quaternion.
190  GF_API
191  GfDualQuatf &operator *=(const GfDualQuatf &dq);
192 
193  /// Scales this dual quaternion by \p s.
195  _real *= s;
196  _dual *= s;
197  return *this;
198  }
199 
200  /// Scales this dual quaternion by 1 / \p s.
202  return (*this) *= 1.0 / s;
203  }
204 
205  /// Component-wise binary sum operator.
206  friend GfDualQuatf operator +(const GfDualQuatf &dq1,
207  const GfDualQuatf &dq2) {
208  GfDualQuatf dqt = dq1;
209  return dqt += dq2;
210  }
211 
212  /// Component-wise binary difference operator.
213  friend GfDualQuatf operator -(const GfDualQuatf &dq1,
214  const GfDualQuatf &dq2) {
215  GfDualQuatf dqt = dq1;
216  return dqt -= dq2;
217  }
218 
219  /// Returns the product of dual quaternions \p dq1 and \p dq2.
220  friend GfDualQuatf operator *(const GfDualQuatf &dq1,
221  const GfDualQuatf &dq2) {
222  GfDualQuatf dqt = dq1;
223  return dqt *= dq2;
224  }
225 
226  /// Returns the product of dual quaternion \p dq and scalar \p s.
227  friend GfDualQuatf operator *(const GfDualQuatf &dq, float s) {
228  GfDualQuatf dqt = dq;
229  return dqt *= s;
230  }
231 
232  /// Returns the product of dual quaternion \p dq and scalar \p s.
233  friend GfDualQuatf operator *(float s, const GfDualQuatf &dq) {
234  GfDualQuatf dqt = dq;
235  return dqt *= s;
236  }
237 
238  /// Returns the product of dual quaternion \p dq and scalar 1 / \p s.
239  friend GfDualQuatf operator /(const GfDualQuatf &dq, float s) {
240  GfDualQuatf dqt = dq;
241  return dqt /= s;
242  }
243 
244  /// Transforms the row vector \e vec by the dual quaternion.
245  GF_API
246  GfVec3f Transform(const GfVec3f &vec) const;
247 
248  private:
249  GfQuatf _real; // for rotation
250  GfQuatf _dual; // for translation
251 };
252 
253 
254 /// Output a GfDualQuatf using the format ((rw, rx, ry, rz), (dw, dx, dy, dz)).
255 /// \ingroup group_gf_DebuggingOutput
256 GF_API std::ostream &operator<<(std::ostream &out, const GfDualQuatf &dq);
257 
258 
259 /// Returns the dot (inner) product of two dual quaternions.
260 inline float
261 GfDot(const GfDualQuatf& dq1, const GfDualQuatf& dq2) {
262  return GfDot(dq1.GetReal(), dq2.GetReal()) + GfDot(dq1.GetDual(), dq2.GetDual());
263 }
264 
266 
267 #endif // PXR_BASE_GF_DUALQUATF_H
GfDualQuatf(float realVal)
Definition: dualQuatf.h:65
static GfDualQuatf GetIdentity()
Definition: dualQuatf.h:120
float GfDot(const GfDualQuatf &dq1, const GfDualQuatf &dq2)
Return the dot (inner) product of two dual quaternions.
Definition: dualQuatf.h:261
GF_API GfDualQuatf GetConjugate() const
Returns the conjugate of this dual quaternion.
GfDualQuatf()=default
static GfQuatf GetIdentity()
Definition: quatf.h:86
bool operator!=(const GfDualQuatf &dq) const
Definition: dualQuatf.h:171
*get result *(waiting if necessary)*A common idiom is to fire a bunch of sub tasks at the and then *wait for them to all complete We provide a helper class
Definition: thread.h:632
void SetDual(const GfQuatf &dual)
Sets the dual part of the dual quaternion.
Definition: dualQuatf.h:98
#define PXR_NAMESPACE_OPEN_SCOPE
Definition: pxr.h:73
friend size_t hash_value(const GfDualQuatf &dq)
Hash.
Definition: dualQuatf.h:158
GLsizei const GLfloat * value
Definition: glcorearb.h:824
GF_API std::pair< float, float > Normalize(float eps=GF_MIN_VECTOR_LENGTH)
static GfDualQuatf GetZero()
Definition: dualQuatf.h:114
Definition: vec3f.h:45
GLdouble s
Definition: glad.h:3009
GF_API GfDualQuatf GetNormalized(float eps=GF_MIN_VECTOR_LENGTH) const
const GfQuatf & GetDual() const
Returns the dual part of the dual quaternion.
Definition: dualQuatf.h:108
friend GfDualQuatf operator*(const GfDualQuatf &dq1, const GfDualQuatf &dq2)
Returns the product of dual quaternions dq1 and dq2.
Definition: dualQuatf.h:220
Definition: quatf.h:42
GF_API GfVec3f Transform(const GfVec3f &vec) const
Transforms the row vector vec by the dual quaternion.
GF_API std::pair< float, float > GetLength() const
Returns geometric length of this dual quaternion.
GfDualQuatf(const GfQuatf &real)
Definition: dualQuatf.h:70
SIM_API const UT_StringHolder rotation
GfDualQuatf & operator+=(const GfDualQuatf &dq)
Component-wise unary sum operator.
Definition: dualQuatf.h:176
float ScalarType
Definition: dualQuatf.h:52
friend GfDualQuatf operator-(const GfDualQuatf &dq1, const GfDualQuatf &dq2)
Component-wise binary difference operator.
Definition: dualQuatf.h:213
static size_t Combine(Args &&...args)
Produce a hash code by combining the hash codes of several objects.
Definition: hash.h:487
GF_API GfVec3f GetTranslation() const
Get the translation component of this dual quaternion.
GF_API void SetTranslation(const GfVec3f &translation)
Set the translation component of this dual quaternion.
GfDualQuatf & operator/=(float s)
Scales this dual quaternion by 1 / s.
Definition: dualQuatf.h:201
GF_API GfDualQuatf GetInverse() const
Returns the inverse of this dual quaternion.
void SetReal(const GfQuatf &real)
Sets the real part of the dual quaternion.
Definition: dualQuatf.h:93
#define PXR_NAMESPACE_CLOSE_SCOPE
Definition: pxr.h:74
bool operator==(const GfDualQuatf &dq) const
Definition: dualQuatf.h:164
GF_API std::ostream & operator<<(std::ostream &out, const GfDualQuatf &dq)
const GfQuatf & GetReal() const
Returns the real part of the dual quaternion.
Definition: dualQuatf.h:103
GF_API GfDualQuatf & operator*=(const GfDualQuatf &dq)
Post-multiplies dual quaternion dq into this dual quaternion.
GfDualQuatf(const GfQuatf &rotation, const GfVec3f &translation)
This constructor initializes from a rotation and a translation components.
Definition: dualQuatf.h:80
GfDualQuatf(const GfQuatf &real, const GfQuatf &dual)
This constructor initializes the real and dual parts.
Definition: dualQuatf.h:75
static GfQuatf GetZero()
Definition: quatf.h:82
friend GfDualQuatf operator+(const GfDualQuatf &dq1, const GfDualQuatf &dq2)
Component-wise binary sum operator.
Definition: dualQuatf.h:206
friend GfDualQuatf operator/(const GfDualQuatf &dq, float s)
Returns the product of dual quaternion dq and scalar 1 / s.
Definition: dualQuatf.h:239
GfDualQuatf & operator-=(const GfDualQuatf &dq)
Component-wise unary difference operator.
Definition: dualQuatf.h:183
#define GF_MIN_VECTOR_LENGTH
Definition: limits.h:17
#define GF_API
Definition: api.h:23