如何在3D中给出N个点时创建三次贝塞尔曲线?

时间:2010-08-19 22:57:35

标签: 3d bezier spline nurbs

因此,当只知道曲线上的点时,我需要找出控制点对于三次贝塞尔曲线的位置,这些点可以位于3D中。如果我可以对曲线上的任意点进行此操作,那将是理想的选择。我发现的大部分内容仅涉及2D或仅4点。

1 个答案:

答案 0 :(得分:3)

让我看看我是否理解你: 你想要一个插值贝塞尔曲线, 经过一组给定的点P0 P1 ...
但绘制为贝塞尔曲线,具有类似

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

也就是说,你想得到两个Bezier控制点Cj,Dj 对于每件Pj - Pj + 1?

导出这种控制点的一种方法是使用Bernstein多项式基础

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

并查找或导出内插aka Catmull-Rom样条曲线 通过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

我们希望bezier4(t)与CatmullRom(t)完全相同,所以:

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

给定N点P0 P1 ......(在2d 3d ... anyd中),一次取4个; 对于每个4,该公式为您提供2个控制点Cj,Dj为

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

这是否有意义,是你想要的吗? (为了赏金,我会把一些Python / numpy拼凑在一起。)