Прыжки по кубическому отшельнику
У меня проблема с реализацией кубического сплайна Эрмита. Мне нужно переместить мой игровой объект по сплайну. Я нашел определение сплайна Эрмита в Wiki и реализовал его в сценариях ниже. Когда мой игровой объект проходит через контрольную точку, он немного прыгает. Я полагаю, что проблема заключается в разнице между производными до и после этого момента.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Spline {
public Vector3[] points, derivatives;
private int fragmentIndex = 0;
private float t = 0f;
public void ConfigSpline(Vector3 derivativeAt0){
derivatives = new Vector3[points.Length];
float sum = 0;
derivatives[0] = derivativeAt0;
for (int i = 1; i < derivatives.Length - 1; i++) {
/*[i] = (points[i+1] - points[i-1])/
((points[i-1]-points[i+1]).magnitude);*/
derivatives [i] = (points [i + 1] - points [i]) / (2 * (points [i + 1] - points [i]).magnitude) +
(points [i] - points [i - 1]) / (2 * (points [i] - points [i - 1]).magnitude);
sum += (points [i - 1] - points [i]).magnitude;
}
derivatives[derivatives.Length - 1] = (points[derivatives.Length - 1] - points[0])/
(sum + (points[derivatives.Length - 1] - points[derivatives.Length - 2]).magnitude);
}
public Vector3 GetPoint(float dt){
t += dt;
if (t > 1f) {
t -= 1.0f;
fragmentIndex++;
if (fragmentIndex == points.Length)
//TODO
;
}
return (2 * Mathf.Pow (t, 3) - 3 * Mathf.Pow (t, 2) + 1) * points [fragmentIndex] +
(Mathf.Pow (t, 3) - 2 * Mathf.Pow (t, 2) + t) * (points [fragmentIndex + 1] - points [fragmentIndex]).magnitude * derivatives [fragmentIndex] +
(-2 * Mathf.Pow (t, 3) + 3 * Mathf.Pow (t, 2)) * points [fragmentIndex + 1] +
(Mathf.Pow (t, 3) - Mathf.Pow (t, 2)) * (points [fragmentIndex + 1] - points [fragmentIndex]).magnitude * derivatives [fragmentIndex + 1];
}
public void Reset () {
fragmentIndex = 0;
t = 0f;
}
}
Этот сплайн используется в этом методе:
private void MoveTowardsByPath () {
originTrajectory.transform.position = spline.GetPoint (Time.deltaTime);
originTrajectory.transform.rotation = Quaternion.LookRotation (moveDirection);
transform.rotation = originTrajectory.transform.rotation;
transform.position = originTrajectory.transform.position;
moveDirection = transform.position - lastPosition;
lastPosition = transform.position;
}