11 const Eigen::Vector3f& targetDirection,
12 const float targetDistance)
14 const float currentNorm = currentGazeDirection.norm();
15 const float targetNorm = targetDirection.norm();
19 if (currentNorm < 1e-6F or targetNorm < 1e-6F)
21 return GazeResidual{.angularError = 0.F, .lateralError = 0.F};
24 const float cosAngle =
25 std::clamp((currentGazeDirection / currentNorm).
dot(targetDirection / targetNorm),
28 const float angularError = std::acos(cosAngle);
31 .lateralError = std::sin(angularError) * std::abs(targetDistance)};
GazeResidual computeGazeResidual(const Eigen::Vector3f ¤tGazeDirection, const Eigen::Vector3f &targetDirection, const float targetDistance)
The gaze residual, in a form that means the same thing for every controller variant.