当前位置: 首页 > news >正文

Manim动画:相机的移动(MovingCameraScene)

1.相机的移动(MovingCameraScene)

MovingCameraScene 是 Manim 中的一个类,用于创建可以移动的相机场景。这个类继承自 Scene,并提供了关于相机移动的额外功能。

MovingCameraScene(camera_class=<class 'manim.camera.moving_camera.MovingCamera'>,
**kwargs)

参数解释:

  • camera_class: 这是一个类,指定相机的类型。MovingCamera 是 Manim 中的一个类,允许相机在场景中平移和旋转。
  • **kwargs: 这是一个可变参数,可以传递给基类 Scene 的构造函数,允许用户自定义其他一些场景参数。

以下是一个使用 MovingCameraScene 的基本示例,包括实例化并使用相机移动的简单代码,注释解释了每一部分的功能。

from manim import *  class MyMovingCameraScene(MovingCameraScene):  def construct(self):  # 创建一个场景中的文本  text = Text("Hello, Manim!").shift(2*DOWN)  # 将文本添加到场景中  self.add(text)  # 确保相机开始时聚焦于文本  self.camera.frame.save_state()  # 移动相机并进行动画  self.play(self.camera.frame.animate.move_to([0,0,0]))  # 添加一些额外元素来显示相机移动效果  square = Square(color=BLUE).move_to([-4,2,0]) self.add(square)  # 将相机视图移动到新位置  self.play(self.camera.frame.animate.move_to([2,2,0]))  # 恢复相机到初始位置  self.play(self.camera.frame.animate.restore())  

 实例2;放大相机

class ChangingCameraWidthAndRestore(MovingCameraScene):  def construct(self):  text = Text("Hello World").set_color(BLUE)  text01 = Text("setep1").set_color(BLUE).shift(2 * UP)  # 添加文本到场景中  self.add(text01)  # 只添加 text01,不改变它的状态  self.add(text)    # 添加并保持 text  # 保存相机的状态  self.camera.frame.save_state()  # 放大 text 的视图,改变相机宽度  self.play(self.camera.frame.animate.set(width=text.width * 2))  self.wait(0.3)  # 恢复相机的状态  self.play(Restore(self.camera.frame))  self.wait(0.3)  # 再次改变相机宽度,但保持 text01 的大小不变  self.play(self.camera.frame.animate.set(width=text.width * 0.5))  self.wait(0.3)  # 最后恢复到初始状态  self.play(Restore(self.camera.frame))

运行结果都会发生的事情就是,场面放什么,他都一起放大和移动。

实例3:移动相机

from manim import *class MovingCameraCenter(MovingCameraScene):def construct(self):s = Square(color=RED, fill_opacity=0.5).move_to(2 * LEFT)t = Triangle(color=GREEN, fill_opacity=0.5).move_to(2 * RIGHT)self.wait(0.3)self.add(s, t)self.play(self.camera.frame.animate.move_to(s))self.wait(0.3)self.play(self.camera.frame.animate.move_to(t))

 实例4:先放大,再移动。

from manim import *class MovingAndZoomingCamera(MovingCameraScene):def construct(self):s = Square(color=BLUE, fill_opacity=0.5).move_to(2 * LEFT)t = Triangle(color=YELLOW, fill_opacity=0.5).move_to(2 * RIGHT)self.add(s, t)self.play(self.camera.frame.animate.move_to(s).set(width=s.width*2))self.wait(0.3)self.play(self.camera.frame.animate.move_to(t).set(width=t.width*2))self.play(self.camera.frame.animate.move_to(ORIGIN).set(width=14))

实例5:

from manim import *class MovingCameraOnGraph(MovingCameraScene):def construct(self):self.camera.frame.save_state()ax = Axes(x_range=[-1, 10], y_range=[-1, 10])graph = ax.plot(lambda x: np.sin(x), color=WHITE, x_range=[0, 3 * PI])dot_1 = Dot(ax.i2gp(graph.t_min, graph))dot_2 = Dot(ax.i2gp(graph.t_max, graph))self.add(ax, graph, dot_1, dot_2)self.play(self.camera.frame.animate.scale(0.5).move_to(dot_1))self.play(self.camera.frame.animate.move_to(dot_2))self.play(Restore(self.camera.frame))self.wait()

 2.获取在特定动画过程中移动的物体

get_moving_mobjects(*animations) 是 Manim 中的一个辅助函数,主要用于获取在特定动画过程中移动的物体。它会分析传入的动画对象,并返回这些动画中涉及的移动物体的列表。

参数解释:

  • *animations: 这是一个可变参数,允许传入多个动画对象。函数将逐个检查这些动画,确定哪些物体因这些动画而发生了位置变化。

代码示例:

下面是一个示例代码,展示了如何使用 get_moving_mobjects 函数。注释部分解释了每个步骤的功能。

from manim import *  class MovingObjectsExample(Scene):  def construct(self):  # 创建两个文本对象  text1 = Text("Moving Text 1",color=RED).shift(LEFT * 3+UP)  text2 = Text("Moving Text 2",color=BLUE).shift(RIGHT * 3+DOWN)  # 将对象添加到场景中  self.add(text1, text2)  # 定义动画,将第一个文本向右移动,将第3个文本向左移动  animation1 = text1.animate.shift(RIGHT * 3)  animation2 = text2.animate.shift(LEFT * 3)  # 获取所有移动的物体  moving_objects = self.get_moving_mobjects(animation1, animation2)  # 播放动画  self.play(animation1, animation2) def get_moving_mobjects(self, *animations):  # 使用 get_moving_mobjects 函数来获取在动画过程中移动的物体 return super().get_moving_mobjects(*animations)  

想看详细的视频,可以在资源里面自行下载观看ChangingCameraWidthAndRestore.zip。

 


http://www.mrgr.cn/news/3702.html

相关文章:

  • C语言 | Leetcode C语言题解之第354题俄罗斯套娃信封问题
  • Apache CloudStack Official Document 翻译节选(七)
  • HTML静态网页成品作业(HTML+CSS)——自行车介绍网页设计制作(1个页面)
  • PostgreSQL案例:planning time超长问题分析
  • MiDaS、ZoeDepth、Depth-Anything ai算法深度图估计
  • 方便办公—文件整理
  • 数据库运维实操优质文章分享(含Oracle、MySQL等) | 2024年7月刊
  • 算法4:前缀和(下)
  • Unity(2022.3.38LTS) - 性能分析器
  • “面试宝典:高频算法题目详解与总结”
  • Python核心编程--Python要点总结
  • 【附源码】Python :PYQT界面点击按钮随机变色
  • Linux ---- 硬链接和软链接
  • Python爬虫——简单网页抓取(实战案例)小白篇
  • GIT企业开发使用介绍
  • 【大模型部署及其应用 】RAG检索技术和生成模型的应用程序架构:RAG 使用 Meta AI 的 Llama 3
  • 高效分页策略:掌握 LIMIT 语句的正确使用方法与最佳实践
  • python 可迭代对象,迭代器,生成器,装饰器
  • [Matsim]Matsim学习笔记-drt场景中车辆调度的学习
  • 什么是制造业项目管理软件?适合制造企业的项目管理软件具备哪些特征