python动画:实现目标的运动轨迹【paths】

2024-08-26 10:36

本文主要是介绍python动画:实现目标的运动轨迹【paths】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一,介绍

在 Manim 库中,“路径(paths)”指的是一些功能函数,这些函数用于确定在点集之间进行变换时所需的路径。这些函数为动画制作提供了灵活性和表现力,使得物体在场景中的移动表现得更加生动和自然。

具体来说,路径函数能够根据给定的一组点,生成一条连贯的运动轨迹,控制物体在动画中的运动方式。例如,当你想让一个图形从一个位置移动到另一个位置时,简单的线性运动可能显得乏味,而使用路径函数则可以定义更复杂的运动轨迹,比如圆弧、贝塞尔曲线或螺旋形路线等。这种灵活的路径控制不仅可以增强动画的可视化效果,还可以让观众对运动的自然程度感到满意。

在使用路径函数时,用户只需提供起始点和目标点,路径函数会根据要求生成合适的运动路径。这些路径可以用来连接形状、插图或其他对象,使得它们在变换的过程中更具生动性和美感。此外,通过调整路径的参数,用户能够精细控制动画的速度、方向和曲率,从而创造出更加引人入胜的视觉效果。

总之,Manim 中的路径函数是动画制作的关键工具,它们赋予了创作更多的表现手法和艺术性,使得动画能更好地与观众沟通。

二,常见的路径

1.顺时针方向绘制的路径【clockwise_path()】

在 Manim 中,clockwise_path() 是用来生成一个按照顺时针方向绘制的路径的函数。通常,通过这个函数创建的路径可以用于动画,使物体沿着该路径移动。

重要函数参数

  • start: 起始点的坐标,通常是一个 np.array 对象。
  • end: 结束点的坐标,通常也是一个 np.array 对象。
  • radius: 圆弧的半径。
  • num_points: 绘制路径的离散点的数量,也是绘制精度的一个控制参数,默认值可以根据需要调整。

示例代码

以下是一个使用 clockwise_path() 函数的简单示例,演示了如何让一个圆形对象沿着顺时针路径移动:

from manim import *  class ClockwisePathExample(Scene):  def construct(self):  colors = [RED, GREEN, BLUE]  starting_points = VGroup(  *[  Dot(LEFT + pos, color=color)  for pos, color in zip([UP, DOWN, LEFT], colors)  ]  )  finish_points = VGroup(  *[  Dot(RIGHT + pos, color=color)  for pos, color in zip([ORIGIN, UP, DOWN], colors)  ]  )  self.add(starting_points)  self.add(finish_points)  # 使用 VGroup 添加 TracedPath  traced_paths = VGroup(*[  TracedPath(dot.get_center, stroke_color=dot.get_color())  for dot in starting_points  ])  self.add(traced_paths)  self.wait()  self.play(  Transform(  starting_points,  finish_points,  path_func=utils.paths.clockwise_path(),  run_time=2,  )  )  self.wait()

 

2.逆时针运动路径的绘制【counterclockwise_path()

counterclockwise_path() 是 Manim 中用于创建一个逆时针运动路径的函数。它的主要用途是为动画中的对象提供沿着一个确定路径(通常是圆形)的运动轨迹,特别是那些希望对象沿着圆的逆时针方向运动的场景。

用法说明

通常情况下,counterclockwise_path 可以与其他动画结合使用,比如在 MoveAlongPath 动画中,让一个对象沿着这个路径移动。以下是一些相关要点:

  • 创建路径counterclockwise_path 通常不会单独调用,而是会与其他函数结合使用,帮助定义动画对象如何沿着给定路径移动。

  • 返回值: 调用 counterclockwise_path 函数后,它通常会返回一个能表示逆时针运动的路径(如圆弧)对象,通过这些对象可以为运动的方向和轨迹提供清晰的控制。

示例代码

以下是一个简单的示例,展示如何使用 counterclockwise_path() 创建一个逆时针路径,并让一个点沿着这个路径移动:

