在3D中给定N个点时,如何创建三次bezier曲线?

在3D中给定N个点时,如何创建三次bezier曲线?,3d,bezier,spline,nurbs,3d,Bezier,Spline,Nurbs,所以我需要找出三次bezier曲线的控制点在哪里,当只知道曲线上的点时,这些点可以位于3D中。这将是理想的,如果我可以做任何数量的点在曲线上。我发现的大部分内容仅涉及2D,或仅涉及4个点。让我看看我是否了解您: 你想要一条插值贝塞尔曲线, 通过一组给定的点P0 P1… 但绘制为贝塞尔曲线,函数如下 bezier4( nstep, Pj, Cj, Dj, Pj+1 ) -- control points Cj, Dj 也就是说,您希望导出两个贝塞尔控制点Cj,Dj 每件Pj——Pj+1 推导此

所以我需要找出三次bezier曲线的控制点在哪里,当只知道曲线上的点时,这些点可以位于3D中。这将是理想的,如果我可以做任何数量的点在曲线上。我发现的大部分内容仅涉及2D,或仅涉及4个点。

让我看看我是否了解您: 你想要一条插值贝塞尔曲线, 通过一组给定的点P0 P1…
但绘制为贝塞尔曲线,函数如下

bezier4( nstep, Pj, Cj, Dj, Pj+1 )  -- control points Cj, Dj
也就是说,您希望导出两个贝塞尔控制点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
我们希望bezier4(t)与CatmullRom(t)的曲线完全相同,因此:

给定N个点p0p1。。。(在2d-3d…任意情况下),每次取4个; 对于每4个,该公式为您提供2个控制点Cj,Dj

bezier4( nstep, Pj, Cj, Dj, Pj+1 )
这有意义吗?这是你想要的吗?

(为了奖励,我会拼凑一些Python/numpy。)

谢谢你的回复,从我所读到的来看,这似乎是一种有效的方法,但我对公式已经很生疏了。我不确定P-1或t代表什么。P-1 P0 P1 P2只是曲线上一行中4个点的名称(如果愿意,可以称它们为P1 P2 P3 P4);t通常沿着一条曲线从0到1移动,想象一下从0到1秒。Google spline(简介|教程)提供170万点击率…啊,好吧,P-1的使用看起来很奇怪。此外,我假设t只是曲线上的一个参数,基于此,您知道每个控制点对曲线的该部分有多大影响。。。但是因为我只知道曲线上的点,我想你应该插入每个已知点的参数(和位置)来计算控制点。我还需要插入更多的测试号码。。。没时间了。不过,谢谢你迄今为止的帮助。
C0 = P0 + (P1 - P-1) / 6
D0 = P1 - (P2 - P0) / 6
bezier4( nstep, Pj, Cj, Dj, Pj+1 )