HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
quatf.h
Go to the documentation of this file.
1 //
2 // Copyright 2016 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 // quat.template.h file to make changes.
10 
11 #ifndef PXR_BASE_GF_QUATF_H
12 #define PXR_BASE_GF_QUATF_H
13 
14 /// \file gf/quatf.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/vec3f.h"
21 #include "pxr/base/gf/traits.h"
22 #include "pxr/base/tf/hash.h"
23 
24 #include <iosfwd>
25 
27 
28 template <>
29 struct GfIsGfQuat<class GfQuatf> { static const bool value = true; };
30 
31 
32 /// Return the dot (inner) product of two quaternions.
33 float GfDot(const GfQuatf& q1, const GfQuatf& q2);
34 
35 
36 /// \class GfQuatf
37 /// \ingroup group_gf_LinearAlgebra
38 ///
39 /// Basic type: a quaternion, a complex number with a real coefficient and
40 /// three imaginary coefficients, stored as a 3-vector.
41 ///
42 class GfQuatf
43 {
44  public:
45  typedef float ScalarType;
47 
48  /// GfQuatf value-initializes to zero and performs no default
49  /// initialization, like float or double.
50  GfQuatf() = default;
51 
52  /// Initialize the real coefficient to \p realVal and the imaginary
53  /// coefficients to zero.
54  ///
55  /// Since quaternions typically must be normalized, reasonable values for
56  /// \p realVal are -1, 0, or 1. Other values are legal but are likely to
57  /// be meaningless.
58  ///
59  explicit GfQuatf (float realVal) : _imaginary(0), _real(realVal) {}
60 
61  /// Initialize the real and imaginary coefficients.
62  GfQuatf(float real, float i, float j, float k)
63  : _imaginary(i, j, k), _real(real)
64  {
65  }
66 
67  /// Initialize the real and imaginary coefficients.
68  GfQuatf(float real, const GfVec3f &imaginary)
69  : _imaginary(imaginary), _real(real)
70  {
71  }
72 
73  /// Construct from GfQuatd.
74  GF_API
75  explicit GfQuatf(class GfQuatd const &other);
76  /// Implicitly convert from GfQuath.
77  GF_API
78  GfQuatf(class GfQuath const &other);
79 
80  /// Return the zero quaternion, with real coefficient 0 and an
81  /// imaginary coefficients all zero.
82  static GfQuatf GetZero() { return GfQuatf(0.0); }
83 
84  /// Return the identity quaternion, with real coefficient 1 and an
85  /// imaginary coefficients all zero.
86  static GfQuatf GetIdentity() { return GfQuatf(1.0); }
87 
88  /// Return the real coefficient.
89  float GetReal() const { return _real; }
90 
91  /// Set the real coefficient.
92  void SetReal(float real) { _real = real; }
93 
94  /// Return the imaginary coefficient.
95  const GfVec3f &GetImaginary() const { return _imaginary; }
96 
97  /// Set the imaginary coefficients.
98  void SetImaginary(const GfVec3f &imaginary) {
99  _imaginary = imaginary;
100  }
101 
102  /// Set the imaginary coefficients.
103  void SetImaginary(float i, float j, float k) {
104  _imaginary.Set(i, j, k);
105  }
106 
107  /// Return geometric length of this quaternion.
108  float GetLength() const { return GfSqrt(_GetLengthSquared()); }
109 
110  /// length of this quaternion is smaller than \p eps, return the identity
111  /// quaternion.
112  GfQuatf
113  GetNormalized(float eps = GF_MIN_VECTOR_LENGTH) const {
114  GfQuatf ret(*this);
115  ret.Normalize(eps);
116  return ret;
117  }
118 
119  /// Normalizes this quaternion in place to unit length, returning the
120  /// length before normalization. If the length of this quaternion is
121  /// smaller than \p eps, this sets the quaternion to identity.
122  GF_API
123  float Normalize(float eps = GF_MIN_VECTOR_LENGTH);
124 
125  /// Return this quaternion's conjugate, which is the quaternion with the
126  /// same real coefficient and negated imaginary coefficients.
128  return GfQuatf(GetReal(), -GetImaginary());
129  }
130 
131  /// Return this quaternion's inverse, or reciprocal. This is the
132  /// quaternion's conjugate divided by it's squared length.
133  GfQuatf GetInverse() const {
134  return GetConjugate() / _GetLengthSquared();
135  }
136 
137  /// Transform the GfVec3f point. If the quaternion is normalized,
138  /// the transformation is a rotation. Given a GfQuatf q, q.Transform(point)
139  /// is equivalent to:
140  ///
141  /// (q * GfQuatf(0, point) * q.GetInverse()).GetImaginary()
142  ///
143  /// but is more efficient.
144  GF_API
145  GfVec3f Transform(const GfVec3f& point) const;
146 
147  /// Hash.
148  friend inline size_t hash_value(const GfQuatf &q) {
149  return TfHash::Combine(q.GetReal(), q.GetImaginary());
150  }
151 
152  /// Component-wise negation.
153  GfQuatf operator-() const {
154  return GfQuatf(-GetReal(), -GetImaginary());
155  }
156 
157  /// Component-wise quaternion equality test. The real and imaginary parts
158  /// must match exactly for quaternions to be considered equal.
159  bool operator==(const GfQuatf &q) const {
160  return (GetReal() == q.GetReal() &&
161  GetImaginary() == q.GetImaginary());
162  }
163 
164  /// Component-wise quaternion inequality test. The real and imaginary
165  /// parts must match exactly for quaternions to be considered equal.
166  bool operator!=(const GfQuatf &q) const {
167  return !(*this == q);
168  }
169 
170  /// Post-multiply quaternion \p q into this quaternion.
171  GF_API
172  GfQuatf &operator *=(const GfQuatf &q);
173 
174  /// Multiply this quaternion's coefficients by \p s.
176  _real *= s;
177  _imaginary *= s;
178  return *this;
179  }
180 
181  /// Divide this quaternion's coefficients by \p s.
183  _real /= s;
184  _imaginary /= s;
185  return *this;
186  }
187 
188  /// Add quaternion \p q to this quaternion.
190  _real += q._real;
191  _imaginary += q._imaginary;
192  return *this;
193  }
194 
195  /// Component-wise unary difference operator.
197  _real -= q._real;
198  _imaginary -= q._imaginary;
199  return *this;
200  }
201 
202  /// Component-wise binary sum operator.
203  friend GfQuatf
204  operator +(const GfQuatf &q1, const GfQuatf &q2) {
205  return GfQuatf(q1) += q2;
206  }
207 
208  /// Component-wise binary difference operator.
209  friend GfQuatf
210  operator -(const GfQuatf &q1, const GfQuatf &q2) {
211  return GfQuatf(q1) -= q2;
212  }
213 
214  /// Returns the product of quaternions \p q1 and \p q2.
215  friend GfQuatf
216  operator *(const GfQuatf &q1, const GfQuatf &q2) {
217  return GfQuatf(q1) *= q2;
218  }
219 
220  /// Returns the product of quaternion \p q and scalar \p s.
221  friend GfQuatf
222  operator *(const GfQuatf &q, float s) {
223  return GfQuatf(q) *= s;
224  }
225 
226  /// Returns the product of quaternion \p q and scalar \p s.
227  friend GfQuatf
228  operator *(float s, const GfQuatf &q) {
229  return GfQuatf(q) *= s;
230  }
231 
232  /// Returns the product of quaternion \p q and scalar 1 / \p s.
233  friend GfQuatf
234  operator /(const GfQuatf &q, float s) {
235  return GfQuatf(q) /= s;
236  }
237 
238  private:
239  /// Imaginary part
240  GfVec3f _imaginary;
241 
242  /// Real part
243  float _real;
244 
245  /// Returns the square of the length
246  float
247  _GetLengthSquared() const {
248  return GfDot(*this, *this);
249  }
250 };
251 
252 /// Spherically linearly interpolate between \p q0 and \p q1.
253 ///
254 /// If the interpolant \p alpha is zero, then the result is \p q0, while
255 /// \p alpha of one yields \p q1.
257 GfSlerp(double alpha, const GfQuatf& q0, const GfQuatf& q1);
258 
260 GfSlerp(const GfQuatf& q0, const GfQuatf& q1, double alpha);
261 
262 inline float
263 GfDot(GfQuatf const &q1, GfQuatf const &q2) {
264  return GfDot(q1.GetImaginary(), q2.GetImaginary()) +
265  q1.GetReal()*q2.GetReal();
266 }
267 
268 /// Output a GfQuatd using the format (re, i, j, k)
269 /// \ingroup group_gf_DebuggingOutput
270 GF_API std::ostream& operator<<(std::ostream &, GfQuatf const &);
271 
273 
274 #endif // PXR_BASE_GF_QUATF_H
Definition: quath.h:43
GfQuatf operator-() const
Component-wise negation.
Definition: quatf.h:153
static GfQuatf GetIdentity()
Definition: quatf.h:86
GfQuatf(float real, const GfVec3f &imaginary)
Initialize the real and imaginary coefficients.
Definition: quatf.h:68
float GetLength() const
Return geometric length of this quaternion.
Definition: quatf.h:108
double GfSqrt(double f)
Definition: math.h:187
*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
#define PXR_NAMESPACE_OPEN_SCOPE
Definition: pxr.h:73
GLsizei const GLfloat * value
Definition: glcorearb.h:824
Definition: vec3f.h:45
GLdouble s
Definition: glad.h:3009
GfQuatf(float realVal)
Definition: quatf.h:59
GLdouble GLdouble GLdouble q
Definition: glad.h:2445
GF_API GfQuatf GfSlerp(double alpha, const GfQuatf &q0, const GfQuatf &q1)
GF_API GfQuatf & operator*=(const GfQuatf &q)
Post-multiply quaternion q into this quaternion.
Definition: quatf.h:42
GfQuatf(float real, float i, float j, float k)
Initialize the real and imaginary coefficients.
Definition: quatf.h:62
float GetReal() const
Return the real coefficient.
Definition: quatf.h:89
friend GfQuatf operator*(const GfQuatf &q1, const GfQuatf &q2)
Returns the product of quaternions q1 and q2.
Definition: quatf.h:216
GfQuatf & operator/=(float s)
Divide this quaternion's coefficients by s.
Definition: quatf.h:182
GF_API std::ostream & operator<<(std::ostream &, GfQuatf const &)
bool operator!=(const GfQuatf &q) const
Definition: quatf.h:166
void SetImaginary(const GfVec3f &imaginary)
Set the imaginary coefficients.
Definition: quatf.h:98
GfQuatf()=default
void SetReal(float real)
Set the real coefficient.
Definition: quatf.h:92
GfVec3f & Set(float s0, float s1, float s2)
Set all elements with passed arguments.
Definition: vec3f.h:113
GLfloat GLfloat GLfloat alpha
Definition: glcorearb.h:112
float GfDot(const GfQuatf &q1, const GfQuatf &q2)
Return the dot (inner) product of two quaternions.
Definition: quatf.h:263
friend size_t hash_value(const GfQuatf &q)
Hash.
Definition: quatf.h:148
GfQuatf GetInverse() const
Definition: quatf.h:133
GF_API GfVec3f Transform(const GfVec3f &point) const
float ScalarType
Definition: quatf.h:45
GLint j
Definition: glad.h:2733
GfVec3f ImaginaryType
Definition: quatf.h:46
GfQuatf GetConjugate() const
Definition: quatf.h:127
static size_t Combine(Args &&...args)
Produce a hash code by combining the hash codes of several objects.
Definition: hash.h:487
#define PXR_NAMESPACE_CLOSE_SCOPE
Definition: pxr.h:74
friend GfQuatf operator+(const GfQuatf &q1, const GfQuatf &q2)
Component-wise binary sum operator.
Definition: quatf.h:204
bool operator==(const GfQuatf &q) const
Definition: quatf.h:159
GfQuatf & operator-=(const GfQuatf &q)
Component-wise unary difference operator.
Definition: quatf.h:196
GfQuatf GetNormalized(float eps=GF_MIN_VECTOR_LENGTH) const
Definition: quatf.h:113
Definition: quatd.h:42
void SetImaginary(float i, float j, float k)
Set the imaginary coefficients.
Definition: quatf.h:103
static GfQuatf GetZero()
Definition: quatf.h:82
const GfVec3f & GetImaginary() const
Return the imaginary coefficient.
Definition: quatf.h:95
GF_API float Normalize(float eps=GF_MIN_VECTOR_LENGTH)
friend GfQuatf operator/(const GfQuatf &q, float s)
Returns the product of quaternion q and scalar 1 / s.
Definition: quatf.h:234
GfQuatf & operator+=(const GfQuatf &q)
Add quaternion q to this quaternion.
Definition: quatf.h:189
#define GF_MIN_VECTOR_LENGTH
Definition: limits.h:17
#define GF_API
Definition: api.h:23