getPoint method

  1. @override
dynamic getPoint(
  1. num t, [
  2. dynamic optionalTarget
])
override

Implementation

@override
getPoint(t, [optionalTarget]) {
  var point = optionalTarget ?? Vector3.init();

  var points = this.points;
  var l = points.length;

  var p = (l - (closed ? 0 : 1)) * t;
  var intPoint = Math.floor(p);
  var weight = p - intPoint;

  if (closed) {
    intPoint += intPoint > 0 ? 0 : (Math.floor(Math.abs(intPoint) / l) + 1) * l;
  } else if (weight == 0 && intPoint == l - 1) {
    intPoint = l - 2;
    weight = 1;
  }

  var p0, p3; // 4 points (p1 & p2 defined below)

  if (closed || intPoint > 0) {
    p0 = points[(intPoint - 1) % l];
  } else {
    // extrapolate first point
    tmp.subVectors(points[0], points[1]).add(points[0]);
    p0 = tmp;
  }

  var p1 = points[intPoint % l];
  var p2 = points[(intPoint + 1) % l];

  if (closed || intPoint + 2 < l) {
    p3 = points[(intPoint + 2) % l];
  } else {
    // extrapolate last point
    tmp.subVectors(points[l - 1], points[l - 2]).add(points[l - 1]);
    p3 = tmp;
  }

  if (curveType == 'centripetal' || curveType == 'chordal') {
    // init Centripetal / Chordal Catmull-Rom
    var pow = curveType == 'chordal' ? 0.5 : 0.25;
    var dt0 = Math.pow(p0.distanceToSquared(p1), pow);
    var dt1 = Math.pow(p1.distanceToSquared(p2), pow);
    var dt2 = Math.pow(p2.distanceToSquared(p3), pow);

    // safety check for repeated points
    if (dt1 < 1e-4) dt1 = 1.0;
    if (dt0 < 1e-4) dt0 = dt1;
    if (dt2 < 1e-4) dt2 = dt1;

    px.initNonuniformCatmullRom(p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2);
    py.initNonuniformCatmullRom(p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2);
    pz.initNonuniformCatmullRom(p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2);
  } else if (curveType == 'catmullrom') {
    px.initCatmullRom(p0.x, p1.x, p2.x, p3.x, tension);
    py.initCatmullRom(p0.y, p1.y, p2.y, p3.y, tension);
    pz.initCatmullRom(p0.z, p1.z, p2.z, p3.z, tension);
  }

  point.set(px.calc(weight), py.calc(weight), pz.calc(weight));

  return point;
}