8#include <QtGui/qtguiglobal.h>
9#include <QtGui/qgenericmatrix.h>
10#include <QtGui/qvector3d.h>
11#include <QtGui/qvector4d.h>
16#ifndef QT_NO_QUATERNION
24 constexpr QQuaternion()
noexcept;
25 explicit QQuaternion(Qt::Initialization)
noexcept {}
26 constexpr QQuaternion(
float scalar,
float xpos,
float ypos,
float zpos)
noexcept;
28 constexpr QQuaternion(
float scalar,
const QVector3D &vector)
noexcept;
31 constexpr explicit QQuaternion(
const QVector4D &vector)
noexcept;
34 constexpr bool isNull()
const noexcept;
35 constexpr bool isIdentity()
const noexcept;
38 constexpr QVector3D vector()
const noexcept;
39 constexpr void setVector(
const QVector3D &vector)
noexcept;
41 constexpr void setVector(
float x,
float y,
float z)
noexcept;
43 constexpr float x()
const noexcept;
44 constexpr float y()
const noexcept;
45 constexpr float z()
const noexcept;
46 constexpr float scalar()
const noexcept;
48 constexpr void setX(
float x)
noexcept;
49 constexpr void setY(
float y)
noexcept;
50 constexpr void setZ(
float z)
noexcept;
51 constexpr void setScalar(
float scalar)
noexcept;
53 constexpr static float dotProduct(
const QQuaternion &q1,
const QQuaternion &q2)
noexcept;
57 QT7_ONLY(Q_GUI_EXPORT)
float length()
const;
58 QT7_ONLY(Q_GUI_EXPORT)
float lengthSquared()
const;
60 [[nodiscard]] QT7_ONLY(Q_GUI_EXPORT) QQuaternion normalized()
const;
61 QT7_ONLY(Q_GUI_EXPORT)
void normalize();
63 constexpr QQuaternion inverted()
const noexcept;
65 [[nodiscard]]
constexpr QQuaternion conjugated()
const noexcept;
67 QT7_ONLY(Q_GUI_EXPORT) QVector3D rotatedVector(
const QVector3D &vector)
const;
69 constexpr QQuaternion &operator+=(
const QQuaternion &quaternion)
noexcept;
70 constexpr QQuaternion &operator-=(
const QQuaternion &quaternion)
noexcept;
71 constexpr QQuaternion &operator*=(
float factor)
noexcept;
72 constexpr QQuaternion &operator*=(
const QQuaternion &quaternion)
noexcept;
73 constexpr QQuaternion &operator/=(
float divisor);
76QT_WARNING_DISABLE_FLOAT_COMPARE
77 friend constexpr bool operator==(
const QQuaternion &q1,
const QQuaternion &q2)
noexcept
79 return q1.wp == q2.wp && q1.xp == q2.xp && q1.yp == q2.yp && q1.zp == q2.zp;
81 friend constexpr bool operator!=(
const QQuaternion &q1,
const QQuaternion &q2)
noexcept
87 friend constexpr QQuaternion operator+(
const QQuaternion &q1,
const QQuaternion &q2)
noexcept;
88 friend constexpr QQuaternion operator-(
const QQuaternion &q1,
const QQuaternion &q2)
noexcept;
89 friend constexpr QQuaternion operator*(
float factor,
const QQuaternion &quaternion)
noexcept;
90 friend constexpr QQuaternion operator*(
const QQuaternion &quaternion,
float factor)
noexcept;
91 friend constexpr QQuaternion operator*(
const QQuaternion &q1,
const QQuaternion &q2)
noexcept;
92 friend constexpr QQuaternion operator-(
const QQuaternion &quaternion)
noexcept;
93 friend constexpr QQuaternion operator/(
const QQuaternion &quaternion,
float divisor);
95 friend constexpr bool qFuzzyCompare(
const QQuaternion &q1,
const QQuaternion &q2)
noexcept;
98 constexpr QVector4D toVector4D()
const noexcept;
101 QT7_ONLY(Q_GUI_EXPORT) operator QVariant()
const;
106 friend constexpr bool comparesEqual(Axis lhs, Axis rhs)
noexcept
107 Q_DECL_EQ_DELETE_X(
"Deliberately not implemented. Don't implement it yourself!");
108 friend bool operator==(Axis, Axis)
109 Q_DECL_EQ_DELETE_X(
"Deliberately not implemented. Don't implement it yourself!");
110 friend bool operator!=(Axis, Axis)
111 Q_DECL_EQ_DELETE_X(
"Deliberately not implemented. Don't implement it yourself!");
112 friend size_t qHash(
const Axis &, size_t)
noexcept
113 Q_DECL_EQ_DELETE_X(
"Deliberately not implemented. Don't implement it yourself!");
114 friend size_t qHash(
const Axis &)
noexcept
115 Q_DECL_EQ_DELETE_X(
"Deliberately not implemented. Don't implement it yourself!");
116 friend bool qFuzzyIsNull(Axis axis)
noexcept
117 {
return qFuzzyIsNull(axis.x) && qFuzzyIsNull(axis.y) && qFuzzyIsNull(axis.z); }
118 friend bool qFuzzyCompare(Axis lhs, Axis rhs)
noexcept
119 Q_DECL_EQ_DELETE_X(
"Deliberately not implemented. Don't implement it yourself!");
120#ifndef QT_NO_VECTOR3D
121 static constexpr Axis fromVector3D(QVector3D v)
noexcept
122 {
return {v.x(), v.y(), v.z()}; }
123 constexpr QVector3D toVector3D()
const noexcept {
return {x, y, z}; }
124 friend constexpr bool comparesEqual(Axis lhs, QVector3D rhs)
noexcept
125 Q_DECL_EQ_DELETE_X(
"Deliberately not implemented. Don't implement it yourself!");
129#ifndef QT_NO_VECTOR3D
130 inline void getAxisAndAngle(QVector3D *axis,
float *angle)
const;
131 QT7_ONLY(Q_GUI_EXPORT)
static QQuaternion fromAxisAndAngle(
const QVector3D &axis,
float angle);
133 QT7_ONLY(Q_GUI_EXPORT)
void getAxisAndAngle(
float *x,
float *y,
float *z,
float *angle)
const;
134 QT7_ONLY(Q_GUI_EXPORT)
static QQuaternion fromAxisAndAngle(
float x,
float y,
float z,
137#ifndef QT_NO_VECTOR3D
138 inline QVector3D toEulerAngles()
const;
139# if !QT_CORE_REMOVED_SINCE(6
, 11
)
142 static QQuaternion fromEulerAngles(
const QVector3D &angles)
143 {
return fromEulerAngles(angles.x(), angles.y(), angles.z()); }
146 template <
typename T>
151 QT7_ONLY(Q_GUI_EXPORT) EulerAngles<
float> eulerAngles()
const;
152 static QQuaternion fromEulerAngles(EulerAngles<
float> angles)
153 {
return fromEulerAngles(angles.pitch, angles.yaw, angles.roll); }
155 QT_GUI_INLINE_SINCE(6, 11)
156 void getEulerAngles(
float *pitch,
float *yaw,
float *roll)
const;
157 static QQuaternion fromEulerAngles(
float pitch,
float yaw,
float roll);
159 QT7_ONLY(Q_GUI_EXPORT) QMatrix3x3 toRotationMatrix()
const;
160 QT7_ONLY(Q_GUI_EXPORT)
static QQuaternion fromRotationMatrix(
const QMatrix3x3 &rot3x3);
166 QT7_ONLY(Q_GUI_EXPORT) Axes toAxes()
const;
167 QT7_ONLY(Q_GUI_EXPORT)
static QQuaternion fromAxes(Axes axes);
168#ifndef QT_NO_VECTOR3D
169 QT_GUI_INLINE_SINCE(6, 11)
170 void getAxes(QVector3D *xAxis, QVector3D *yAxis, QVector3D *zAxis)
const;
171 QT_GUI_INLINE_SINCE(6, 11)
172 static QQuaternion fromAxes(
const QVector3D &xAxis,
173 const QVector3D &yAxis,
174 const QVector3D &zAxis);
176 QT7_ONLY(Q_GUI_EXPORT)
static QQuaternion fromDirection(
const QVector3D &direction,
177 const QVector3D &up);
179 QT7_ONLY(Q_GUI_EXPORT)
static QQuaternion rotationTo(
const QVector3D &from,
180 const QVector3D &to);
183 QT7_ONLY(Q_GUI_EXPORT)
static QQuaternion slerp(
const QQuaternion &q1,
const QQuaternion &q2,
185 QT7_ONLY(Q_GUI_EXPORT)
static QQuaternion fastSlerp(
const QQuaternion &q1,
186 const QQuaternion &q2,
float t);
187 QT7_ONLY(Q_GUI_EXPORT)
static QQuaternion nlerp(
const QQuaternion &q1,
const QQuaternion &q2,
191 float wp, xp, yp, zp;
196constexpr QQuaternion::QQuaternion()
noexcept : wp(1.0f), xp(0.0f), yp(0.0f), zp(0.0f) {}
198constexpr QQuaternion::QQuaternion(
float aScalar,
float xpos,
float ypos,
float zpos)
noexcept
199 : wp(aScalar), xp(xpos), yp(ypos), zp(zpos) {}
202QT_WARNING_DISABLE_FLOAT_COMPARE
204constexpr bool QQuaternion::isNull()
const noexcept
206 return wp == 0.0f && xp == 0.0f && yp == 0.0f && zp == 0.0f;
209constexpr bool QQuaternion::isIdentity()
const noexcept
211 return wp == 1.0f && xp == 0.0f && yp == 0.0f && zp == 0.0f;
215constexpr float QQuaternion::x()
const noexcept {
return xp; }
216constexpr float QQuaternion::y()
const noexcept {
return yp; }
217constexpr float QQuaternion::z()
const noexcept {
return zp; }
218constexpr float QQuaternion::scalar()
const noexcept {
return wp; }
220constexpr void QQuaternion::setX(
float aX)
noexcept { xp = aX; }
221constexpr void QQuaternion::setY(
float aY)
noexcept { yp = aY; }
222constexpr void QQuaternion::setZ(
float aZ)
noexcept { zp = aZ; }
223constexpr void QQuaternion::setScalar(
float aScalar)
noexcept { wp = aScalar; }
225constexpr float QQuaternion::dotProduct(
const QQuaternion &q1,
const QQuaternion &q2)
noexcept
227 return q1.wp * q2.wp + q1.xp * q2.xp + q1.yp * q2.yp + q1.zp * q2.zp;
230constexpr QQuaternion QQuaternion::inverted()
const noexcept
233 double len =
double(wp) *
double(wp) +
234 double(xp) *
double(xp) +
235 double(yp) *
double(yp) +
236 double(zp) *
double(zp);
237 if (!qFuzzyIsNull(len))
238 return QQuaternion(
float(
double(wp) / len),
float(
double(-xp) / len),
239 float(
double(-yp) / len),
float(
double(-zp) / len));
240 return QQuaternion(0.0f, 0.0f, 0.0f, 0.0f);
243constexpr QQuaternion QQuaternion::conjugated()
const noexcept
245 return QQuaternion(wp, -xp, -yp, -zp);
248constexpr QQuaternion &QQuaternion::operator+=(
const QQuaternion &quaternion)
noexcept
257constexpr QQuaternion &QQuaternion::operator-=(
const QQuaternion &quaternion)
noexcept
266constexpr QQuaternion &QQuaternion::operator*=(
float factor)
noexcept
275constexpr QQuaternion
operator*(
const QQuaternion &q1,
const QQuaternion &q2)
noexcept
277 float yy = (q1.wp - q1.yp) * (q2.wp + q2.zp);
278 float zz = (q1.wp + q1.yp) * (q2.wp - q2.zp);
279 float ww = (q1.zp + q1.xp) * (q2.xp + q2.yp);
280 float xx = ww + yy + zz;
281 float qq = 0.5f * (xx + (q1.zp - q1.xp) * (q2.xp - q2.yp));
283 float w = qq - ww + (q1.zp - q1.yp) * (q2.yp - q2.zp);
284 float x = qq - xx + (q1.xp + q1.wp) * (q2.xp + q2.wp);
285 float y = qq - yy + (q1.wp - q1.xp) * (q2.yp + q2.zp);
286 float z = qq - zz + (q1.zp + q1.yp) * (q2.wp - q2.xp);
288 return QQuaternion(w, x, y, z);
291constexpr QQuaternion &QQuaternion::operator*=(
const QQuaternion &quaternion)
noexcept
293 *
this = *
this * quaternion;
297constexpr QQuaternion &QQuaternion::operator/=(
float divisor)
306constexpr QQuaternion
operator+(
const QQuaternion &q1,
const QQuaternion &q2)
noexcept
308 return QQuaternion(q1.wp + q2.wp, q1.xp + q2.xp, q1.yp + q2.yp, q1.zp + q2.zp);
311constexpr QQuaternion
operator-(
const QQuaternion &q1,
const QQuaternion &q2)
noexcept
313 return QQuaternion(q1.wp - q2.wp, q1.xp - q2.xp, q1.yp - q2.yp, q1.zp - q2.zp);
316constexpr QQuaternion
operator*(
float factor,
const QQuaternion &quaternion)
noexcept
318 return QQuaternion(quaternion.wp * factor, quaternion.xp * factor, quaternion.yp * factor, quaternion.zp * factor);
321constexpr QQuaternion
operator*(
const QQuaternion &quaternion,
float factor)
noexcept
323 return QQuaternion(quaternion.wp * factor, quaternion.xp * factor, quaternion.yp * factor, quaternion.zp * factor);
326constexpr QQuaternion
operator-(
const QQuaternion &quaternion)
noexcept
328 return QQuaternion(-quaternion.wp, -quaternion.xp, -quaternion.yp, -quaternion.zp);
331constexpr QQuaternion
operator/(
const QQuaternion &quaternion,
float divisor)
333 return QQuaternion(quaternion.wp / divisor, quaternion.xp / divisor, quaternion.yp / divisor, quaternion.zp / divisor);
336constexpr bool qFuzzyCompare(
const QQuaternion &q1,
const QQuaternion &q2)
noexcept
338 return QtPrivate::fuzzyCompare(q1.wp, q2.wp)
339 && QtPrivate::fuzzyCompare(q1.xp, q2.xp)
340 && QtPrivate::fuzzyCompare(q1.yp, q2.yp)
341 && QtPrivate::fuzzyCompare(q1.zp, q2.zp);
344#if QT_GUI_INLINE_IMPL_SINCE(6
, 11
)
345void QQuaternion::getEulerAngles(
float *pitch,
float *yaw,
float *roll)
const
350 const auto angles = eulerAngles();
351 *pitch = angles.pitch;
357#ifndef QT_NO_VECTOR3D
359constexpr QQuaternion::QQuaternion(
float aScalar,
const QVector3D &aVector)
noexcept
360 : wp(aScalar), xp(aVector.x()), yp(aVector.y()), zp(aVector.z()) {}
362constexpr void QQuaternion::setVector(
const QVector3D &aVector)
noexcept
369constexpr QVector3D QQuaternion::vector()
const noexcept
371 return QVector3D(xp, yp, zp);
376 return quaternion.rotatedVector(vec);
379void QQuaternion::getAxisAndAngle(QVector3D *axis,
float *angle)
const
382 getAxisAndAngle(&aX, &aY, &aZ, angle);
383 *axis = QVector3D(aX, aY, aZ);
386QVector3D QQuaternion::toEulerAngles()
const
388 const auto angles = eulerAngles();
389 return QVector3D{angles.pitch, angles.yaw, angles.roll};
392#if QT_GUI_INLINE_IMPL_SINCE(6
, 11
)
393void QQuaternion::getAxes(QVector3D *xAxis, QVector3D *yAxis, QVector3D *zAxis)
const
398 const Axes axes = toAxes();
399 *xAxis = axes.x.toVector3D();
400 *yAxis = axes.y.toVector3D();
401 *zAxis = axes.z.toVector3D();
404QQuaternion QQuaternion::fromAxes(
const QVector3D &xAxis,
const QVector3D &yAxis,
const QVector3D &zAxis)
406 return fromAxes(Axes{Axis::fromVector3D(xAxis),
407 Axis::fromVector3D(yAxis),
408 Axis::fromVector3D(zAxis)});
414constexpr void QQuaternion::setVector(
float aX,
float aY,
float aZ)
noexcept
421#ifndef QT_NO_VECTOR4D
423constexpr QQuaternion::QQuaternion(
const QVector4D &aVector)
noexcept
424 : wp(aVector.w()), xp(aVector.x()), yp(aVector.y()), zp(aVector.z()) {}
426constexpr QVector4D QQuaternion::toVector4D()
const noexcept
428 return QVector4D(xp, yp, zp, wp);
433#ifndef QT_NO_DEBUG_STREAM
434Q_GUI_EXPORT
QDebug operator<<(QDebug dbg,
const QQuaternion &q);
437#ifndef QT_NO_DATASTREAM
438Q_GUI_EXPORT
QDataStream &operator<<(QDataStream &,
const QQuaternion &);
439Q_GUI_EXPORT
QDataStream &operator>>(QDataStream &, QQuaternion &);
\inmodule QtCore\reentrant
The QMatrix4x4 class represents a 4x4 transformation matrix in 3D space.
Combined button and popup list for selecting options.
QList< QGradientStop > QGradientStops
std::pair< qreal, QColor > QGradientStop
QByteArray operator+(const QByteArray &a1, const QByteArray &a2)
Q_CORE_EXPORT QDebug operator<<(QDebug debug, QDir::Filters filters)
void qRegisterGuiVariant()
QMatrix4x4 operator*(const QMatrix4x4 &m1, const QMatrix4x4 &m2)
QMatrix4x4 operator-(const QMatrix4x4 &matrix)
QMatrix4x4 operator*(const QMatrix4x4 &matrix, float factor)
QMatrix4x4 operator*(float factor, const QMatrix4x4 &matrix)
QMatrix4x4 operator-(const QMatrix4x4 &m1, const QMatrix4x4 &m2)
QDebug Q_GUI_EXPORT & operator<<(QDebug &s, const QVectorPath &path)
constexpr QQuaternion operator*(float factor, const QQuaternion &quaternion) noexcept
QVector3D operator*(const QQuaternion &quaternion, const QVector3D &vec)
constexpr QQuaternion operator-(const QQuaternion &q1, const QQuaternion &q2) noexcept
constexpr QQuaternion operator*(const QQuaternion &quaternion, float factor) noexcept
constexpr bool qFuzzyCompare(const QQuaternion &q1, const QQuaternion &q2) noexcept
constexpr QQuaternion operator/(const QQuaternion &quaternion, float divisor)
Q_DECLARE_TYPEINFO(QQuaternion, Q_PRIMITIVE_TYPE)
constexpr QQuaternion operator-(const QQuaternion &quaternion) noexcept
constexpr QQuaternion operator*(const QQuaternion &q1, const QQuaternion &q2) noexcept
constexpr QQuaternion operator+(const QQuaternion &q1, const QQuaternion &q2) noexcept
Q_DECLARE_TYPEINFO(QTextLength, Q_PRIMITIVE_TYPE)
void operator()(QBrushData *d) const noexcept
static const QtPrivate::QMetaTypeInterface * interfaceForType(int type)
static bool convert(const void *from, int fromTypeId, void *to, int toTypeId)