当前位置: 首页 > 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。

 

相关文章:

  • 马走日-深度优先搜索
  • Java MessagePack序列化工具(适配Unity)
  • 动态规划(一)
  • 如何优化 Vite 项目中的 Lodash 引入:从 Tree Shaking 到自动化测试
  • Linux权限管理
  • kvm压缩虚拟机磁盘
  • 了解Android
  • DVWA综合靶场漏洞讲解
  • python 异常处理
  • 在Windows11强制开启copilot
  • 独立站PrestaShop安装
  • 获取当前路由器的外网IP(WAN IP)
  • 电脑硬盘坏了怎么恢复数据?
  • 蓝桥杯2021第十二届蓝桥杯青少年组省赛试题真题
  • Vue3重置reactive变量造成循环引用导致JSON.stringify语法报错
  • python之matplotlib (1 介绍及基本用法)
  • vin查询汽车品牌-vin查询汽车品牌接口-车辆信息查询接口
  • ubuntu中python 改为默认使用python3,pip改为默认使用pip3
  • 【个人学习】JVM(7):方法区概述、方法区内部结构、垃圾回收等
  • 什么是光伏电站气象站——气象监测
  • 铲屎官花5万带猫狗旅行,宠旅生意有多赚?
  • 中华人民共和国和俄罗斯联邦关于全球战略稳定的联合声明
  • 抗战回望21︱《“良民”日记》:一个“良民”在沦陷区的见闻与感受
  • 多个“网约摩托车”平台上线,工人日报:安全与监管不能掉队
  • 巴基斯坦军方:印度导弹袭击已造成至少3人死亡
  • 中东睿评|胡塞武装已成为楔入中东各方力量之间的钉子户