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 const QVector3D forwardDirectionNormal = forwardDirection.normalized();
117 QVector3D rotationAxis = QVector3D::crossProduct(forwardDirectionNormal, targetDirection);
119 const QVector3D normalizedAxis = rotationAxis.normalized();
120 if (qFuzzyIsNull(normalizedAxis.lengthSquared()))
121 rotationAxis = upDirection;
123 float dot = QVector3D::dotProduct(forwardDirectionNormal, targetDirection);
124 dot = qBound(-1.0f, dot, 1.0f);
125 float rotationAngle = qRadiansToDegrees(qAcos(dot));
127 return QQuaternion::fromAxisAndAngle(rotationAxis, rotationAngle);
130QQuaternion QQuick3DQuaternionUtils::fromAxesAndAngles(
const QVector3D &axis1,
132 const QVector3D &axis2,
134 const QVector3D &axis3,
137 const QQuaternion q1 = QQuaternion::fromAxisAndAngle(axis1, angle1);
138 const QQuaternion q2 = QQuaternion::fromAxisAndAngle(axis2, angle2);
139 const QQuaternion q3 = QQuaternion::fromAxisAndAngle(axis3, angle3);