【问题标题】:How to create a cubic bezier curve when given N points in 3D?给定 3D 中的 N 个点时如何创建三次贝塞尔曲线?
【发布时间】:2011-04-01 09:56:42
【问题描述】:

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

【问题讨论】:

    标签: 3d bezier spline nurbs


    【解决方案1】:

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

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

    即要导出两个贝塞尔控制点Cj,Dj 对于每个 Pj -- Pj+1 ?

    导出此类控制点的一种方法是使用伯恩斯坦多项式基

    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 ... (in 2d 3d ... anyd),一次取 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 样条曲线(简介|教程)提供 170 万次点击...
    • 啊,好吧,不过 P-1 似乎用起来很奇怪。另外,我假设 t 只是曲线上的一个参数,并且基于此您知道每个控制点对曲线的该部分有多大影响...但是由于我只知道曲线上的点,所以我认为您会堵塞在每个已知点的参数(和位置)中,以计算控制点。我仍然需要插入更多的测试号码......只是时间不够用了。感谢您到目前为止的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 2011-03-10
    • 2011-05-30
    • 2012-07-27
    • 2016-10-05
    • 2016-02-28
    相关资源
    最近更新 更多