You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Manim中创建经过指定点的平滑闭合曲线?

如何在Manim中创建经过指定点的平滑闭合曲线?

嗨,我来帮你搞定这个问题!你遇到的首尾尖角问题,是因为make_smooth()默认没把闭合路径的首尾当成连续的曲线来处理——它只平滑了中间的转折,却忽略了起点和终点的衔接。这里有两种简单的解决办法:

方法一:用CatmullRomCurve(推荐)

Manim自带的CatmullRomCurve就是专门用来生成平滑样条曲线的,而且原生支持闭合路径,代码写起来更简洁,效果也更稳定:

from manim import *

class Help(Scene):
    def construct(self):
        points = ((-3, 2, 0), (-1, 0, 0), (-4, -2, 0), (-5, 0, 0))
        # closed=True 让曲线自动首尾平滑衔接,tension控制曲线松紧(可按需调整)
        redCurve = CatmullRomCurve(points, closed=True, tension=0.8)
        redCurve.set_color(RED)

        self.play(Create(redCurve))
        self.wait(3)

tension参数可以调整曲线的弯曲程度,数值越小曲线越“紧绷”,越大则越“松弛”,0.8是比较自然的默认值,你可以多试几个数值找到自己喜欢的效果。

方法二:调整VMobject的平滑逻辑

如果你更习惯用VMobject的工作流,只需要稍微修改一下点的处理逻辑,让make_smooth()意识到这是个闭合路径:

from manim import *

class Help(Scene):
    def construct(self):
        points = ((-3, 2, 0), (-1, 0, 0), (-4, -2, 0), (-5, 0, 0))
        # 把第一个点重复添加到列表末尾,让平滑算法能处理首尾衔接
        extended_points = list(points) + [points[0]]
        redCurve = VMobject(color=RED)
        redCurve.set_points_as_corners(extended_points)
        # 指定closed=True,告诉make_smooth这是闭合路径
        redCurve.make_smooth(closed=True)

        self.play(Create(redCurve))
        self.wait(3)

这样修改后,make_smooth()就会把首尾的点当成连续的曲线段来处理,尖角自然就消失啦。

两种方法都能解决你的问题,个人更推荐第一种,因为代码更简洁,曲线的平滑度也更容易控制~

备注:内容来源于stack exchange,提问作者Caleb Keller

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 20:09:35