Em vez de beziers, você provavelmente deseja splines b-splines ou catmull-rom.
float bspline(float t, float p0, float p1, float p2, float p3)
{
float it = 1.0f - t;
float b0 = it*it*it * (1.0f / 6.0f);
float b1 = (3*t*t*t - 6*t*t +4) * (1.0f / 6.0f);
float b2 = (-3*t*t*t +3*t*t + 3*t + 1) * (1.0f / 6.0f);
float b3 = t*t*t * (1.0f / 6.0f);
return
b0*p0 +
b1*p1 +
b2*p2 +
b3*p3;
}
float catmullrom(float t, float p0, float p1, float p2, float p3)
{
return 0.5f * (
(2 * p1) +
(-p0 + p2) * t +
(2 * p0 - 5 * p1 + 4 * p2 - p3) * t * t +
(-p0 + 3 * p1 - 3 * p2 + p3) * t * t * t
);
}
Uso: t varia de 0 a 1, onde o valor interpola o spline entre dois pontos de controle e os flutuadores p0, p1, p2 e p3 representam os pontos de controle (anterior, atual, próximo e a seguir). Para interpolar curvas n-dimensionais, basta chamar as funções uma vez por eixo.
A diferença prática entre bsplines e catmull-rom é basicamente que o catmull-rom passa por todos os pontos de controle enquanto os bsplines são mais suaves.