Для определения длины сплайна (состоит из кривых Безье) нужно рассчитать определенный интеграл в интервале [0, 1].
Пробую высокоточную и фундаментальную математику.
Проблема в правильном расчете первой производной в этом коде, поскольку в туторе она нужна просто для визуализации скорости.
Для одиночной кривой Безье расчет верен, проблема в сплайне - как учесть количество кривых ???
В классе Bezier расчет:
Синтаксис:
Используется csharp
public static Vector3 GetFirstDerivative(Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3, float t)
{
t = Mathf.Clamp01(t);
float oneMinusT = 1f - t;
return
3f * oneMinusT * oneMinusT * (p1 - p0) +
6f * oneMinusT * t * (p2 - p1) +
3f * t * t * (p3 - p2);
}
{
t = Mathf.Clamp01(t);
float oneMinusT = 1f - t;
return
3f * oneMinusT * oneMinusT * (p1 - p0) +
6f * oneMinusT * t * (p2 - p1) +
3f * t * t * (p3 - p2);
}
В классе BezierSpline:
Синтаксис:
Используется csharp
public Vector3 GetFirstDerivative(float t)
{
int i;
if (t >= 1f)
{
t = 1f;
i = points.Length - 4;
}
else
{
t = Mathf.Clamp01(t) * CurveCount;
i = (int)t;
t -= i;
i *= 3;
}
return transform.TransformPoint(Bezier.GetFirstDerivative(points[i], points[i + 1], points[i + 2], points[i + 3], t));
}
{
int i;
if (t >= 1f)
{
t = 1f;
i = points.Length - 4;
}
else
{
t = Mathf.Clamp01(t) * CurveCount;
i = (int)t;
t -= i;
i *= 3;
}
return transform.TransformPoint(Bezier.GetFirstDerivative(points[i], points[i + 1], points[i + 2], points[i + 3], t));
}
Вопрос к знатокам сплайнов:
Как правильно в этом куске вычислить 1-ю производную для всего сплайна ?