from manim import *class CounterclockwisePathExample(Scene):def construct(self):colors = [RED, GREEN, BLUE]starting_points = VGroup(*[Dot(LEFT + pos, color=color)for pos, color in zip([UP, DOWN, LEFT], colors)])finish_points = VGroup(*[Dot(RIGHT + pos, color=color)for pos, color in zip([ORIGIN, UP, DOWN], colors)])self.add(starting_points)self.add(finish_points)for dot in starting_points:self.add(TracedPath(dot.get_center, stroke_color=dot.get_color()))self.wait()self.play(Transform(starting_points,finish_points,path_func=utils.paths.counterclockwise_path(),run_time=2,))self.wait()

运行结果:

 3.沿着弧线运动路径的绘制

path_along_arc() 是 Manim 中用于创建沿着弧线路径运动的函数。此函数允许你定义一个特定的弧形路径,通常用于对象的动画效果,使其沿着一个圆弧进行移动。

path_along_arc(arc_angle, axis=array([0., 0., 1.]))

 

函数参数解释

  1. arc_angle:
    • 类型: 数值(以弧度为单位)
    • 描述: 这是所需弧线的角度,决定了路径的长度和形状。例如,如果你设置为 PI / 2,这表示创建一个 90 度的弧形路径,而 PI 表示 180 度(半个圆),TAU 表示一个完整的圆。
  2. axis:
    • 类型: NumPy 数组(默认为 array([0., 0., 1.])
    • 描述: 这是定义弧线平面方向的矢量,指定了弧线在三维空间中的旋转方向。默认值为 [0, 0, 1],这表示弧线平面与 Z 轴平行(即在 XY 平面中)。
    • 其他值示例:
      • array([1., 0., 0.]):表示弧线在 YZ 平面中。
      • array([0., 1., 0.]):表示弧线在 XZ 平面中。

使用示例

以下是一个示例代码,使用 path_along_arc 创建一个沿着弧线运动的点:

 

from manim import *class PathAlongArcExample(Scene):def construct(self):colors = [RED, GREEN, BLUE]starting_points = VGroup(*[Dot(LEFT + pos, color=color)for pos, color in zip([UP, DOWN, LEFT], colors)])finish_points = VGroup(*[Dot(RIGHT + pos, color=color)for pos, color in zip([ORIGIN, UP, DOWN], colors)])self.add(starting_points)self.add(finish_points)for dot in starting_points:self.add(TracedPath(dot.get_center, stroke_color=dot.get_color()))self.wait()self.play(Transform(starting_points,finish_points,path_func=utils.paths.path_along_arc(TAU * 2 / 3),run_time=3,))self.wait()

 我们可以调试弧线的半径和角度。

from manim import *  class PathAlongArcExample(Scene):  def construct(self):  colors = [RED, GREEN, BLUE]  starting_points = VGroup(  *[  Dot(LEFT + pos, color=color)  for pos, color in zip([UP, DOWN, LEFT], colors)  ]  )  finish_points = VGroup(  *[  Dot(RIGHT + pos, color=color)  for pos, color in zip([ORIGIN, UP, DOWN], colors)  ]  )  self.add(starting_points)  self.add(finish_points)  for dot in starting_points:  self.add(TracedPath(dot.get_center, stroke_color=dot.get_color()))  self.wait()  # 自定义弧线的半径和角度  arc_radius = 2  # 半径  arc_angle = TAU / 2  # 90度的弧  # 使用 path_along_arc 创建路径  arc_path = Arc(radius=arc_radius, angle=arc_angle)  # Transform 动画  self.play(  Transform(  starting_points,  finish_points,  path_func=path_along_arc(arc_angle=arc_angle),  run_time=3,  )  )  self.wait()  

代码说明

  1. 弧线的半径: 我们在代码中添加了 arc_radius = 2,这将半径设置为 2。

  2. 弧线的角度: 修改了 arc_angle = TAU / 2,以设置弧线的角度为 90 度(即 TAU / 4 代表 45 度,TAU / 2 代表 90 度)。你可以根据需要进一步调整角度。

  3. 创建弧线路径: 使用 arc_path = Arc(radius=arc_radius, angle=arc_angle) 来定义弧线的路径。然后用 path_func=lambda t: arc_path.point_from_proportion(t) 来指定在动画中使用的路径。

4. 沿着多个圆的路径绘制

path_along_circles() 是 Manim 中用来创建一个沿着多个圆的路径的函数。这使得对象可以沿着多个圆的弧形轨迹移动。

path_along_circles(arc_angle, circles_centers, axis=array([0., 0., 1.]))

函数参数解释

  1. arc_angle:

    • 类型: 数值(以弧度为单位)
    • 描述: 指定沿每个圆的移动角度。这个角度决定了对象在每个圆上的运动路径的范围。例如,如果 arc_angle 设置为 TAU / 4(90度),那么对象将在每个圆上移动90度。
  2. circles_centers:

    • 类型: 列表或数组
    • 描述: 这是一个点的集合,其中每个点代表一个圆的中心。对象将沿着以这些中心为中心的圆移动。这些中心的格式通常是二维或三维坐标数组。例如,[[0, 0, 0], [2, 0, 0], [0, 2, 0]] 表示三个圆心的位置。
  3. axis:

    • 类型: NumPy 数组(默认为 array([0., 0., 1.])
    • 描述: 定义了圆平面的法向量,决定弧线在三维空间中的方向。如果使用默认值 array([0., 0., 1.]),表示圆平面位于 XY 平面上。其他选项可能是 array([1., 0., 0.])(YZ 平面),或者 array([0., 1., 0.])(XZ 平面)。

使用示例

下面是一个使用 path_along_circles 创建沿着多个圆弧路径移动的点的示例代码:

from manim import *class PathAlongCirclesExample(Scene):def construct(self):colors = [RED, GREEN, BLUE]starting_points = VGroup(*[Dot(LEFT + pos, color=color)for pos, color in zip([UP, DOWN, LEFT], colors)])finish_points = VGroup(*[Dot(RIGHT + pos, color=color)for pos, color in zip([ORIGIN, UP, DOWN], colors)])self.add(starting_points)self.add(finish_points)for dot in starting_points:self.add(TracedPath(dot.get_center, stroke_color=dot.get_color()))circle_center = Dot(3 * LEFT)self.add(circle_center)self.wait()self.play(Transform(starting_points,finish_points,path_func=utils.paths.path_along_circles(2 * PI, circle_center.get_center()),run_time=3,))self.wait()

 

5.螺旋运动路径的绘制 

spiral_path() 是 Manim 中用于创建螺旋路径的函数。这个函数生成一个沿着螺旋线移动的路径,使得对象可以在动画中根据提供的参数沿着螺旋轨迹移动。

spiral_path(angle, axis=array([0., 0., 1.]))

函数参数解释

  1. angle:

    • 类型: 数值(以弧度为单位)
    • 描述: 这个参数指定了螺旋的每一圈所包含的角度。通过增大这个角度,你可以控制螺旋的紧密程度和形状。例如,如果你将角度设置为 TAU(一个完整的圆),则每次迭代将生成一个完整的圆;如果设置为 TAU / 2,则将生成半圈的螺旋。
  2. axis:

    • 类型: NumPy 数组(默认为 array([0., 0., 1.])
    • 描述: 该参数定义了螺旋线的方向,决定了其在三维空间中的旋转方向。默认为 [0, 0, 1],这表示螺旋在 XY 平面上;如果更改为 [1, 0, 0],则旋转将在 YZ 平面中;更改为 [0, 1, 0],则螺旋将在 XZ 平面上。

使用示例

下面是一个使用 spiral_path 创建沿着螺旋路径移动的点的示例代码:

from manim import *class SpiralPathExample(Scene):def construct(self):colors = [RED, GREEN, BLUE]starting_points = VGroup(*[Dot(LEFT + pos, color=color)for pos, color in zip([UP, DOWN, LEFT], colors)])finish_points = VGroup(*[Dot(RIGHT + pos, color=color)for pos, color in zip([ORIGIN, UP, DOWN], colors)])self.add(starting_points)self.add(finish_points)for dot in starting_points:self.add(TracedPath(dot.get_center, stroke_color=dot.get_color()))self.wait()self.play(Transform(starting_points,finish_points,path_func=utils.paths.spiral_path(2 * TAU),run_time=5,))self.wait()

 6.直线运动路径的绘制

straight_path() 是 Manim 中用于创建直线路径的函数。这个函数简单明了,主要用于定义一个沿直线移动的路径。通过该函数,可以将对象在动画中沿着一条直线进行移动。

函数概述

straight_path() 不需要任何参数,并返回一个用于移动的直线路径。默认情况下,该函数会生成一条从起始点到目标点的直线。通常,你会在 MoveAlongPath 动画中使用此函数来指定对象的移动路径。

典型用法示例

以下是一个示例,展示了如何使用 straight_path 来让一个点沿直线路径移动:

from manim import *class StraightPathExample(Scene):def construct(self):colors = [RED, GREEN, BLUE]starting_points = VGroup(*[Dot(LEFT + pos, color=color)for pos, color in zip([UP, DOWN, LEFT], colors)])finish_points = VGroup(*[Dot(RIGHT + pos, color=color)for pos, color in zip([ORIGIN, UP, DOWN], colors)])self.add(starting_points)self.add(finish_points)for dot in starting_points:self.add(TracedPath(dot.get_center, stroke_color=dot.get_color()))self.wait()self.play(Transform(starting_points,finish_points,path_func=utils.paths.straight_path(),run_time=2,))self.wait()

三,沿着指定函数绘制路径

实例1:

from manim import *  class CirclePathExample01(Scene):  def construct(self):  # 创建一个点  dot = Dot(radius=0.25,color=BLUE)  # 创建 sin(x) 路径  # 使用 ParametricFunction 来定义 sin(x) 曲线  sin_curve = ParametricFunction(  lambda t: np.array([t, np.sin(t), 0]),  # x = t, y = sin(t)  t_range=[-TAU, TAU],  # 设置 t 的范围  color=WHITE  )  # 创建 TracedPath 来跟踪点的运动  traced_path = TracedPath(dot.get_center, stroke_color=YELLOW)  # 添加点和轨迹到场景中  self.add(traced_path, dot)  # 添加 sin(x) 曲线到场景中  #self.add(sin_curve)  # 使用 MoveAlongPath 将点沿着 sin(x) 曲线移动  self.play(MoveAlongPath(dot, sin_curve), run_time=4)  self.wait()  

代码说明

  1. 定义 sin(x) 曲线: 使用 ParametricFunction 创建 sin(x) 曲线。这里的 lambda t: np.array([t, np.sin(t), 0]) 定义了点在二维平面上的位置,其中 t 表示 x 坐标,np.sin(t) 表示 y 坐标。

  2. 设置参数范围t_range=[-TAU, TAU] 设置了参数 t 的范围,使得点能够在 sin(x) 曲线的完整一周上移动。

  3. 添加曲线到场景: 使用 self.add(sin_curve) 将 sin(x) 曲线添加到场景中。

  4. 沿曲线移动: 使用 MoveAlongPath 让点沿着 sin(x) 曲线移动。

运行代码

运行这个示例代码后,你应该能看到蓝色的点沿着 sin(x) 曲线移动,同时黄色的轨迹会显示出它的运动轨迹。

示例2:

from manim import *  class CirclePathExample02(Scene):  def construct(self):  # 创建一个点  dot = Dot(radius=0.25, color=BLUE)  # 创建 sin(x) 路径  sin_curve = ParametricFunction(  lambda t: np.array([t, np.sin(t), 0]),  # x = t, y = sin(t)  t_range=[-TAU, TAU],  # 设置 t 的范围  color=WHITE  )  # 创建 cos(x) 路径  cos_curve = ParametricFunction(  lambda t: np.array([t, np.cos(t), 0]),  # x = t, y = cos(t)  t_range=[-TAU, TAU],  # 设置 t 的范围  color=GREEN  )  # 创建 arctan(x) 路径  arctan_curve = ParametricFunction(  lambda t: np.array([t, np.arctan(t), 0]),  # x = t, y = arctan(t)  t_range=[-TAU, TAU],  # 设置 t 的范围  color=RED  )  # 创建 TracedPath 来跟踪点的运动  traced_path = TracedPath(dot.get_center, stroke_color=YELLOW)  # 添加点和轨迹到场景中  self.add(traced_path, dot)  # 添加 sin(x)、cos(x) 和 arctan(x) 曲线到场景中  #self.add(sin_curve, cos_curve, arctan_curve)  # 使用 AnimationGroup 同时播放所有路径的移动  self.play(  MoveAlongPath(dot, sin_curve, run_time=4),  MoveAlongPath(dot, cos_curve, run_time=4),  MoveAlongPath(dot, arctan_curve, run_time=4)  )  # 等待一段时间  self.wait()  

代码说明

  1. arctan_curve:

    • 创建了 arctan_curve 作为 arctan(x) 的路径,使用 np.arctan(t) 来定义 y 轴的值。
  2. 添加所有曲线:

    • 将 sin_curvecos_curve 和 arctan_curve 添加到场景中,以便在动画中可见。
  3. 同时播放动画:

    • 使用 AnimationGroup(在这里通过直接在 play 中传递多个 MoveAlongPath 动画)来同时播放点沿 sin(x)cos(x) 和 arctan(x) 曲线的移动。每条路径的动画时间设置为 run_time=4

注意事项

  • 路径的可见性: 确保在场景中添加所有曲线,以便可以同时观察它们。
  • 动画效果: 由于同时移动,点可能在某些时刻重叠。可以根据需要调整动画的 run_time 或者使用不同的动画组合方式。

 

这篇关于python动画:实现目标的运动轨迹【paths】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1108316

相关文章

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

Python实现精确小数计算的完全指南

《Python实现精确小数计算的完全指南》在金融计算、科学实验和工程领域,浮点数精度问题一直是开发者面临的重大挑战,本文将深入解析Python精确小数计算技术体系,感兴趣的小伙伴可以了解一下... 目录引言:小数精度问题的核心挑战一、浮点数精度问题分析1.1 浮点数精度陷阱1.2 浮点数误差来源二、基础解决

使用Python实现Word文档的自动化对比方案

《使用Python实现Word文档的自动化对比方案》我们经常需要比较两个Word文档的版本差异,无论是合同修订、论文修改还是代码文档更新,人工比对不仅效率低下,还容易遗漏关键改动,下面通过一个实际案例... 目录引言一、使用python-docx库解析文档结构二、使用difflib进行差异比对三、高级对比方

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

从入门到精通详解Python虚拟环境完全指南

《从入门到精通详解Python虚拟环境完全指南》Python虚拟环境是一个独立的Python运行环境,它允许你为不同的项目创建隔离的Python环境,下面小编就来和大家详细介绍一下吧... 目录什么是python虚拟环境一、使用venv创建和管理虚拟环境1.1 创建虚拟环境1.2 激活虚拟环境1.3 验证虚

详解python pycharm与cmd中制表符不一样

《详解pythonpycharm与cmd中制表符不一样》本文主要介绍了pythonpycharm与cmd中制表符不一样,这个问题通常是因为PyCharm和命令行(CMD)使用的制表符(tab)的宽... 这个问题通常是因为PyCharm和命令行(CMD)使用的制表符(tab)的宽度不同导致的。在PyChar