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.rhkb.cn/news/405907.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cobalt Strike 4.8 用户指南-第二节-用户界面

2.1、概述 Cobalt Strike用户界面分为两部分。界面顶部显示会话或目标的可视化。界面底部显示与你交互的每个 Cobalt Strike 功能或会话的选项卡。可以单击这两个部分之间的区域并根据自己的喜好调整它们的大小。 # 2.2、工具栏 顶部的工具栏提供对常见 Cobalt Strike功能的快…

Day23 第十站 文件IO的多路复用

#include <myhead.h>void insert_client(int *client_arr,int *len,int client) {//client_arr[n]{3,4} len&client_count,client_count2;//添加 5 client_arr[2(*len)]5(client)client_arr[*len]client;(*len); } int find_client(int *client_arr,int len,int clie…

【Python开发实践】在线商城系统——需求及需求分析

项目背景及需求 这个练习项目的设置背景是一家图书销售公司&#xff0c;为了扩大销售渠道&#xff0c;想要开通网上商城&#xff0c;利用在线博客和电子商城来销售图书。 具体需求如下&#xff1a; 每个商品可以留言 实现在线购物车处理和订单处理 实现对产品、购物车和订单的…

python依赖包安装失败的解决办法(适用于conda安装)

版权声明&#xff1a;本文为博主原创文章&#xff0c;如需转载请贴上原博文链接&#xff1a;python依赖包安装失败的解决办法&#xff08;适用于conda安装&#xff09;-CSDN博客 前言&#xff1a;这个问题之前一直困扰着我&#xff0c;因为最近要升级Anaconda-Navigator&#x…

haproxy实验

基本介绍 http://t.csdnimg.cn/Z64QVhttp://t.csdnimg.cn/Z64QV 实验环境 功能IP客户端172.25.254.233haproxy eth0:172.25.254.100 eth1:192.168.0.10 rs1eth0:192.168.0.101rs2eth0:192.168.0.102 安装haproxy yum install haproxy -y 多进程和多线程 vim /etc/hap…

基于Conda的Python版本管理与Python包管理

文章目录 前言Conda是什么Conda与Anaconda安装Anaconda安装包windows v2024.06-1安装包更多版本安装包(Windows/Mac/Linux) 安装添加环境变量安装过程中遇到的问题 使用步骤创建Python环境激活Python环境安装Python包列出和切换 Python 版本管理多个环境 总结 前言 开发环境中…

力扣 1425带限制的子序列和

这是一道 动态规划加单调队列的题&#xff0c;重点加强单调队列知识的学习 回归本题&#xff0c;这个题中&#xff0c;动态规划的部分略去&#xff0c;状态转移方程可求 单调队列部分 1维护队头 if(i-sta.front() k) sta.pop_front(); 2维护队尾 while(!sta.empty() &…

[C#]基于winform结合photocartoon算法实现人物卡通化源码实现

【官方框架】 https://github.com/minivision-ai/photo2cartoon 简介 人像卡通风格渲染的目标是&#xff0c;在保持原图像ID信息和纹理细节的同时&#xff0c;将真实照片转换为卡通风格的非真实感图像。我们的思路是&#xff0c;从大量照片/卡通数据中习得照片到卡通画的映射…

2024年思维导图工具怎样可以轻松选择

思维导图&#xff0c;作为一种直观、有效的思维工具&#xff0c;凭借其强大的信息整理能力和创意激发潜力&#xff0c;逐渐成为了人们学习、工作和生活中不可或缺的一部分。今天&#xff0c;就让我们一起走进这个充满智慧的领域&#xff0c;探索那些2024年大家都在使用的思维导…

Mac安装Typora

文章目录 介绍软件功能下载安装1.下载完成后打开downloads 双击进行安装2.将软件拖到应用程序中3.在程序坞中搜索打开4.提示安全问题就打开通用&#xff0c;安全隐私与设置5.打开成功 小结 介绍 Typora for mac 是一款简洁的轻量级的markdown编辑器、写作软件。它去除了预览窗…

C++求职LinuxWebServer面试篇(项目介绍)

⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨‍🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗! 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三连支持一下呗。👍⭐️❤️ Qt5.9专栏定期更新Qt的一些项目Demo 项目与…

Tomcat性能调优

Tomcat性能调优 Tomcat9参数配置&#xff1a;Apache Tomcat 9 Configuration Reference (9.0.93) - The HTTP Connector 2.1 如何监控Tomcat的性能 Tomcat 的关键指标 Tomcat 的关键指标有吞吐量、响应时间、错误数、线程池、CPU 以及 JVM 内存。前三个指标是我们最关心的业…

JVM指令重排序

文章目录 什么是指令重排序编译器优化JIT 编译优化处理器优化重排序数据依赖性 硬件层的内存屏障指令重排的代码验证好处减少管道阻塞提高缓存利用率利用并行执行单元性能提升更好地利用硬件资源 问题内存可见性问题编程复杂性增加调试困难 解决方案&#xff1a;Java内存模型&a…

Pinia

搭建pinia环境 1.引入依赖 npm i pinia 2.在main.ts中引入pinia 准备一个基本的效果 <template><h2>测试一下pinia</h2><br><span>当前求和为&#xff1a;{{ sum }}</span><br><select v-model.number"n"><o…

2 kubeflow系统架构 学习笔记

1 Kubeflow生态系统 2 生态系统说明 2.1. Hardware&#xff08;硬件层&#xff09; 提供计算资源的底层硬件支持。GPU&#xff08;如NVIDIA&#xff09;通常用于加速机器学习和深度学习的计算任务&#xff0c;而Intel和AMD则可能提供CPU计算资源。 2.2. Infrastructure&…

[OC]萝卜圈玩行车记录仪

图1-1&#xff0c;你的手动小车 代码是 #机器人驱动主程序 #请在main中编写您自己的机器人驱动代码 import tkinter as tk import turtle v0 # 速度 accFalse;slowFalse;leftFalse;rightFalse # 按键状态 step0.5 # 一次速度变化量 def keyup_press(event):global acc;accTru…

「数组」希尔排序 / 区间增量优化(C++)

目录 概述 思路 核心概念&#xff1a;增量d 算法过程 流程 Code 优化方案 区间增量优化 Code(pro) 复杂度 概述 我们在「数组」冒泡排序|选择排序|插入排序 / 及优化方案&#xff08;C&#xff09;中讲解了插入排序。 它有这么两个特点&#xff1a; ①待排序元素较…

[Qt][Qt 文件]详细讲解

目录 1.输入输出设备类2.文件读写类3.文件和目录信息类 1.输入输出设备类 在Qt中&#xff0c;⽂件读写的类为QFile&#xff0c;其⽗类为QFileDevice QFileDevice提供了⽂件交互操作的底层功能QFileDevice的⽗类是QIODevice&#xff0c;其⽗类为QObject QIODevice是Qt中所有I/O…

【企业高性能web服务器】

目录 一、Nginx 介绍1、 Nginx 功能介绍2、基础特性3、Nginx 模块介绍 二、Nginx 编译安装1、编写systemd服务 三、平滑升级和回滚1、平滑升级的流程2、升级2、回滚 四、 Nginx 核心配置详解1、实现 nginx 的高并发配置2、Nginx 账户认证功能3、nginx作为下载服务器配置 五、re…

QT-监测文件内容重复工具)

QT-监测文件内容重复工具 一、演示效果二、核心代码三、下载链接 一、演示效果 二、核心代码 #include "widget.h" #include "ui_widget.h" #include <QDir> #include <QFile> #include <QCryptographicHash> #include <QApplicatio…