首页 > 其他分享 >Manim教程:第二章 输出界面的基本设置

Manim教程:第二章 输出界面的基本设置

时间:2024-10-21 20:17:42浏览次数:3  
标签:动画 教程 场景 颜色 color self camera 第二章 Manim

2.1 页面的外观设计

        在 Manim 中,图形的视觉表现和动画的美观性往往与背景颜色密切相关。用户可以轻松改变场景的背景颜色,这为动画赋予了更多的视觉特性和情感色彩。背景颜色的设置通常是动画创作的重要第一步,因为它可以影响观众的情绪和对内容的接受。比如,一个明亮的背景可能会传达活力和乐观,而深色调的背景则可能会让观众感受到宁静或严肃。

2.1.1 页面的颜色设计

使用 

self.camera.background_color 

属性,用户可以轻松改变场景的背景颜色,这为动画赋予了更多的视觉特性和情感色彩。

from manim import *  

class BackgroundColorExample(Scene):  
    def construct(self):  
        # 设置摄像机的背景颜色  
        self.camera.background_color = BLUE_E  

        # 创建一个矩形  
        rectangle = Rectangle(width=4, height=2, color=WHITE, fill_opacity=1)  
        rectangle.set_fill(BLUE_D)  # 设置矩形的填充颜色为深蓝色  

        # 创建文本  
        text = Text("Hello, Manim!", color=WHITE).move_to(rectangle.get_center())  

        # 在场景中添加矩形和文字  
        self.add(rectangle, text)  

        # 添加一个等待时间以便观看结果  
        self.wait(2)  

        通过调整背景颜色,用户可以根据自己的需求和主题进行个性化设计。例如,在展示动态数学图形时,使用浅色背景可以使图形更加突出,而在呈现理论讨论时,使用温暖的颜色则可能让内容更加引人入胜。此外,背景色的选择也与字体颜色、图形颜色等其他元素相辅相成。合适的配色方案能够使得整体效果更具层次感,使得观众的注意力更集中于重要的内容上。

        除了设置背景颜色外,对相机的其他属性进行调整也是增强视觉效果的有效手段。例如,修改相机的尺寸和视角,可以帮助观众更好地理解复杂的图形和动画。通过控制相机的视野,创作者能够精确地引导观众的视觉焦点,从而传达更深层的意图。

在 Manim 中,self.camera.background_color 支持多种颜色格式,包括预定义的颜色、RGB、HEX、以及其他常用颜色表示法。以下是几种常用的颜色表达式示例:

  1. 预定义颜色

    • WHITE: 纯白色。
    • BLACK: 纯黑色。
    • BLUE: 纯蓝色。
    • RED: 纯红色。
    • GREEN: 纯绿色。
  2. 使用 RGB 值
    通过 RGB 形式定义颜色,取值范围为 0 到 1。

    • self.camera.background_color = [0.1, 0.2, 0.5] # 一种深蓝色
    • self.camera.background_color = [1, 0.5, 0] # 橙色
  3. 使用十六进制颜色代码
    也可以使用 HEX 代码定义颜色,但在 Manim 中需要将其转换为 RGB 格式,通常可以使用 HexToRGB 函数。

    • self.camera.background_color = '#FF5733' # 橙红色
  4. 浮点颜色值
    使用浮点数来表示颜色,可以在范围从 0 到 1 之间选择颜色的深浅。

    • self.camera.background_color = Color(0.2, 0.4, 0.7) # 使用 Color 类创建的颜色
示例代码

下面是一个简单的示例,展示了如何在 Manim 中使用这些颜色:

from manim import *  

class ColorExample(Scene):  
    def construct(self):  
        # 使用预定义颜色  
        self.camera.background_color = BLUE  

        # 创建一个矩形  
        rectangle = Rectangle(width=3, height=2, fill_color=WHITE, fill_opacity=1)  
        self.add(rectangle)  
        self.wait(1)  

        # 改变背景颜色为 RGB  
        self.camera.background_color = [0.1, 0.5, 0.3]  # 深绿色  
        self.wait(1)  

        # 改变背景颜色为 HEX  
        self.camera.background_color = '#FF5733'  # 橙红色  
        self.wait(1)  

        # 改变背景颜色为使用浮点数的颜色  
        self.camera.background_color = Color(0.2, 0.4, 0.6)  
        self.wait(2)  

