108QQuaternion QQuick3DQuaternionUtils::lookAt(
const QVector3D &sourcePosition,
109 const QVector3D &targetPosition,
110 const QVector3D &forwardDirection,
111 const QVector3D &upDirection)
113 QVector3D targetDirection = targetPosition - sourcePosition;
114 targetDirection.normalize();
116 QVector3D rotationAxis = QVector3D::crossProduct(forwardDirection, targetDirection);
118 const QVector3D normalizedAxis = rotationAxis.normalized();
119 if (qFuzzyIsNull(normalizedAxis.lengthSquared()))
120 rotationAxis = upDirection;
122 float dot = QVector3D::dotProduct(forwardDirection, targetDirection);
123 float rotationAngle = qRadiansToDegrees(qAcos(dot));
125 return QQuaternion::fromAxisAndAngle(rotationAxis, rotationAngle);
128QQuaternion QQuick3DQuaternionUtils::fromAxesAndAngles(
const QVector3D &axis1,
130 const QVector3D &axis2,
132 const QVector3D &axis3,
135 const QQuaternion q1 = QQuaternion::fromAxisAndAngle(axis1, angle1);
136 const QQuaternion q2 = QQuaternion::fromAxisAndAngle(axis2, angle2);
137 const QQuaternion q3 = QQuaternion::fromAxisAndAngle(axis3, angle3);