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

news2024/11/25 18:52:43

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.coloradmin.cn/o/2061327.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

搭建ELK日志采集与分析系统

SpringCloud微服务实战——企业级开发框架 &#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您…

5.Linux_Shell编程

概述 什么是shell脚本&#xff1a; Shell脚本是利用shell的功能所写的一个程序。这个程序是使用纯文本文件&#xff08;后缀为.sh&#xff09;&#xff0c;将一些shell的语法与命令&#xff08;含外部命令&#xff09;写在里面&#xff0c;搭配正则表达式、管道命令与数据流重…

【QT代码控制Linux开发板】QT控制嵌入式Linux开发板运行shell脚本

一. 前言 最近遇到了一个很冲突的问题&#xff0c;我想让比如qt代码控制传感器读取的数值大于某个阈值时控制板子的灯亮进行报警。 但是当我在Linux开发板上./运行交叉编译后的qt文件时&#xff0c;想运行开发板的其他shell语句必须先退出qt代码的执行&#xff0c;当然开发板…

ios白苹果修复办法有哪些?

在这个数字化时代&#xff0c;iPhone作为智能手机的佼佼者&#xff0c;早已融入了我们生活的方方面面。然而&#xff0c;当那熟悉的开机画面——“白苹果”意外地成为了你的日常&#xff0c;无疑让人头疼不已。别担心&#xff0c;今天我们就来聊聊iOS白苹果现象的成因及几种有效…

Element-ui table进阶使用

最近项目有多个报表开发的需求&#xff0c;我采用的是凤翎前端组件框架&#xff08;基于element-ui开发&#xff09;&#xff0c;大伙可以直接参考element-ui组件库文档&#xff0c;把标签中的fks替换为el即可。下面我会按顺序一一展开细说这些需求&#xff1a; 1、有多级表头…

Java语言程序设计基础篇_编程练习题***16.31(游戏:四子连)

目录 题目&#xff1a;***16.31&#xff08;游戏&#xff1a;四子连&#xff09; 习题思路 代码示例 结果展示 题目&#xff1a;***16.31&#xff08;游戏&#xff1a;四子连&#xff09; 编程练习题8.20让两个玩家在控制台上可以玩四子连的游戏。为这个程序重写一个GUI版本…

Open3D mesh 模型锐化

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 输入参数 输出参数 2.2完整代码 三、实现效果 3.1原始mesh 3.2处理后mesh 3.3数据显示 Open3D点云算法汇总及实战案例汇总的目录地址&#xff1a; Open3D点云算法与点云深度学习案例汇总…

反射异常捕获 | InvocationTargetException 要用e.getCause()打印才能看到具体异常

背景&#xff1a;线上某段和反射相关的代码报错了&#xff0c;但是异常信息打印只看到了 InvocationTargetException&#xff0c;没打印具体的异常。就像这样&#xff1a;java.lang.reflect.InvocationTargetException: null 查阅资料后发现要用e.getCause()才能打印具体异常&a…

[数据集][目标检测]航拍屋顶检测数据集VOC+YOLO格式458张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;458 标注数量(xml文件个数)&#xff1a;458 标注数量(txt文件个数)&#xff1a;458 标注类别…

深度剖析数字媒体产业链的无限潜力与创新生态

在当今信息爆炸的时代&#xff0c;数字媒体产业链正以势不可挡的姿态展现出其令人瞩目的无限潜力与创新生态。 数字媒体的发展潜力简直无可限量。从在线视频的爆发式增长&#xff0c;到虚拟现实和增强现实技术带来的沉浸式体验&#xff0c;再到社交媒体平台上丰富多彩的内容创…

抽象类与抽象函数+接口

抽象类与抽象函数 什么是抽象方法 抽象方法是没有实现代码的虚方法 抽象方法使用abstract修饰符进行声明&#xff0c;只能在同样声明了abstract的类中使用。 继承了抽象类的子类必须实现抽象类的所有抽象方法。 什么是抽象类 用abstract修饰过的类是抽象类 抽象类无法被…

《机器学习》 决策树 ID3算法

一、什么是决策树&#xff1f; 1、概念 决策树是机器学习中一种常见的分类和回归算法。它基于树状结构的模型&#xff0c;通过对数据进行逐步划分&#xff0c;最终生成一棵决策树来进行预测或分类任务。 在决策树中&#xff0c;每个节点代表一个特征或属性&#xff0c;每个分支…

数据库:数据更新和视图

1 实验目的 &#xff08;1&#xff09;掌握SQL语言的数据更新功能&#xff1a; update 语句用于对表进行更新 delete 语句用于对表进行删除 insert 语句用于对表进行插入 &#xff08;2&#xff09;掌握对视图的操作&#xff1a; 视图的定义 视图的更新 基于视图的查询 …

總結熱力學_4(完了)

參考: 陈曦<<热力学讲义>>http://ithatron.phys.tsinghua.edu.cn/downloads/thermodynamics.pdf 7 最大功定理 考虑一个与外界隔绝的由几个彼此不处于热平衡、但相互绝热的物体组成的系统。另外还需要一个重物,它不参与热力学过程,但是可以以重力势能的 方式存…

js vscode 关于对象数组的一个bug

数据结构&#xff1a; let address [{label: "北京市",children: []},{label: "天津市",children: []},{label: "上海市",children: []},{label: "重庆市",children: []},{label: "河北省",children: [{label: "石家…

Flink 同步 MySQL 到 Doris

一、前言 使用Apache Flink实现数据同步的ETL&#xff08;抽取、转换、加载&#xff09;过程通常涉及从源系统&#xff08;如数据库、消息队列或文件&#xff09;中抽取数据&#xff0c;进行必要的转换&#xff0c;然后将数据加载到目标系统&#xff08;如另一个数据库…

Spring自动注册-Bean的加载

Spring在进行完xml文件标签解析后,我们如何获取对应的Bean? 核心方法: getBean() Spring三级缓存&循环依赖: 由于单例在Spring容器中只会被创建一次&#xff0c;即&#xff1a;创建出来的单例实例对象就会被缓存到singletonObjects(一级缓存)中。所以&#xff0c;当要获得…

Nginx高级部分

一、web服务基础介绍 Web 服务基础介绍 正常情况下的单次web服务访问流程&#xff1a; Apache 经典的 Web 服务端 Apache起初由美国的伊利诺伊大学香槟分校的国家超级计算机应用中心开发 目前经历了两大版本分别是1.X和2.X 其可以通过编译安装实现特定的功能 1.Apache pr…

<数据集>航拍牧场牛羊识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;1021张 标注数量(xml文件个数)&#xff1a;1021 标注数量(txt文件个数)&#xff1a;1021 标注类别数&#xff1a;3 标注类别名称&#xff1a;[cattle, cow, sheep] 序号类别名称图片数框数1cattle29741282cow6740…

网络安全漏洞防护技术原理与应用

网络安全漏洞概述 概念 定义&#xff1a;又称脆弱性&#xff0c;简称漏洞。一般是致使网络信息系统安全策略相冲突的缺陷&#xff08;安全隐患&#xff09; 影响&#xff1a;机密性受损、完整性破坏、可用性降低、抗抵赖性缺失、可控制性下降、真实性不保等 范围&#xff…