17 #ifndef INCLUDED_IMATHQUAT_H
18 #define INCLUDED_IMATHQUAT_H
27 IMATH_INTERNAL_NAMESPACE_HEADER_ENTER
29 #if (defined _WIN32 || defined _WIN64) && defined _MSC_VER
31 # pragma warning(push)
32 # pragma warning(disable : 4244)
91 operator= (const
Quat<
T>&
q) IMATH_NOEXCEPT;
94 ~
Quat () IMATH_NOEXCEPT = default;
106 operator*= (const
Quat<
T>&
q) IMATH_NOEXCEPT;
111 operator*= (
T t) IMATH_NOEXCEPT;
115 operator/= (const
Quat<
T>&
q) IMATH_NOEXCEPT;
120 operator/= (
T t) IMATH_NOEXCEPT;
124 operator+= (const
Quat<
T>&
q) IMATH_NOEXCEPT;
128 operator-= (const
Quat<
T>&
q) IMATH_NOEXCEPT;
133 operator== (const
Quat<
S>&
q) const IMATH_NOEXCEPT;
138 operator!= (const
Quat<
S>&
q) const IMATH_NOEXCEPT;
188 rotateVector (const
Vec3<
T>& original) const IMATH_NOEXCEPT;
192 euclideanInnerProduct (const
Quat<
T>&
q) const IMATH_NOEXCEPT;
198 setAxisAngle (const
Vec3<
T>& axis,
T radians) IMATH_NOEXCEPT;
204 setRotation (const
Vec3<
T>& fromDirection, const
Vec3<
T>& toDirection)
247 Quat<
T>& qb) IMATH_NOEXCEPT;
257 template <
class T> std::ostream& operator<< (std::ostream& o, const
Quat<
T>& q);
261 operator* (const
Quat<
T>& q1, const
Quat<
T>& q2) IMATH_NOEXCEPT;
265 operator/ (const
Quat<
T>& q1, const
Quat<
T>& q2) IMATH_NOEXCEPT;
269 operator/ (const
Quat<
T>& q,
T t) IMATH_NOEXCEPT;
273 operator* (const
Quat<
T>& q,
T t) IMATH_NOEXCEPT;
277 operator* (
T t, const
Quat<
T>& q) IMATH_NOEXCEPT;
281 operator+ (const
Quat<
T>& q1, const
Quat<
T>& q2) IMATH_NOEXCEPT;
285 operator- (const
Quat<
T>& q1, const
Quat<
T>& q2) IMATH_NOEXCEPT;
295 operator* (const
Vec3<
T>&
v, const
Quat<
T>& q) IMATH_NOEXCEPT;
368 T rtmp =
r *
q.r - (
v ^
q.v);
369 v =
r *
q.v +
v *
q.r +
v %
q.v;
387 *
this = *
this *
q.inverse ();
437 return r ==
q.r &&
v ==
q.v;
445 return r !=
q.r ||
v !=
q.v;
453 return q1.r * q2.r + (q1.v ^ q2.v);
500 T qdot = *
this ^ *
this;
501 return Quat (
r / qdot, -
v / qdot);
508 T qdot = (*this) ^ (*this);
538 return r *
q.r +
v.x *
q.v.x +
v.y *
q.v.y +
v.z *
q.v.z;
554 return 2 * std::atan2 (lengthD, lengthS);
598 return slerp (q1, -q2,
t);
685 if (theta == 0)
return Quat<T> (0,
v);
687 T sintheta = std::sin (theta);
695 k = theta / sintheta;
710 T theta =
v.length ();
711 T sintheta = std::sin (theta);
714 if (
abs (theta) < 1 &&
718 k = sintheta / theta;
720 T costheta = std::cos (theta);
722 return Quat<T> (costheta,
v.x * k,
v.y * k,
v.z * k);
729 return 2 * std::atan2 (
v.length (),
r);
736 return v.normalized ();
744 v = axis.normalized () * std::sin (
radians / 2);
777 setRotationInternal (f0, t0, *
this);
791 setRotationInternal (f0, h0, *
this);
794 setRotationInternal (h0, t0, q);
810 if (f02.
x <= f02.
y && f02.
x <= f02.
z)
812 else if (f02.
y <= f02.
z)
813 v = (f0 %
Vec3<T> (0, 1, 0)).normalized ();
815 v = (f0 %
Vec3<T> (0, 0, 1)).normalized ();
859 1 - 2 * (
v.y *
v.y +
v.z *
v.z),
860 2 * (
v.x *
v.y +
v.z *
r),
861 2 * (
v.z *
v.x -
v.y *
r),
863 2 * (
v.x *
v.y -
v.z *
r),
864 1 - 2 * (
v.z *
v.z +
v.x *
v.x),
865 2 * (
v.y *
v.z +
v.x *
r),
867 2 * (
v.z *
v.x +
v.y *
r),
868 2 * (
v.y *
v.z -
v.x *
r),
869 1 - 2 * (
v.y *
v.y +
v.x *
v.x));
877 1 - 2 * (
v.y *
v.y +
v.z *
v.z),
878 2 * (
v.x *
v.y +
v.z *
r),
879 2 * (
v.z *
v.x -
v.y *
r),
881 2 * (
v.x *
v.y -
v.z *
r),
882 1 - 2 * (
v.z *
v.z +
v.x *
v.x),
883 2 * (
v.y *
v.z +
v.x *
r),
885 2 * (
v.z *
v.x +
v.y *
r),
886 2 * (
v.y *
v.z -
v.x *
r),
887 1 - 2 * (
v.y *
v.y +
v.x *
v.x),
901 return M *
q.toMatrix33 ();
910 return q.toMatrix33 () * M;
916 operator<< (std::ostream& o, const Quat<T>&
q)
918 return o <<
"(" <<
q.r <<
" " <<
q.v.x <<
" " <<
q.v.y <<
" " <<
q.v.z
928 q1.r * q2.r - (q1.v ^ q2.v), q1.r * q2.v + q1.v * q2.r + q1.v % q2.v);
936 return q1 * q2.inverse ();
970 return Quat<T> (q1.r + q2.r, q1.v + q2.v);
978 return Quat<T> (q1.r - q2.r, q1.v - q2.v);
1005 return v +
T (2) * (
q.r * a +
b);
1008 #if (defined _WIN32 || defined _WIN64) && defined _MSC_VER
1009 # pragma warning(pop)
1012 IMATH_INTERNAL_NAMESPACE_HEADER_EXIT
1014 #endif // INCLUDED_IMATHQUAT_H
IMATH_HOSTDEVICE constexpr T euclideanInnerProduct(const Quat< T > &q) const IMATH_NOEXCEPT
Return the Euclidean inner product.
IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Quat< T > & operator=(const Quat< T > &q) IMATH_NOEXCEPT
Assignment.
*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
IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Quat< T > & normalize() IMATH_NOEXCEPT
SIM_API const UT_StringHolder angle
IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Quat< T > & operator+=(const Quat< T > &q) IMATH_NOEXCEPT
Quaternion addition.
IMATH_HOSTDEVICE constexpr Quat< T > operator-(const Quat< T > &q1, const Quat< T > &q2) IMATH_NOEXCEPT
Quaterion subtraction.
vfloat4 sqrt(const vfloat4 &a)
GLboolean GLboolean GLboolean GLboolean a
IMATH_HOSTDEVICE Vec3< T > normalized() const IMATH_NOEXCEPT
Return a normalized vector. Does not modify *this.
GLuint GLsizei GLsizei * length
IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Quat< T > squad(const Quat< T > &q1, const Quat< T > &q2, const Quat< T > &qa, const Quat< T > &qb, T t) IMATH_NOEXCEPT
IMATH_HOSTDEVICE static constexpr Quat< T > identity() IMATH_NOEXCEPT
The identity quaternion.
Vec3< T > v
The imaginary vector.
ImageBuf OIIO_API min(Image_or_Const A, Image_or_Const B, ROI roi={}, int nthreads=0)
IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Quat< T > spline(const Quat< T > &q0, const Quat< T > &q1, const Quat< T > &q2, const Quat< T > &q3, T t) IMATH_NOEXCEPT
IMATH_HOSTDEVICE Quat< T > exp() const IMATH_NOEXCEPT
Return the exponent of the quaterion.
**But if you need a result
IMATH_HOSTDEVICE constexpr T operator^(const Quat< T > &q1, const Quat< T > &q2) IMATH_NOEXCEPT
4D dot product
IMATH_HOSTDEVICE constexpr T angle() const IMATH_NOEXCEPT
Return the angle of the axis/angle representation.
IMATH_HOSTDEVICE constexpr bool operator==(const Quat< S > &q) const IMATH_NOEXCEPT
Equality.
GLdouble GLdouble GLdouble q
IMATH_HOSTDEVICE IMATH_CONSTEXPR14 T angle4D(const Quat< T > &q1, const Quat< T > &q2) IMATH_NOEXCEPT
IMATH_HOSTDEVICE Quat< T > log() const IMATH_NOEXCEPT
Return the logarithm of the quaterion.
IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Quat< T > & operator/=(const Quat< T > &q) IMATH_NOEXCEPT
Quaterion division, using the inverse()
IMATH_HOSTDEVICE constexpr bool operator!=(const Quat< S > &q) const IMATH_NOEXCEPT
Inequality.
IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Quat< T > & operator-=(const Quat< T > &q) IMATH_NOEXCEPT
Quaternion subtraction.
IMATH_HOSTDEVICE constexpr T length() const IMATH_NOEXCEPT
Return the R4 length.
IMATH_HOSTDEVICE constexpr Quat() IMATH_NOEXCEPT
Default constructor is the identity quat.
IMATH_HOSTDEVICE constexpr Matrix44< T > toMatrix44() const IMATH_NOEXCEPT
Return a 4x4 rotation matrix.
IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Quat< T > & setRotation(const Vec3< T > &fromDirection, const Vec3< T > &toDirection) IMATH_NOEXCEPT
IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Quat< T > & invert() IMATH_NOEXCEPT
IMATH_HOSTDEVICE IMATH_CONSTEXPR14 T & operator[](int index) IMATH_NOEXCEPT
IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Quat< T > & setAxisAngle(const Vec3< T > &axis, T radians) IMATH_NOEXCEPT
GLint GLenum GLboolean normalized
GLboolean GLboolean GLboolean b
IMATH_HOSTDEVICE constexpr Quat< T > operator+(const Quat< T > &q1, const Quat< T > &q2) IMATH_NOEXCEPT
Quaterion addition.
IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Quat< T > slerp(const Quat< T > &q1, const Quat< T > &q2, T t) IMATH_NOEXCEPT
IMATH_HOSTDEVICE constexpr Quat< T > operator~(const Quat< T > &q) IMATH_NOEXCEPT
Compute the conjugate.
IMATH_HOSTDEVICE constexpr Matrix33< T > operator*(const Matrix33< T > &M, const Quat< T > &q) IMATH_NOEXCEPT
IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Quat< T > inverse() const IMATH_NOEXCEPT
Return 1/this, leaving this unchanged.
#define IMATH_EXPORT_TEMPLATE_TYPE
ImageBuf OIIO_API max(Image_or_Const A, Image_or_Const B, ROI roi={}, int nthreads=0)
IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Vec3< T > rotateVector(const Vec3< T > &original) const IMATH_NOEXCEPT
Rotate the given point by the quaterion.
IMATH_INTERNAL_NAMESPACE_HEADER_ENTER IMATH_HOSTDEVICE constexpr T abs(T a) IMATH_NOEXCEPT
IMATH_INTERNAL_NAMESPACE_HEADER_ENTER IMATH_HOSTDEVICE T sinx_over_x(T x)
IMATH_HOSTDEVICE constexpr Vec3< T > axis() const IMATH_NOEXCEPT
Return the axis of the axis/angle representation.
IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Quat< T > & operator*=(const Quat< T > &q) IMATH_NOEXCEPT
Quaternion multiplication.
IMATH_HOSTDEVICE void intermediate(const Quat< T > &q0, const Quat< T > &q1, const Quat< T > &q2, const Quat< T > &q3, Quat< T > &qa, Quat< T > &qb) IMATH_NOEXCEPT
IMATH_HOSTDEVICE constexpr Matrix33< T > toMatrix33() const IMATH_NOEXCEPT
Return a 3x3 rotation matrix.
OIIO_FORCEINLINE T log(const T &v)
IMATH_HOSTDEVICE constexpr Quat< T > operator/(const Quat< T > &q1, const Quat< T > &q2) IMATH_NOEXCEPT
Quaterion division.
OIIO_FORCEINLINE OIIO_HOSTDEVICE T radians(T deg)
Convert degrees to radians.
IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Quat< T > normalized() const IMATH_NOEXCEPT
Return a normalized quaternion, leaving this unmodified.
IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Quat< T > slerpShortestArc(const Quat< T > &q1, const Quat< T > &q2, T t) IMATH_NOEXCEPT