Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qquick3dquaternionutils.cpp
Go to the documentation of this file.
1// Copyright (C) 2020 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5
7#include <QtQuick3DUtils/private/qssgutils_p.h>
8#include <QtMath>
9
11
12/*!
13 \qmltype Quaternion
14 \inqmlmodule QtQuick3D
15 \since 5.15
16
17 \brief Provides utility functions for quaternion.
18
19 The \c Quaternion is a global object with utility functions.
20
21 It is not instantiable; to use it, call the members of the global \c Quaternion object
22 directly. For example:
23
24 \qml
25 Node {
26 rotation: Quaternion.fromAxisAndAngle(Qt.vector3d(1, 0, 0), 45)
27 }
28 \endqml
29*/
30
31/*!
32 \qmlmethod quaternion QtQuick3D::Quaternion::fromAxisAndAngle(vector3d axis, real angle)
33 Creates a quaternion from \a axis and \a angle.
34 Returns the resulting quaternion.
35 */
36
37/*!
38 \qmlmethod quaternion QtQuick3D::Quaternion::fromAxisAndAngle(real x, real y, real z, real angle)
39 Creates a quaternion from \a x, \a y, \a z, and \a angle.
40 Returns the resulting quaternion.
41 */
42
43/*!
44 \qmlmethod quaternion QtQuick3D::Quaternion::fromAxesAndAngles(vector3d axis1, real angle1,
45 vector3d axis2, real angle2)
46 Creates a quaternion from \a axis1, \a angle1, \a axis2, and \a angle2.
47 Returns the resulting quaternion.
48 */
49
50/*!
51 \qmlmethod quaternion QtQuick3D::Quaternion::fromAxesAndAngles(vector3d axis1, real angle1,
52 vector3d axis2, real angle2,
53 vector3d axis3, real angle3)
54 Creates a quaternion from \a axis1, \a angle1, \a axis2, \a angle2, \a axis3, and \a angle3.
55 Returns the resulting quaternion.
56 */
57
58/*!
59 \qmlmethod quaternion QtQuick3D::Quaternion::fromEulerAngles(vector3d eulerAngles)
60 Creates a quaternion from \a eulerAngles.
61 Returns the resulting quaternion.
62 */
63
64/*!
65 \qmlmethod quaternion QtQuick3D::Quaternion::fromEulerAngles(real x, real y, real z)
66 Creates a quaternion from \a x, \a y, and \a z.
67 Returns the resulting quaternion.
68 */
69
70/*!
71 \qmlmethod quaternion QtQuick3D::Quaternion::lookAt(vector3d sourcePosition, vector3d targetPosition,
72 vector3d forwardDirection, vector3d upDirection)
73 Creates a quaternion from \a sourcePosition, \a targetPosition, \a forwardDirection, and
74 \a upDirection. This is used for getting a rotation value for pointing at a particular target,
75 and can be used to point a camera at a position in a scene.
76
77 \a forwardDirection defaults to \c Qt.vector3d(0, 0, -1)
78 \a upDirection defaults to \c Qt.vector3d(0, 1, 0)
79
80 Returns the resulting quaternion.
81 */
82
83QQuick3DQuaternionUtils::QQuick3DQuaternionUtils(QObject *parent) : QObject(parent)
84{
85
86}
87
88QQuaternion QQuick3DQuaternionUtils::fromAxisAndAngle(float x, float y, float z, float angle)
89{
90 return QQuaternion::fromAxisAndAngle(x, y, z, angle);
91}
92
93QQuaternion QQuick3DQuaternionUtils::fromAxisAndAngle(const QVector3D &axis, float angle)
94{
95 return QQuaternion::fromAxisAndAngle(axis, angle);
96}
97
98QQuaternion QQuick3DQuaternionUtils::fromEulerAngles(float x, float y, float z)
99{
100 return QQuaternion::fromEulerAngles(x, y, z);
101}
102
103QQuaternion QQuick3DQuaternionUtils::fromEulerAngles(const QVector3D &eulerAngles)
104{
105 return QQuaternion::fromEulerAngles(eulerAngles);
106}
107
108QQuaternion QQuick3DQuaternionUtils::lookAt(const QVector3D &sourcePosition,
109 const QVector3D &targetPosition,
110 const QVector3D &forwardDirection,
111 const QVector3D &upDirection)
112{
113 QVector3D targetDirection = targetPosition - sourcePosition;
114 targetDirection.normalize();
115
116 QVector3D rotationAxis = QVector3D::crossProduct(forwardDirection, targetDirection);
117
118 const QVector3D normalizedAxis = rotationAxis.normalized();
119 if (qFuzzyIsNull(normalizedAxis.lengthSquared()))
120 rotationAxis = upDirection;
121
122 float dot = QVector3D::dotProduct(forwardDirection, targetDirection);
123 float rotationAngle = qRadiansToDegrees(qAcos(dot));
124
125 return QQuaternion::fromAxisAndAngle(rotationAxis, rotationAngle);
126}
127
128QQuaternion QQuick3DQuaternionUtils::fromAxesAndAngles(const QVector3D &axis1,
129 float angle1,
130 const QVector3D &axis2,
131 float angle2,
132 const QVector3D &axis3,
133 float angle3)
134{
135 const QQuaternion q1 = QQuaternion::fromAxisAndAngle(axis1, angle1);
136 const QQuaternion q2 = QQuaternion::fromAxisAndAngle(axis2, angle2);
137 const QQuaternion q3 = QQuaternion::fromAxisAndAngle(axis3, angle3);
138 return q3 * q2 * q1;
139}
140
141QQuaternion QQuick3DQuaternionUtils::fromAxesAndAngles(const QVector3D &axis1,
142 float angle1,
143 const QVector3D &axis2,
144 float angle2)
145{
146 const QQuaternion q1 = QQuaternion::fromAxisAndAngle(axis1, angle1);
147 const QQuaternion q2 = QQuaternion::fromAxisAndAngle(axis2, angle2);
148 return q2 * q1;
149}
150
151QT_END_NAMESPACE
Combined button and popup list for selecting options.