2.1.2页面的轮廓设计

        在 Manim 中,场景的页面轮廓或相机的可视区域是影响动画展示和观众体验的关键因素。通过调整 self.camera.frame_height 和 self.camera.frame_width 属性,用户可以灵活地定义相机的视野范围,从而实现更具表现力的动画效果。这种调整不仅能提升作品的视觉美感,还能够使观众更好地聚焦于关键内容。

self.camera.frame_width = 10  
self.camera.frame_height = 5

        当相机的视野宽度和高度被设置为特定的值时,相机将仅显示该区域内的对象。这对于需要强调特定元素或细节的动画特别有用。例如,在展示复杂的数学图形时,可以将相机聚焦在特定区域,使观众能够清楚地看到变化和动态过程。此外,如果场景包含多个元素,通过调整可视区域的大小和形状,创作者可以轻松优化画面构图,防止杂乱无章。

        另一个值得注意的方面是,合理的页面轮廓设置有助于不同设备和平台的适配。无论是在大屏幕上展示还是在小屏幕设备上播放,调整相机的可视区域都能确保作品在各类设备中都保持良好的显示效果。

        以下是一个简单的示例代码,演示如何在 Manim 中设置相机的边框和可视区域:

from manim import *  

class CameraFrameExample(Scene):  
    def construct(self):  
        # 设置相机的可视区域  
        self.camera.frame_width = 6  # 设置相机的宽度为 6  
        self.camera.frame_height = 4  # 设置相机的高度为 4  

        # 创建一个矩形  
        rectangle = Rectangle(width=4, height=2, color=BLUE, fill_opacity=0.5)  
        self.add(rectangle)  

        # 添加文本  
        text = Text("这是一个矩形", color=WHITE).next_to(rectangle, UP)  
        self.add(text)  

        # 等待以便观众可以看到结果  
        self.wait(2)  

# 使用以下命令运行:  
# manim -pql your_script.py CameraFrameExample

         在这个示例中,我们通过设置相机的frame_widthframe_height来定义可视区域,同时创建了一个矩形和对应的文本。观众可以清晰地看到设置的结果,并体会到相机框架对于动画表现的重要性。

2.2 输出质量控制

        我们在运行代码的时候需要一行代码来展示代码的运行结果,执行命令时

%manim -qm -v WARNING MobjectExample 

         它指定要渲染的场景。现在不需要了。当一个文件只包含一个场景类时,它只会渲染场景类。当一个文件包含多个场景类时,manim会让你选择一个场景类。如果你的文件包含多个场景类,并且你想要渲染它们,你可以使用-a标志。

        如前所述,-ql指定低渲染质量(854x480 15FPS)。这看起来不是很好,但对于快速原型和测试非常有用。指定渲染质量的其他选项分别是-qm, -qh, -qp和-qk,用于中等(1280x720 30FPS),高(1920x1080 60FPS), 2k (2560x1440 60FPS)和4k (3840x2160 60FPS)。

这些在不同渲染质量下运行的结果,分别是-qm, -qh, -qp和-qk:

         -p标志在渲染动画后播放动画。如果您希望在动画的位置打开文件浏览器,而不是播放它,您可以使用-f标志。您也可以省略这两个标志。
        最后,默认情况下,manim将输出.mp4文件。如果你想用。gif格式的动画,使用

--format gif

标志。输出文件将位于与.mp4文件相同的文件夹中,并且具有相同的名称,但文件扩展名不同。
这是对一些最常见的命令行标志的快速回顾。

示例:
from manim import *  

