frameAt method

ScenePathFrame frameAt(
  1. double t
)

An oriented frame at natural parameter t (clamped to 0..1).

Implementation

ScenePathFrame frameAt(double t) {
  final clamped = _clamp01(t);
  final table = _baked;
  final params = table.parameters;
  var hi = 1;
  while (hi < params.length - 1 && params[hi] < clamped) {
    hi++;
  }
  final lo = hi - 1;
  final span = params[hi] - params[lo];
  final local = span > 1e-12 ? (clamped - params[lo]) / span : 0.0;

  final position = positionAt(clamped);
  var tangent = tangentAt(clamped);
  if (tangent.length2 < 1e-12) {
    tangent = table.tangents[hi].clone();
  }
  tangent = tangent.normalized();

  var normal = table.normals[lo] * (1.0 - local) + table.normals[hi] * local;
  normal = normal - tangent * normal.dot(tangent);
  if (normal.length2 < 1e-12) {
    normal = _perpendicularTo(tangent);
  }
  normal = normal.normalized();

  return ScenePathFrame(
    position: position,
    tangent: tangent,
    normal: normal,
    binormal: tangent.cross(normal).normalized(),
  );
}