How to create a cubic grainless curve when setting N points in 3D?

So, I need to find out where the control points will be for the cubic bezier curve, when only knowing the points on the curve, the points can lie in 3D. It would be ideal if I could do this for any number of points on the curve. Most of what I found is for 2D only, or for only 4 points.

+4
source share
1 answer

Let me see if you understand you: you need an Bezier interpolating curve passing through a given set of points P0 P1 ...
but drawn like bezier curves with a function like

bezier4( nstep, Pj, Cj, Dj, Pj+1 ) -- control points Cj, Dj 

That is, you want to get two Bezier control points Cj, Dj for each part of Pj - Pj + 1?

One way to obtain such control points is to use Bernstein's polynomial basis

 b0(t) = (1-t)^3 b1(t) = 3 (1-t)^2 t, b2(t) = 3 (1-t) t^2 b3(t) = t^3 bezier4(t) = b0(t) P0 + b1(t) C0 + b2(t) D0 + b3(t) P1 = P0 at t=0, tangent --> C0 = P1 at t=1, tangent <-- D0 

and find or output the Catmull-Rom interpolation alloy that passes through P-1 P0 P1 P2:

 b0(t) P0 + b1(t) (P0 + (P1 - P-1) / 6) + b2(t) (P1 - (P2 - P0) / 6) + b3(t) P1 = P0 at t=0, P1 at t=1 

We want bezier4 (t) to be exactly the same curve as CatmullRom (t), therefore:

 C0 = P0 + (P1 - P-1) / 6 D0 = P1 - (P2 - P0) / 6 

Given the N points P0 P1 ... (in 2d 3d ... anyd), take them 4 at a time; for each 4 this formula gives you 2 control points Cj, Dj for

 bezier4( nstep, Pj, Cj, Dj, Pj+1 ) 

That makes sense, is that what you want?
(For generosity, I would wander a few Python / numpy together.)

+3
source

All Articles