Manim next_to 用法:标签不跟着物体移动?add_updater 和 VGroup 两种改法(0.21.0 实测)
next_to是 Manim 里最常用的相对定位方法label.next_to(tri, RIGHT, buff0.3)把标签摆到三角形右边 0.3 的位置。但它是一次性的只在调用的那一行算一次坐标不会建立「一直在右边」的关系。所以之后三角形一动标签就留在原地。要让标签跟着走有两种改法add_updater每帧重新next_to一次或者把两者装进VGroup一起动。本文代码和坐标数字都在 Manim Community 0.21.02026 年的最新版本上实测过。Manim 是 3Blue1Brown 作者开源的数学动画引擎用 Python 描述画面里有什么、怎么动由它逐帧渲染成视频没接触过的可以先看这篇介绍。下面三段完整代码可以直接贴进极坐标⋅XYZ 的工作区点运行里面装的也是 Manim 0.21.0本机不用装 Python 和 LaTeX。先把问题跑出来一个三角形右边用next_to摆一个 △ABC 的标签然后把三角形往左挪 5 个单位from manim import * class LabelLeftBehind(Scene): def construct(self): tri Polygon([-2, -2, 0], [0, 2, 0], [3, 0, 0], colorBLUE) tri.set_fill(BLUE, 0.5).scale(0.5).move_to(RIGHT * 3) label MathTex(r\triangle ABC, colorYELLOW) label.next_to(tri, RIGHT, buff0.3) self.add(tri, label) self.wait(0.5) self.play(tri.animate.shift(LEFT * 5), run_time2) self.wait()三角形走了标签没动。我们把坐标打印出来看过移动前三角形右边缘在 x 4.25标签左边缘在 x 4.55中间正好隔着buff0.3。移动后三角形右边缘到了 x -0.75标签左边缘还是 4.55两者隔了 5.3 个单位。next_to 那一行到底做了什么label.next_to(tri, RIGHT, buff0.3)执行时Manim 做了三件事取tri外接框右边缘的中点取label外接框左边缘的中点然后把label平移让这两个点在水平方向上相距 0.3。算完就是一次普通的平移label身上只留下了新坐标。tri这个参照物没有被存到任何地方Manim 里也没有「约束」这种东西在后台盯着。所以这行代码的效果和你手算出坐标再写label.move_to([5.33, 0, 0])没有区别只是省了你算的那一步。align_to、to_edge、to_corner、move_to(另一个物体)都是同一个脾气摆的是调用那一刻的位置。网上不少教程的示例里物体动了标签也跟着动看起来像是自动的。翻代码会发现那是在物体挪到新位置之后又调了一次next_to或者干脆每帧都在调。改法一挂一个 updater每帧重新贴一次updater 是挂在物体上的一个函数动画播放期间 Manim 每渲染一帧之前都会调它一遍。把next_to放进去标签每一帧都按三角形的最新位置重新摆from manim import * class LabelFollows(Scene): def construct(self): tri Polygon([-2, -2, 0], [0, 2, 0], [3, 0, 0], colorBLUE) tri.set_fill(BLUE, 0.5).scale(0.5).move_to(RIGHT * 3) label MathTex(r\triangle ABC, colorYELLOW) label.next_to(tri, RIGHT, buff0.3) label.add_updater(lambda m: m.next_to(tri, RIGHT, buff0.3)) self.add(tri, label) self.wait(0.5) self.play(tri.animate.shift(LEFT * 5), run_time2) self.play(tri.animate.scale(1.6), run_time1.5) self.play(Rotate(tri, PI / 2), run_time1.5) label.clear_updaters() self.play(tri.animate.shift(UP * 1.5)) self.wait()比上一段只多了add_updater那一行。lambda m: ...里的m就是label自己Manim 调用时会传进来。这段后面故意多做了几个动作。三角形放大 1.6 倍、再转 90°标签始终贴在它右边 0.3 的位置自己的大小没变。因为next_to每帧重新读的是三角形外接框的右边缘三角形变大、变形、转向外接框跟着变标签也就跟着让位。最后label.clear_updaters()把 updater 摘掉之后三角形往上走标签又不跟了。做动画时经常需要这样前半段跟着到某个时刻松手让标签留在原地或者单独飞去别处。前面那行label.next_to(...)不要删。add_updater挂上去的时候默认不会先执行一次而且紧跟着的self.wait(0.5)也不会触发它wait期间只有带dt参数的 updater写成lambda m, dt: ...的那种才会被调用像这里lambda m: ...这样不带dt的Manim 认为画面是静止的直接跳过。我们试过把那行删掉标签在开头的半秒里一直待在画面正中央等三角形开始动才跳到它旁边。不想写两遍的话可以用label.add_updater(..., call_updaterTrue)挂上的同时立刻执行一次。改法二装进 VGroup一起动如果标签和图形从头到尾都是一体的不需要中途分开更省事的办法是打包from manim import * class GroupMove(Scene): def construct(self): tri Polygon([-2, -2, 0], [0, 2, 0], [3, 0, 0], colorBLUE) tri.set_fill(BLUE, 0.5).scale(0.5).move_to(RIGHT * 3) label MathTex(r\triangle ABC, colorYELLOW) label.next_to(tri, RIGHT, buff0.3) group VGroup(tri, label) self.add(group) self.wait(0.5) self.play(group.animate.shift(LEFT * 5), run_time2) self.play(group.animate.scale(1.6), run_time1.5) self.wait()注意动画的对象换成了group。平移时两者一起走间距保持 0.3。放大就能看出它和改法一的差别了。对group放大 1.6 倍标签也跟着大了 1.6 倍间距从 0.3 变成 0.48。整组是当一张图在缩放里面的相对位置等比例变。所以怎么选看你要的是哪种「跟着」updaterVGroup平移跟着走跟着走图形放大标签大小不变间距不变标签一起放大间距一起放大图形旋转标签不转贴在新外接框旁边标签一起转中途分开clear_updaters()改回对单个物体做动画每帧开销多调一次函数没有给动点标字母、给会伸缩的线段标长度一般用 updater。一个带文字的图标、一个整体移动的小组件用VGroup。常见写错的地方在循环里写 lambda所有标签都跟着最后一个点这个我们自己也踩过for dot, label in zip(dots, labels): label.add_updater(lambda m: m.next_to(dot, UP))动画一播三个标签全叠到最后一个点上面。原因在 Python不在 Manimlambda 里的dot是等到被调用时才去取值的那时循环早跑完了dot已经是最后一个。用默认参数把当前这个dot留住就好for dot, label in zip(dots, labels): label.add_updater(lambda m, ddot: m.next_to(d, UP))挂了 updater 之后还想手动挪标签label.shift(UP)或者self.play(label.animate.shift(UP))都留不住下一帧 updater 又把它贴回三角形旁边。要挪就先clear_updaters()或者改 updater 里的方向和buff。只动了一次却挂了 updater如果三角形只在某一步挪一下之后就不动了不必上 updater在同一个play里让标签也走过去就行self.play( tri.animate.shift(LEFT * 5), label.animate.shift(LEFT * 5), )常见追问FAQQalways_redraw和这里的add_updater有什么区别Aalways_redraw每一帧把物体重新造一遍适合形状本身要变的东西比如连接两个动点的线段、会伸缩的花括号。标签的形状没变只是换位置用add_updater加next_to就够了不用每帧重新排一次公式。Qupdater 会拖慢渲染吗A一个next_to的计算量很小几十个标签都感觉不出来。慢的是在 updater 里每帧新建MathTex这类重对象。Qself.add之前挂 updater 和之后挂有区别吗A先后顺序没有影响。但物体必须在场景里updater 才会被调用。只挂了 updater 却没add的物体位置不会变。Q我想让标签一直在点的右上方而且离得稍远一点A把方向换成URbuff调大m.next_to(dot, UR, buff0.2)。方向常量可以随便换UP、DL都行。这个知识点在教程《布局上· 描述关系不算坐标》的最后一节有视频讲解旁边的代码可以边看边改updater 的完整用法在《Updater》那一课。来源极坐标⋅XYZ · jizuobiao.xyz · 更新于 2026-10-03 · 基于 Manim Community 0.21.0

