frameAt method
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(),
);
}