106QQuaternion QQuick3DQuaternionUtils::lookAt(
const QVector3D &sourcePosition,
107 const QVector3D &targetPosition,
108 const QVector3D &forwardDirection,
109 const QVector3D &upDirection)
111 QVector3D targetDirection = targetPosition - sourcePosition;
112 targetDirection.normalize();
114 QVector3D rotationAxis = QVector3D::crossProduct(forwardDirection, targetDirection);
116 const QVector3D normalizedAxis = rotationAxis.normalized();
117 if (qFuzzyIsNull(normalizedAxis.lengthSquared()))
118 rotationAxis = upDirection;
120 float dot = QVector3D::dotProduct(forwardDirection, targetDirection);
121 float rotationAngle = qRadiansToDegrees(qAcos(dot));
123 return QQuaternion::fromAxisAndAngle(rotationAxis, rotationAngle);
126QQuaternion QQuick3DQuaternionUtils::fromAxesAndAngles(
const QVector3D &axis1,
128 const QVector3D &axis2,
130 const QVector3D &axis3,
133 const QQuaternion q1 = QQuaternion::fromAxisAndAngle(axis1, angle1);
134 const QQuaternion q2 = QQuaternion::fromAxisAndAngle(axis2, angle2);
135 const QQuaternion q3 = QQuaternion::fromAxisAndAngle(axis3, angle3);