相关新闻

AI驱动的数据库自治:DAS Agent如何让运维从救火到防火

AI驱动的数据库自治:DAS Agent如何让运维从救火到防火

半夜2点17分,手机在床头柜上震动。不是闹钟,是数据库告警推送。CPU 99%、连接数打满、慢查询刷屏、主从延迟飙到几十秒。你爬起来,眯着眼打开电脑,看一眼监控大盘,翻几页慢日志,先kill几个失控会话&#xf…

2026/10/5 4:12:20 阅读更多 →
CH340驱动全平台安装与深度兼容性解析

CH340驱动全平台安装与深度兼容性解析

1. 这不是“装个驱动”那么简单:CH340驱动背后的真实战场你手边那块几十块钱的Arduino Nano、ESP32开发板、或者某款国产USB转串口小模块,十有八九用的是CH340芯片。它不像FTDI那样声名显赫,却以极低的成本和足够稳定的性能,默默撑…

2026/10/5 4:12:20 阅读更多 →
STM32电子时钟实战:从RTC校准到OLED驱动的硬核调试

STM32电子时钟实战:从RTC校准到OLED驱动的硬核调试

1. 这不是“又一个电子时钟”,而是STM32入门的实战锚点你搜“STM32电子时钟”,页面刷出来几百个教程——有的用51单片机冒充STM32,有的KEIL工程里连HAL库都没开,有的Proteus仿真图里OLED引脚全接错还标着“已实测”。我带过三届嵌…

