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

如何在Manim中实现带褶边线条向垂直轴圆环面的动画过渡?

Manim实现直线到圆环面的无旋转变换方案
  • 核心思路:让带褶边的直线逐步变形为绕垂直轴的圆环面,关键是给每个顶点添加同步的绕Y轴圆周运动,保证所有点角速度一致,避免整体结构旋转。

  • 具体实现步骤:

    1. 编写坐标变换函数:将直线上的每个点按动画进度映射到圆环面的对应位置,保持Y坐标不变,X-Z平面内从直线转为圆周轨迹:
      def point_to_torus(point, t, major_radius=2):
          x, y, z = point
          # 假设原直线沿X轴延伸,替换为你实际直线的最大X坐标
          max_x = 4  
          # 随动画进度t(0→1),逐步将X位置映射为圆周角度
          angle = t * 2 * np.pi * (x / max_x)
          # 计算圆环面上的新X、Z坐标
          new_x = major_radius * np.cos(angle)
          new_z = major_radius * np.sin(angle)
          # 保留原褶边的局部偏移(根据你褶边的方向调整)
          new_point = np.array([new_x, y, new_z]) + (point - np.array([x, y, 0]))
          return new_point
      
    2. 绑定到动画更新:用UpdateFromFunc逐帧更新带褶边直线的所有顶点坐标:
      class LineToTorusScene(Scene):
          def construct(self):
              # 替换为你已创建的带褶边直线对象
              frilled_line = self.create_frilled_line()
              
              def update_mob(mob, alpha):
                  new_points = [point_to_torus(p, alpha) for p in mob.get_points()]
                  mob.set_points(new_points)
              
              # 执行动画,时长可按需调整
              self.play(UpdateFromFunc(frilled_line, update_mob), run_time=3)
      
    3. 确保无整体旋转:所有点的角度计算基于原直线的X轴位置,而非结构整体的旋转量,这样所有点同步弯曲,只会形成圆环面,不会出现整体转动。
  • 优化提示:

    • 先测试无褶边的直线到圆环变换,确认轨迹正确后再叠加褶边偏移,降低调试难度。
    • 调整major_radius可控制圆环面的大小,适配你的动画场景。
    • 若褶边方向不是Z轴,需修改变换函数中局部偏移的计算逻辑,保证褶边始终垂直于圆环的管体方向。

内容的提问来源于stack exchange,提问作者enjin2000

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 13:03:25