Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
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
5#include <QtQuick3DUtils/private/qssgutils_p.h>
6#include <QtMath>
7
9
85
87{
88 return QQuaternion::fromAxisAndAngle(x, y, z, angle);
89}
90
92{
93 return QQuaternion::fromAxisAndAngle(axis, angle);
94}
95
97{
98 return QQuaternion::fromEulerAngles(x, y, z);
99}
100
102{
103 return QQuaternion::fromEulerAngles(eulerAngles);
104}
105
107 const QVector3D &targetPosition,
108 const QVector3D &forwardDirection,
109 const QVector3D &upDirection)
110{
111 QVector3D targetDirection = targetPosition - sourcePosition;
112 targetDirection.normalize();
113
114 QVector3D rotationAxis = QVector3D::crossProduct(forwardDirection, targetDirection);
115
116 const QVector3D normalizedAxis = rotationAxis.normalized();
117 if (qFuzzyIsNull(normalizedAxis.lengthSquared()))
118 rotationAxis = upDirection;
119
120 float dot = QVector3D::dotProduct(forwardDirection, targetDirection);
121 float rotationAngle = qRadiansToDegrees(qAcos(dot));
122
123 return QQuaternion::fromAxisAndAngle(rotationAxis, rotationAngle);
124}
125
127 float angle1,
128 const QVector3D &axis2,
129 float angle2,
130 const QVector3D &axis3,
131 float angle3)
132{
133 const QQuaternion q1 = QQuaternion::fromAxisAndAngle(axis1, angle1);
134 const QQuaternion q2 = QQuaternion::fromAxisAndAngle(axis2, angle2);
135 const QQuaternion q3 = QQuaternion::fromAxisAndAngle(axis3, angle3);
136 return q3 * q2 * q1;
137}
138
140 float angle1,
141 const QVector3D &axis2,
142 float angle2)
143{
144 const QQuaternion q1 = QQuaternion::fromAxisAndAngle(axis1, angle1);
145 const QQuaternion q2 = QQuaternion::fromAxisAndAngle(axis2, angle2);
146 return q2 * q1;
147}
148
\inmodule QtCore
Definition qobject.h:103
The QQuaternion class represents a quaternion consisting of a vector and scalar.
static Q_INVOKABLE QQuaternion fromAxesAndAngles(const QVector3D &axis1, float angle1, const QVector3D &axis2, float angle2, const QVector3D &axis3, float angle3)
static Q_INVOKABLE QQuaternion fromAxisAndAngle(float x, float y, float z, float angle)
static Q_INVOKABLE QQuaternion fromEulerAngles(float x, float y, float z)
static Q_INVOKABLE QQuaternion lookAt(const QVector3D &sourcePosition, const QVector3D &targetPosition, const QVector3D &forwardDirection=QVector3D(0, 0, -1), const QVector3D &upDirection=QVector3D(0, 1, 0))
QQuick3DQuaternionUtils(QObject *parent=nullptr)
\qmltype Quaternion \inqmlmodule QtQuick3D
The QVector3D class represents a vector or vertex in 3D space.
Definition qvectornd.h:171
QVector3D normalized() const noexcept
Returns the normalized unit vector form of this vector.
Definition qvectornd.h:695
static constexpr float dotProduct(QVector3D v1, QVector3D v2) noexcept
Returns the dot product of v1 and v2.
Definition qvectornd.h:770
static constexpr QVector3D crossProduct(QVector3D v1, QVector3D v2) noexcept
Returns the cross-product of vectors v1 and v2, which is normal to the plane spanned by v1 and v2.
Definition qvectornd.h:775
void normalize() noexcept
Normalizes the current vector in place.
Definition qvectornd.h:702
Combined button and popup list for selecting options.
bool qFuzzyIsNull(qfloat16 f) noexcept
Definition qfloat16.h:349
constexpr float qRadiansToDegrees(float radians)
Definition qmath.h:281
auto qAcos(T v)
Definition qmath.h:72
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat z
GLint GLint GLint GLint GLint x
[0]
GLfloat angle
GLint y
static qreal dot(const QPointF &a, const QPointF &b)