2026/10/5 4:11:20 阅读更多 →

最新新闻

两级VSC并网变流器αβ坐标变换与PQ解耦控制仿真实现

两级VSC并网变流器αβ坐标变换与PQ解耦控制仿真实现

做并网变流器的实时功率控制仿真,最怕的不是理论不懂,而是模型搭到一半发现控制环的反馈通道选错了坐标系,或者PI参数怎么调都压不住超调。这次的项目标题虽然写得很学术——“实时无功-有功控制器的动态性能”“带电流控制的两级电压源变流器…

2026/10/5 4:47:39 阅读更多 →
VueUse useArrayFilter:响应式数组过滤的完整实战指南

VueUse useArrayFilter:响应式数组过滤的完整实战指南

前端 【免费下载链接】vueuse Collection of essential Vue Composition Utilities for Vue 3 项目地址: https://gitcode.com/gh_mirrors/vu/vueuse 点击查看 免费下载 导读 useArrayFilter 是 VueUse 核心包中一个轻量而强大的组合式函数,它将原生 A…

2026/10/5 4:47:39 阅读更多 →
从任正非公开信看软件工程:需求、架构与质量的系统化思维

从任正非公开信看软件工程:需求、架构与质量的系统化思维

每年岁末年初,我都有个固定习惯:把任正非的新年公开信翻出来,逐段用荧光笔划一遍。身边同事笑我,说一个写代码的读什么企业公开信。我一般会回一句:你没发现吗,这封信讲的东西,八成都能翻译成软…

2026/10/5 4:47:39 阅读更多 →
C语言实现工业级DMX512发送器:裸机实时控制精要

C语言实现工业级DMX512发送器:裸机实时控制精要

1. 项目概述:为什么一个看似“过时”的协议,至今仍是舞台灯光控制的底层心脏?DMX512——这三个字母组合在舞台工程、影视灯光、建筑媒体立面甚至大型主题公园的控制系统里,不是技术文档里的一个名词,而是一条真实流淌的…

2026/10/5 4:47:39 阅读更多 →
程序是怎样跑起来的?精读第2章:二进制如何支撑整个计算机世界

程序是怎样跑起来的?精读第2章:二进制如何支撑整个计算机世界

很多人学编程是从“hello world”开始的,但真问一句“计算机凭什么认识这些代码”,八成要卡壳。我看了好几本入门书,直到遇到《程序是怎样跑起来的》这本,才把脑子里那些零散概念串成线。这本书第1章讲CPU的工作方式,第…

2026/10/5 4:47:39 阅读更多 →
Python装饰器从入门到精通:原理、实战与避坑指南

Python装饰器从入门到精通:原理、实战与避坑指南

有一段时间我负责一个内部数据平台,某天用户报了个bug:同一个报表任务被重复执行了两次。我沿着调用链查了半天,最后发现问题压根不在业务逻辑里,而是出在一个装饰器上——当时图省事给某个函数加了日志,但日志器上被重…

2026/10/5 4:46:39 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 AI 编程工具,尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手,那你大概率绕不开一个词——plugins。这个词本身不新鲜,从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:23 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 1:10:22 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 3:06:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 20:14:29 阅读更多 →