7#include <QtGui/qtguiglobal.h>
8#include <QtGui/qgenericmatrix.h>
9#include <QtGui/qvector3d.h>
10#include <QtGui/qvector4d.h>
15#ifndef QT_NO_QUATERNION
23 constexpr QQuaternion()
noexcept;
24 explicit QQuaternion(Qt::Initialization)
noexcept {}
25 constexpr QQuaternion(
float scalar,
float xpos,
float ypos,
float zpos)
noexcept;
27 constexpr QQuaternion(
float scalar,
const QVector3D &vector)
noexcept;
30 constexpr explicit QQuaternion(
const QVector4D &vector)
noexcept;
33 constexpr bool isNull()
const noexcept;
34 constexpr bool isIdentity()
const noexcept;
37 constexpr QVector3D vector()
const noexcept;
38 constexpr void setVector(
const QVector3D &vector)
noexcept;
40 constexpr void setVector(
float x,
float y,
float z)
noexcept;
42 constexpr float x()
const noexcept;
43 constexpr float y()
const noexcept;
44 constexpr float z()
const noexcept;
45 constexpr float scalar()
const noexcept;
47 constexpr void setX(
float x)
noexcept;
48 constexpr void setY(
float y)
noexcept;
49 constexpr void setZ(
float z)
noexcept;
50 constexpr void setScalar(
float scalar)
noexcept;
52 constexpr static float dotProduct(
const QQuaternion &q1,
const QQuaternion &q2)
noexcept;
56 QT7_ONLY(Q_GUI_EXPORT)
float length()
const;
57 QT7_ONLY(Q_GUI_EXPORT)
float lengthSquared()
const;
59 [[nodiscard]] QT7_ONLY(Q_GUI_EXPORT) QQuaternion normalized()
const;
60 QT7_ONLY(Q_GUI_EXPORT)
void normalize();
62 constexpr QQuaternion inverted()
const noexcept;
64 [[nodiscard]]
constexpr QQuaternion conjugated()
const noexcept;
66 QT7_ONLY(Q_GUI_EXPORT) QVector3D rotatedVector(
const QVector3D &vector)
const;
68 constexpr QQuaternion &operator+=(
const QQuaternion &quaternion)
noexcept;
69 constexpr QQuaternion &operator-=(
const QQuaternion &quaternion)
noexcept;
70 constexpr QQuaternion &operator*=(
float factor)
noexcept;
71 constexpr QQuaternion &operator*=(
const QQuaternion &quaternion)
noexcept;
72 constexpr QQuaternion &operator/=(
float divisor);
75QT_WARNING_DISABLE_FLOAT_COMPARE
76 friend constexpr bool operator==(
const QQuaternion &q1,
const QQuaternion &q2)
noexcept
78 return q1.wp == q2.wp && q1.xp == q2.xp && q1.yp == q2.yp && q1.zp == q2.zp;
80 friend constexpr bool operator!=(
const QQuaternion &q1,
const QQuaternion &q2)
noexcept
86 friend constexpr QQuaternion 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*(
float factor,
const QQuaternion &quaternion)
noexcept;
89 friend constexpr QQuaternion operator*(
const QQuaternion &quaternion,
float factor)
noexcept;
90 friend constexpr QQuaternion operator*(
const QQuaternion &q1,
const QQuaternion &q2)
noexcept;
91 friend constexpr QQuaternion operator-(
const QQuaternion &quaternion)
noexcept;
92 friend constexpr QQuaternion operator/(
const QQuaternion &quaternion,
float divisor);
94 friend constexpr bool qFuzzyCompare(
const QQuaternion &q1,
const QQuaternion &q2)
noexcept;
97 constexpr QVector4D toVector4D()
const noexcept;
100 QT7_ONLY(Q_GUI_EXPORT) operator QVariant()
const;
102#ifndef QT_NO_VECTOR3D
103 inline void getAxisAndAngle(QVector3D *axis,
float *angle)
const;
104 QT7_ONLY(Q_GUI_EXPORT)
static QQuaternion fromAxisAndAngle(
const QVector3D &axis,
float angle);
106 QT7_ONLY(Q_GUI_EXPORT)
void getAxisAndAngle(
float *x,
float *y,
float *z,
float *angle)
const;
107 QT7_ONLY(Q_GUI_EXPORT)
static QQuaternion fromAxisAndAngle(
float x,
float y,
float z,
110#ifndef QT_NO_VECTOR3D
111 inline QVector3D toEulerAngles()
const;
112 QT7_ONLY(Q_GUI_EXPORT)
static inline QQuaternion fromEulerAngles(
const QVector3D &eulerAngles);
114 QT7_ONLY(Q_GUI_EXPORT)
void getEulerAngles(
float *pitch,
float *yaw,
float *roll)
const;
115 QT7_ONLY(Q_GUI_EXPORT)
static QQuaternion fromEulerAngles(
float pitch,
float yaw,
float roll);
117 QT7_ONLY(Q_GUI_EXPORT) QMatrix3x3 toRotationMatrix()
const;
118 QT7_ONLY(Q_GUI_EXPORT)
static QQuaternion fromRotationMatrix(
const QMatrix3x3 &rot3x3);
120#ifndef QT_NO_VECTOR3D
121 QT7_ONLY(Q_GUI_EXPORT)
void getAxes(QVector3D *xAxis, QVector3D *yAxis, QVector3D *zAxis)
const;
122 QT7_ONLY(Q_GUI_EXPORT)
static QQuaternion fromAxes(
const QVector3D &xAxis,
123 const QVector3D &yAxis,
124 const QVector3D &zAxis);
126 QT7_ONLY(Q_GUI_EXPORT)
static QQuaternion fromDirection(
const QVector3D &direction,
127 const QVector3D &up);
129 QT7_ONLY(Q_GUI_EXPORT)
static QQuaternion rotationTo(
const QVector3D &from,
130 const QVector3D &to);
133 QT7_ONLY(Q_GUI_EXPORT)
static QQuaternion slerp(
const QQuaternion &q1,
const QQuaternion &q2,
135 QT7_ONLY(Q_GUI_EXPORT)
static QQuaternion nlerp(
const QQuaternion &q1,
const QQuaternion &q2,
139 float wp, xp, yp, zp;
144constexpr QQuaternion::QQuaternion()
noexcept : wp(1.0f), xp(0.0f), yp(0.0f), zp(0.0f) {}
146constexpr QQuaternion::QQuaternion(
float aScalar,
float xpos,
float ypos,
float zpos)
noexcept
147 : wp(aScalar), xp(xpos), yp(ypos), zp(zpos) {}
150QT_WARNING_DISABLE_FLOAT_COMPARE
152constexpr bool QQuaternion::isNull()
const noexcept
154 return wp == 0.0f && xp == 0.0f && yp == 0.0f && zp == 0.0f;
157constexpr bool QQuaternion::isIdentity()
const noexcept
159 return wp == 1.0f && xp == 0.0f && yp == 0.0f && zp == 0.0f;
163constexpr float QQuaternion::x()
const noexcept {
return xp; }
164constexpr float QQuaternion::y()
const noexcept {
return yp; }
165constexpr float QQuaternion::z()
const noexcept {
return zp; }
166constexpr float QQuaternion::scalar()
const noexcept {
return wp; }
168constexpr void QQuaternion::setX(
float aX)
noexcept { xp = aX; }
169constexpr void QQuaternion::setY(
float aY)
noexcept { yp = aY; }
170constexpr void QQuaternion::setZ(
float aZ)
noexcept { zp = aZ; }
171constexpr void QQuaternion::setScalar(
float aScalar)
noexcept { wp = aScalar; }
173constexpr float QQuaternion::dotProduct(
const QQuaternion &q1,
const QQuaternion &q2)
noexcept
175 return q1.wp * q2.wp + q1.xp * q2.xp + q1.yp * q2.yp + q1.zp * q2.zp;
178constexpr QQuaternion QQuaternion::inverted()
const noexcept
181 double len =
double(wp) *
double(wp) +
182 double(xp) *
double(xp) +
183 double(yp) *
double(yp) +
184 double(zp) *
double(zp);
185 if (!qFuzzyIsNull(len))
186 return QQuaternion(
float(
double(wp) / len),
float(
double(-xp) / len),
187 float(
double(-yp) / len),
float(
double(-zp) / len));
188 return QQuaternion(0.0f, 0.0f, 0.0f, 0.0f);
191constexpr QQuaternion QQuaternion::conjugated()
const noexcept
193 return QQuaternion(wp, -xp, -yp, -zp);
196constexpr QQuaternion &QQuaternion::operator+=(
const QQuaternion &quaternion)
noexcept
205constexpr QQuaternion &QQuaternion::operator-=(
const QQuaternion &quaternion)
noexcept
214constexpr QQuaternion &QQuaternion::operator*=(
float factor)
noexcept
225 float yy = (q1.wp - q1.yp) * (q2.wp + q2.zp);
226 float zz = (q1.wp + q1.yp) * (q2.wp - q2.zp);
227 float ww = (q1.zp + q1.xp) * (q2.xp + q2.yp);
228 float xx = ww + yy + zz;
229 float qq = 0.5f * (xx + (q1.zp - q1.xp) * (q2.xp - q2.yp));
231 float w = qq - ww + (q1.zp - q1.yp) * (q2.yp - q2.zp);
232 float x = qq - xx + (q1.xp + q1.wp) * (q2.xp + q2.wp);
233 float y = qq - yy + (q1.wp - q1.xp) * (q2.yp + q2.zp);
234 float z = qq - zz + (q1.zp + q1.yp) * (q2.wp - q2.xp);
236 return QQuaternion(w, x, y, z);
239constexpr QQuaternion &QQuaternion::operator*=(
const QQuaternion &quaternion)
noexcept
241 *
this = *
this * quaternion;
245constexpr QQuaternion &QQuaternion::operator/=(
float divisor)
256 return QQuaternion(q1.wp + q2.wp, q1.xp + q2.xp, q1.yp + q2.yp, q1.zp + q2.zp);
261 return QQuaternion(q1.wp - q2.wp, q1.xp - q2.xp, q1.yp - q2.yp, q1.zp - q2.zp);
266 return QQuaternion(quaternion.wp * factor, quaternion.xp * factor, quaternion.yp * factor, quaternion.zp * factor);
271 return QQuaternion(quaternion.wp * factor, quaternion.xp * factor, quaternion.yp * factor, quaternion.zp * factor);
276 return QQuaternion(-quaternion.wp, -quaternion.xp, -quaternion.yp, -quaternion.zp);
281 return QQuaternion(quaternion.wp / divisor, quaternion.xp / divisor, quaternion.yp / divisor, quaternion.zp / divisor);
284constexpr bool qFuzzyCompare(
const QQuaternion &q1,
const QQuaternion &q2)
noexcept
286 return qFuzzyCompare(q1.wp, q2.wp) &&
287 qFuzzyCompare(q1.xp, q2.xp) &&
288 qFuzzyCompare(q1.yp, q2.yp) &&
289 qFuzzyCompare(q1.zp, q2.zp);
292#ifndef QT_NO_VECTOR3D
294constexpr QQuaternion::QQuaternion(
float aScalar,
const QVector3D &aVector)
noexcept
295 : wp(aScalar), xp(aVector.x()), yp(aVector.y()), zp(aVector.z()) {}
297constexpr void QQuaternion::setVector(
const QVector3D &aVector)
noexcept
304constexpr QVector3D QQuaternion::vector()
const noexcept
306 return QVector3D(xp, yp, zp);
311 return quaternion.rotatedVector(vec);
314inline void QQuaternion::getAxisAndAngle(QVector3D *axis,
float *angle)
const
317 getAxisAndAngle(&aX, &aY, &aZ, angle);
318 *axis = QVector3D(aX, aY, aZ);
321inline QVector3D QQuaternion::toEulerAngles()
const
323 float pitch, yaw, roll;
324 getEulerAngles(&pitch, &yaw, &roll);
325 return QVector3D(pitch, yaw, roll);
328inline QQuaternion QQuaternion::fromEulerAngles(
const QVector3D &eulerAngles)
330 return QQuaternion::fromEulerAngles(eulerAngles.x(), eulerAngles.y(), eulerAngles.z());
335constexpr void QQuaternion::setVector(
float aX,
float aY,
float aZ)
noexcept
342#ifndef QT_NO_VECTOR4D
344constexpr QQuaternion::QQuaternion(
const QVector4D &aVector)
noexcept
345 : wp(aVector.w()), xp(aVector.x()), yp(aVector.y()), zp(aVector.z()) {}
347constexpr QVector4D QQuaternion::toVector4D()
const noexcept
349 return QVector4D(xp, yp, zp, wp);
354#ifndef QT_NO_DEBUG_STREAM
355Q_GUI_EXPORT
QDebug operator<<(QDebug dbg,
const QQuaternion &q);
358#ifndef QT_NO_DATASTREAM
359Q_GUI_EXPORT
QDataStream &operator<<(QDataStream &,
const QQuaternion &);
360Q_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.
static constexpr QVariantGuiHelper qVariantGuiHelper
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)
Q_DECLARE_TYPEINFO(QObjectPrivate::ConnectionList, Q_RELOCATABLE_TYPE)
QDebug Q_GUI_EXPORT & operator<<(QDebug &s, const QVectorPath &path)
constexpr bool qFuzzyCompare(const QQuaternion &q1, const QQuaternion &q2) noexcept
constexpr QQuaternion operator/(const QQuaternion &quaternion, float divisor)
Q_DECLARE_TYPEINFO(QTextLength, Q_PRIMITIVE_TYPE)
void operator()(QBrushData *d) const noexcept
bool convert(const void *from, int fromTypeId, void *to, int toTypeId) const override
const QtPrivate::QMetaTypeInterface * interfaceForType(int type) const override