Quat MUST_USE_RESULT Quat::RotateFromTo(const float3 &sourceDirection, const float3 &targetDirection) { assume(sourceDirection.IsNormalized()); assume(targetDirection.IsNormalized()); float angle = sourceDirection.AngleBetweenNorm(targetDirection); assume(angle >= 0.f); // If sourceDirection == targetDirection, the cross product comes out zero, and normalization would fail. In that case, pick an arbitrary axis. float3 axis = sourceDirection.Cross(targetDirection); float oldLength = axis.Normalize(); if (oldLength == 0) axis = float3(1, 0, 0); return Quat(axis, angle); }