# 自定义计数动画类  
class Count(Animation):  
    def __init__(self, number: DecimalNumber, start: float, end: float, **kwargs) -> None:  
        # 将 number 作为动画的 mobject 传入  
        super().__init__(number, **kwargs)  
        # 设置起始值和结束值  
        self.start = start  
        self.end = end  

    def interpolate_mobject(self, alpha: float) -> None:  
        # 根据 alpha 设置 DecimalNumber 的值  
        value = self.start + (alpha * (self.end - self.start))  
        self.mobject.set_value(value)  # 更新 mobject 的值  


# 创建一个计数场景  
class CountingScene(Scene):  
    def construct(self):  
        # 创建 DecimalNumber 对象并将其添加到场景中  
        number = DecimalNumber().set_color(WHITE).scale(5)  # 设置颜色为白色,缩放为 5 倍  
        # 添加一个 updater,使 DecimalNumber 在值变化时保持居中  
        number.add_updater(lambda number: number.move_to(ORIGIN))  

        self.add(number)  # 将数字添加到场景中  

        self.wait()  # 等待一段时间,以便观众可以看到初始状态  

        # 播放 Count 动画,从 0 计数到 100,持续 4 秒  
        self.play(Count(number, 0, 100), run_time=4, rate_func=linear)  

        self.wait()  # 再次等待,方便观众看到最终结果  


# 在命令行中运行以下命令以生成 GIF:  
# %manim --format gif -v WARNING CountingScene

运行结果:

2.3 基本输出功能

        manim为您提供了三个不同的概念,您可以将它们编排在一起以生成数学动画:数学对象(或简称为对象)、动画场景。正如我们将在下面的章节中看到的,这三个概念中的每一个都是作为一个单独的类实现的:对象动画场景类

2.3.1对象

        对象是所有动画的基本构建块。从Mobject派生的每个类都表示一个可以显示在屏幕上的对象。例如,圆形、箭头和矩形等简单形状都是对象。更复杂的结构,如axis、FunctionGraph或BarChart也是对象。
        如果您尝试在屏幕上显示Mobject的实例,您将只看到一个空帧。原因是,Mobject类是所有其他对象的抽象基类,也就是说,它没有任何预先确定的可以在界面上显示的视觉形状。

2.3.2动画

        动画片的核心是动画。通常,您可以通过调用  play()方法向场景添加动画。

from manim import *  

# 创建一些动画的场景  
class SomeAnimations(Scene):  
    def construct(self):  
        # 创建一个正方形  
        square = Square()  

        # 一些动画显示 mobject  
        self.play(FadeIn(square))  # 渐显正方形  

        # ... 进行移动或旋转等操作 ...  
        self.play(Rotate(square, PI/4))  # 将正方形顺时针旋转 π/4 弧度  

        # 一些动画从屏幕上移除 mobject  
        self.play(FadeOut(square))  # 渐隐正方形  

        self.wait(1)  # 等待 1 秒,以便观众看到最后的效果

         简单地说,动画就是在两个对象之间进行插值的过程。例如,从一个完全透明的版本开始,以一个完全不透明的版本结束,通过逐渐增加不透明度在它们之间进行插值。淡出以相反的方式工作:它从完全不透明插入到完全透明。作为另一个例子,Rotate从作为参数传递给它的对象开始,并以相同的对象结束,但旋转了一定的量,这一次插值对象的角度而不是其不透明度。

2.3.3场景

        场景类在manim中非常重要的。每个对象都必须添加到场景中才能显示,或者从场景中移除以停止显示。每个动画都必须由场景播放,并且每个没有动画发生的时间间隔都由调用  wait()确定。视频的所有代码必须包含在派生自Scene的类的construct()方法中。最后,如果要同时渲染多个场景,单个文件可能包含多个场景子类。

标签:动画,教程,场景,颜色,color,self,camera,第二章,Manim
From: https://blog.csdn.net/qq_45449625/article/details/143100711

