欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 社会 > Manim教程:第二章 输出界面的基本设置

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

2024/10/23 15:21:50 来源:https://blog.csdn.net/qq_45449625/article/details/143100711  浏览:    关键词: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()方法中。最后,如果要同时渲染多个场景,单个文件可能包含多个场景子类。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com