public OrientedPoint GetProjectionAndTangent(Vector3 worldPos, ref int st, ref int index) { int initialStretch = st; OrientedPoint orientedPoint = new OrientedPoint(Vector3.zero, Quaternion.identity); float minDst = float.MaxValue; for (int i = st; i < NStretches; i++) { Stretch s = GetNStretch(i); bool fwd = IsStretchNForward(i); if (index == -1) { if (fwd) { index = 0; } else { index = s.Vertices.Length - 1; } } int temp = index; if (st != initialStretch) { temp = fwd ? 0 : s.Vertices.Length - 1; } OrientedPoint op = s.GetClosestOrientedPoint(worldPos, fwd, ref temp); float dst = Vector3.SqrMagnitude(op.Pos - worldPos); if (dst < minDst) { orientedPoint = op; minDst = dst; st = i; index = temp; } else { break; } } return(orientedPoint); }
public OrientedPoint GetProjectionAndTangent(Vector3 worldPos) { OrientedPoint orientedPoint = new OrientedPoint(Vector3.zero, Quaternion.identity); float minDst = float.MaxValue; for (int i = 0; i < NStretches; i++) { Stretch s = GetNStretch(i); bool fwd = IsStretchNForward(i); OrientedPoint op = s.GetClosestOrientedPoint(worldPos, fwd); float dst = Vector3.SqrMagnitude(op.Pos - worldPos); if (dst < minDst) { orientedPoint = op; minDst = dst; } else { break; } } return(orientedPoint); }