相关文章

  • Altium Designer 入门基础教程(一)
     有将近一个半月没有更新过博客了,最近在整理AltiumDesigner 入门基础教程,希望喜欢本系列教程的小伙伴可以点点关注和订阅!下面我们开始进入AltiumDesigner课程的介绍。一、AltiumDesigner快捷键1.原理图快捷键: 2.PCB快捷键:  3.自定义快捷键(原理图、......
  • 《微分几何讲义(陈省身)》读书笔记 第二章 多重线性代数
    第二章多重线性代数Note:本文默认了基本的向量空间和矩阵的相关知识。本文中所有的向量空间默认是有限维的,且定义在一个域\(\mathbb{F}\)上。本文采用Einstein求和约定。§1张量积[Def1.1]对于向量空间\(V_1,\cdots,V_r\)和\(Z\),若映射\(f:V_1\times\cdots\timesV......
  • 星海智算:【镜像教程】MimicBrush:神奇画刷,一键搞定局部重绘!
    [MimicBrush 镜像教程 ]—— 欢迎使用星海智算——MimicBrush✦ 模型介绍 MimicBrush是由阿里巴巴、香港大学和蚂蚁集团联合研发的创新AI图像编辑工具。它允许用户通过简单操作,精准替换图片局部,轻松实现高质量的艺术修图。其特色功能包括先进的图像识别技术、自......
  • Python之Matplotlib的基本使用教程
    1.安装pipinstallmatplotlib-ihttps://pypi.tuna.tsinghua.edu.cn/simple#在终端输入2.基本配置frommatplotlibimportpyplotasplt#让图片可以显示中文plt.rcParams['font.sans-serif']='SimHei'#让图片可以显示负号plt.rcParams['axes.unicode_minus'......
  • 通义灵码实践教程——单元测试
    通义灵码加持的单元测试实践本文首先讲述了什么是单元测试、单元测试的价值、一个好的单元测试所具备的原则,进而引入如何去编写一个好的单元测试,通义灵码是如何快速生成单元测试的。什么是单元测试?单元测试是一种软件测试方法,通过编写代码来验证应用程序中最小的可测试单元(如单......
  • 黑客入门教程(非常详细)从零基础入门到精通,看完这一篇就够了
       这篇文章没有什么套路。就是一套自学理论和方向,具体的需要配合网络黑白去学习。毕竟是有网络才会有黑白!有自学也有培训!1.打死也不要相信什么分分钟钟教你成为大黑阔的,各种包教包会的教程,就算打不死也不要去购买那些所谓的盗号软件之类的东西。2,我之前让你们在没有目......
  • Arc浏览器打包扩展程序教程
    如何分享已安装的Chrome插件并进行离线安装如果你想将自己已安装的Chrome插件分享给朋友,进行离线安装,可以按照以下步骤操作:步骤1:进入扩展程序管理页面打开Chrome浏览器,在地址栏中输入arc://extensions/进入扩展程序页面。或者点击菜单栏下按钮,选择“扩展程序......
  • Vue3 + TypeScript:从环境搭建到组件通信的完整前端开发教程
    在前端开发领域,Vue3与TypeScript的组合备受青睐。Vue3带来高效灵活的开发体验,TypeScript则提供强大的类型安全和可维护性。本文将详细介绍如何使用Vue3和TypeScript进行开发,文章内容将按照以下顺序展开:一、环境准备1.安装Node.js:从Node.js官方网站下载并安装适合......
  • 【OpenAI】第一节(OpenAI API)获取OpenAI API KEY的两种方式,开发者必看全方面教程!
    在当今人工智能迅猛发展的时代,OpenAI的大模型为开发者提供了强大的文本生成能力。无论你是想创建聊天机器人、内容生成工具,还是其他创新应用,掌握如何获取和使用OpenAIAPIKey是你迈向成功的第一步!本文将详细介绍获取APIKey的步骤、充值方法以及如何在项目中调用API......
  • windows 像Linux一样好用 msys2 环境配置教程
    很多Linux的命令诸如clearlsgcczsd在windows上都暂时不能用,这点很蛋疼,所以msys2横空出世。先安装msys2国内网络环境推荐用国内的开源镜像站点来(国外网络可以半无视这一步):(https://mirrors.tuna.tsinghua.edu.cn/#"清华大学开源镜像站")然后下载安装,配置国内源:(http......