3b1b-manim/getting_started/example_scenes.html
2021-01-31 06:26:40 +00:00

671 lines
No EOL
72 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html class="no-js">
<head><meta charset="utf-8"/>
<meta name="viewport" content="width=device-width,initial-scale=1"/><link rel="index" title="Index" href="../genindex.html" /><link rel="search" title="Search" href="../search.html" /><link rel="next" title="CONFIG dictionary" href="config.html" /><link rel="prev" title="CLI flags and configuration" href="configuration.html" />
<link rel="shortcut icon" href="../_static/icon.png"/><meta name="generator" content="sphinx-3.4.3, furo 2020.10.05.beta9"/>
<title>Example Scenes - manim documentation</title>
<link rel="stylesheet" href="../_static/copybutton.css" />
<link rel="stylesheet" href="../_static/custom.css" />
<link rel="stylesheet" href="../_static/colors.css" />
<link rel="stylesheet" href="../_static/styles/default.css?91e5691214934ea810d71707">
<link rel="stylesheet" href="../_static/pygments.css?91e5691214934ea810d71707">
<style>
:root {
--color-code-background: #f8f8f8;
--color-code-foreground: #000000;
}
</style>
<script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script><script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/doctools.js" defer></script>
<script src="../_static/clipboard.min.js"></script>
<script src="../_static/copybutton.js"></script>
<script src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script><script src="../_static/scripts/main.js?91e5691214934ea810d71707"></script></head>
<body dir="">
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<symbol id="svg-toc" viewBox="0 0 24 24">
<title>Contents</title>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"
stroke-width="1.5" stroke="#101010" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z"/>
<line x1="4" y1="6" x2="20" y2="6" />
<line x1="10" y1="12" x2="20" y2="12" />
<line x1="6" y1="18" x2="20" y2="18" />
</svg>
</symbol>
<symbol id="svg-menu" viewBox="0 0 24 24">
<title>Menu</title>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
class="feather feather-menu">
<line x1="3" y1="12" x2="21" y2="12"></line>
<line x1="3" y1="6" x2="21" y2="6"></line>
<line x1="3" y1="18" x2="21" y2="18"></line>
</svg>
</symbol>
<symbol id="svg-arrow-right" viewBox="0 0 24 24">
<title>Expand</title>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
class="feather feather-chevron-right">
<polyline points="9 18 15 12 9 6"></polyline>
</svg>
</symbol>
</svg>
<input type="checkbox" class="sidebar-toggle" name="__navigation" id="__navigation">
<input type="checkbox" class="sidebar-toggle" name="__toc" id="__toc">
<label class="overlay sidebar-overlay" for="__navigation"></label>
<label class="overlay toc-overlay" for="__toc"></label>
<div class="page">
<header class="mobile-header">
<label class="header-left nav-overlay-icon" for="__navigation">
<i class="icon"><svg><use href="#svg-menu"></use></svg></i>
</label>
<div class="header-center"><div class="brand">manim documentation</div></div>
<div class="header-right"></div>
</header>
<aside class="sidebar-drawer">
<div class="sidebar-container">
<div class="sidebar-sticky"><a class="sidebar-brand centered" href="../index.html">
<div class="sidebar-logo-container">
<img class="sidebar-logo" src="../_static/transparent_graph.png" alt="Logo"/>
</div>
</a><form class="sidebar-search-container" method="get" action="../search.html">
<input class="sidebar-search" placeholder="Search" name="q">
<input type="hidden" name="check_keywords" value="yes">
<input type="hidden" name="area" value="default">
</form><div class="sidebar-tree sidebar-scroll">
<p class="caption"><span class="caption-text">Getting Started</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="quickstart.html">Quick Start</a></li>
<li class="toctree-l1"><a class="reference internal" href="configuration.html">CLI flags and configuration</a></li>
<li class="toctree-l1 current current-page"><a class="current reference internal" href="#">Example Scenes</a></li>
<li class="toctree-l1"><a class="reference internal" href="config.html">CONFIG dictionary</a></li>
<li class="toctree-l1"><a class="reference internal" href="structure.html">Manims structure</a></li>
</ul>
<p class="caption"><span class="caption-text">Documentation</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../documentation/constants.html">constants</a></li>
<li class="toctree-l1"><a class="reference internal" href="../documentation/custom_default.html">custom_default</a></li>
</ul>
<p class="caption"><span class="caption-text">Development</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../development/changelog.html">Changelog</a></li>
<li class="toctree-l1"><a class="reference internal" href="../development/contributing.html">Contributing</a></li>
<li class="toctree-l1"><a class="reference internal" href="../development/about.html">About</a></li>
</ul>
</div>
</div>
</div>
</aside>
<main class="main">
<div class="content">
<article role="main">
<label class="toc-overlay-icon" for="__toc">
<i class="icon"><svg><use href="#svg-toc"></use></svg></i>
</label>
<div class="section" id="example-scenes">
<h1>Example Scenes<a class="headerlink" href="#example-scenes" title="Permalink to this headline"></a></h1>
<p>After understanding the previous knowledge, we can understand more scenes.
Many example scenes are given in <code class="docutils literal notranslate"><span class="pre">example_scenes.py</span></code>, lets start with
the simplest and one by one.</p>
<div class="section" id="squaretocircle">
<h2>SquareToCircle<a class="headerlink" href="#squaretocircle" title="Permalink to this headline"></a></h2>
<div class="manim-example"><video autoplay="" class="manim-video" controls="" id="squaretocircle" loop="" src="../_static/example_scenes/SquareToCircle.mp4"></video><h5 class="example-header">SquareToCircle<a class="headerlink" href="#squaretocircle"></a></h5><div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">manimlib.imports</span> <span class="kn">import</span> <span class="o">*</span>
<span class="k">class</span> <span class="nc">SquareToCircle</span><span class="p">(</span><span class="n">Scene</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">construct</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">circle</span> <span class="o">=</span> <span class="n">Circle</span><span class="p">()</span>
<span class="n">circle</span><span class="o">.</span><span class="n">set_fill</span><span class="p">(</span><span class="n">BLUE</span><span class="p">,</span> <span class="n">opacity</span><span class="o">=</span><span class="mf">0.5</span><span class="p">)</span>
<span class="n">circle</span><span class="o">.</span><span class="n">set_stroke</span><span class="p">(</span><span class="n">BLUE_E</span><span class="p">,</span> <span class="n">width</span><span class="o">=</span><span class="mi">4</span><span class="p">)</span>
<span class="n">square</span> <span class="o">=</span> <span class="n">Square</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">play</span><span class="p">(</span><span class="n">ShowCreation</span><span class="p">(</span><span class="n">square</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">wait</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">play</span><span class="p">(</span><span class="n">ReplacementTransform</span><span class="p">(</span><span class="n">square</span><span class="p">,</span> <span class="n">circle</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">wait</span><span class="p">()</span>
</pre></div>
</div>
</div><p>This scene is what we wrote in <a class="reference internal" href="quickstart.html"><span class="doc">Quick Start</span></a>.
No more explanation here</p>
</div>
<div class="section" id="warpsquare">
<h2>WarpSquare<a class="headerlink" href="#warpsquare" title="Permalink to this headline"></a></h2>
<div class="manim-example"><video autoplay="" class="manim-video" controls="" id="warpsquare" loop="" src="../_static/example_scenes/WarpSquare.mp4"></video><h5 class="example-header">WarpSquare<a class="headerlink" href="#warpsquare"></a></h5><div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">WarpSquare</span><span class="p">(</span><span class="n">Scene</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">construct</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">square</span> <span class="o">=</span> <span class="n">Square</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">play</span><span class="p">(</span><span class="n">square</span><span class="o">.</span><span class="n">apply_complex_function</span><span class="p">,</span> <span class="n">np</span><span class="o">.</span><span class="n">exp</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">wait</span><span class="p">()</span>
</pre></div>
</div>
</div><p>The new usage in this scene is <code class="docutils literal notranslate"><span class="pre">self.play(square.apply_complex_function,</span> <span class="pre">np.exp)</span></code>,
which shows an animation of applying a complex function <span class="math notranslate nohighlight">\(f(z)=e^z\)</span> to a square.
It is equivalent to transforming the original square into the result after
applying a function.</p>
</div>
<div class="section" id="textexample">
<h2>TextExample<a class="headerlink" href="#textexample" title="Permalink to this headline"></a></h2>
<div class="manim-example"><video autoplay="" class="manim-video" controls="" id="textexample" loop="" src="../_static/example_scenes/TextExample.mp4"></video><h5 class="example-header">TextExample<a class="headerlink" href="#textexample"></a></h5><div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">TextExample</span><span class="p">(</span><span class="n">Scene</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">construct</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">text</span> <span class="o">=</span> <span class="n">Text</span><span class="p">(</span><span class="s2">"Here is a text"</span><span class="p">,</span> <span class="n">font</span><span class="o">=</span><span class="s2">"Consolas"</span><span class="p">,</span> <span class="n">font_size</span><span class="o">=</span><span class="mi">90</span><span class="p">)</span>
<span class="n">difference</span> <span class="o">=</span> <span class="n">Text</span><span class="p">(</span>
<span class="sd">"""</span>
<span class="sd"> The most important difference between Text and TexText is that\n</span>
<span class="sd"> you can change the font more easily, but can't use the LaTeX grammar</span>
<span class="sd"> """</span><span class="p">,</span>
<span class="n">font</span><span class="o">=</span><span class="s2">"Arial"</span><span class="p">,</span> <span class="n">font_size</span><span class="o">=</span><span class="mi">24</span><span class="p">,</span>
<span class="n">t2c</span><span class="o">=</span><span class="p">{</span><span class="s2">"Text"</span><span class="p">:</span> <span class="n">BLUE</span><span class="p">,</span> <span class="s2">"TexText"</span><span class="p">:</span> <span class="n">BLUE</span><span class="p">,</span> <span class="s2">"LaTeX"</span><span class="p">:</span> <span class="n">ORANGE</span><span class="p">}</span>
<span class="p">)</span>
<span class="n">VGroup</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">difference</span><span class="p">)</span><span class="o">.</span><span class="n">arrange</span><span class="p">(</span><span class="n">DOWN</span><span class="p">,</span> <span class="n">buff</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">play</span><span class="p">(</span><span class="n">Write</span><span class="p">(</span><span class="n">text</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">play</span><span class="p">(</span><span class="n">FadeIn</span><span class="p">(</span><span class="n">difference</span><span class="p">,</span> <span class="n">UP</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">wait</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
<span class="n">fonts</span> <span class="o">=</span> <span class="n">Text</span><span class="p">(</span>
<span class="s2">"And you can also set the font according to different words"</span><span class="p">,</span>
<span class="n">font</span><span class="o">=</span><span class="s2">"Arial"</span><span class="p">,</span>
<span class="n">t2f</span><span class="o">=</span><span class="p">{</span><span class="s2">"font"</span><span class="p">:</span> <span class="s2">"Consolas"</span><span class="p">,</span> <span class="s2">"words"</span><span class="p">:</span> <span class="s2">"Consolas"</span><span class="p">},</span>
<span class="n">t2c</span><span class="o">=</span><span class="p">{</span><span class="s2">"font"</span><span class="p">:</span> <span class="n">BLUE</span><span class="p">,</span> <span class="s2">"words"</span><span class="p">:</span> <span class="n">GREEN</span><span class="p">}</span>
<span class="p">)</span>
<span class="n">slant</span> <span class="o">=</span> <span class="n">Text</span><span class="p">(</span>
<span class="s2">"And the same as slant and weight"</span><span class="p">,</span>
<span class="n">font</span><span class="o">=</span><span class="s2">"Consolas"</span><span class="p">,</span>
<span class="n">t2s</span><span class="o">=</span><span class="p">{</span><span class="s2">"slant"</span><span class="p">:</span> <span class="n">ITALIC</span><span class="p">},</span>
<span class="n">t2w</span><span class="o">=</span><span class="p">{</span><span class="s2">"weight"</span><span class="p">:</span> <span class="n">BOLD</span><span class="p">},</span>
<span class="n">t2c</span><span class="o">=</span><span class="p">{</span><span class="s2">"slant"</span><span class="p">:</span> <span class="n">ORANGE</span><span class="p">,</span> <span class="s2">"weight"</span><span class="p">:</span> <span class="n">RED</span><span class="p">}</span>
<span class="p">)</span>
<span class="n">VGroup</span><span class="p">(</span><span class="n">fonts</span><span class="p">,</span> <span class="n">slant</span><span class="p">)</span><span class="o">.</span><span class="n">arrange</span><span class="p">(</span><span class="n">DOWN</span><span class="p">,</span> <span class="n">buff</span><span class="o">=</span><span class="mf">0.8</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">play</span><span class="p">(</span><span class="n">FadeOut</span><span class="p">(</span><span class="n">text</span><span class="p">),</span> <span class="n">FadeOut</span><span class="p">(</span><span class="n">difference</span><span class="p">,</span> <span class="n">shift</span><span class="o">=</span><span class="n">DOWN</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">play</span><span class="p">(</span><span class="n">Write</span><span class="p">(</span><span class="n">fonts</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">wait</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">play</span><span class="p">(</span><span class="n">Write</span><span class="p">(</span><span class="n">slant</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">wait</span><span class="p">()</span>
</pre></div>
</div>
</div><p>The new classes in this scene are <code class="docutils literal notranslate"><span class="pre">Text</span></code>, <code class="docutils literal notranslate"><span class="pre">VGroup</span></code>, <code class="docutils literal notranslate"><span class="pre">Write</span></code>, <code class="docutils literal notranslate"><span class="pre">FadeIn</span></code> and <code class="docutils literal notranslate"><span class="pre">FadeOut</span></code>.</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">Text</span></code> can create text, define fonts, etc. The usage ais clearly reflected in the above examples.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">VGroup</span></code> can put multiple <code class="docutils literal notranslate"><span class="pre">VMobject</span></code> together as a whole. In the example, the <code class="docutils literal notranslate"><span class="pre">.arrange()</span></code> method is called to arrange the sub-mobjects in sequence downward (<code class="docutils literal notranslate"><span class="pre">DOWN</span></code>), and the spacing is <code class="docutils literal notranslate"><span class="pre">buff</span></code>.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">Write</span></code> is an animation that shows similar writing effects.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">FadeIn</span></code> fades the object in, the second parameter indicates the direction of the fade in.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">FadeOut</span></code> fades out the object, the second parameter indicates the direction of the fade out.</p></li>
</ul>
</div>
<div class="section" id="textransformexample">
<h2>TexTransformExample<a class="headerlink" href="#textransformexample" title="Permalink to this headline"></a></h2>
<div class="manim-example"><video autoplay="" class="manim-video" controls="" id="textransformexample" loop="" src="../_static/example_scenes/TexTransformExample.mp4"></video><h5 class="example-header">TexTransformExample<a class="headerlink" href="#textransformexample"></a></h5><div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">TexTransformExample</span><span class="p">(</span><span class="n">Scene</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">construct</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">to_isolate</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"B"</span><span class="p">,</span> <span class="s2">"C"</span><span class="p">,</span> <span class="s2">"="</span><span class="p">,</span> <span class="s2">"("</span><span class="p">,</span> <span class="s2">")"</span><span class="p">]</span>
<span class="n">lines</span> <span class="o">=</span> <span class="n">VGroup</span><span class="p">(</span>
<span class="c1"># Surrounding substrings with double braces</span>
<span class="c1"># will ensure that those parts are separated</span>
<span class="c1"># out in the Tex. For example, here the</span>
<span class="c1"># Tex will have 5 submobjects, corresponding</span>
<span class="c1"># to the strings [A^2, +, B^2, =, C^2]</span>
<span class="n">Tex</span><span class="p">(</span><span class="s2">"{{A^2}} + {{B^2}} = {{C^2}}"</span><span class="p">),</span>
<span class="n">Tex</span><span class="p">(</span><span class="s2">"{{A^2}} = {{C^2}} - {{B^2}}"</span><span class="p">),</span>
<span class="c1"># Alternatively, you can pass in the keyword argument</span>
<span class="c1"># "isolate" with a list of strings that should be out as</span>
<span class="c1"># their own submobject. So both lines below are equivalent</span>
<span class="c1"># to what you'd get by wrapping every instance of "B", "C"</span>
<span class="c1"># "=", "(" and ")" with double braces</span>
<span class="n">Tex</span><span class="p">(</span><span class="s2">"{{A^2}} = (C + B)(C - B)"</span><span class="p">,</span> <span class="n">isolate</span><span class="o">=</span><span class="n">to_isolate</span><span class="p">),</span>
<span class="n">Tex</span><span class="p">(</span><span class="s2">"A = </span><span class="se">\\</span><span class="s2">sqrt{(C + B)(C - B)}"</span><span class="p">,</span> <span class="n">isolate</span><span class="o">=</span><span class="n">to_isolate</span><span class="p">)</span>
<span class="p">)</span>
<span class="n">lines</span><span class="o">.</span><span class="n">arrange</span><span class="p">(</span><span class="n">DOWN</span><span class="p">,</span> <span class="n">buff</span><span class="o">=</span><span class="n">LARGE_BUFF</span><span class="p">)</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">lines</span><span class="p">:</span>
<span class="n">line</span><span class="o">.</span><span class="n">set_color_by_tex_to_color_map</span><span class="p">({</span>
<span class="s2">"A"</span><span class="p">:</span> <span class="n">BLUE</span><span class="p">,</span>
<span class="s2">"B"</span><span class="p">:</span> <span class="n">TEAL</span><span class="p">,</span>
<span class="s2">"C"</span><span class="p">:</span> <span class="n">GREEN</span><span class="p">,</span>
<span class="p">})</span>
<span class="n">play_kw</span> <span class="o">=</span> <span class="p">{</span><span class="s2">"run_time"</span><span class="p">:</span> <span class="mi">2</span><span class="p">}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">lines</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="c1"># The animation TransformMatchingTex will line up parts</span>
<span class="c1"># of the source and target which have matching tex strings.</span>
<span class="c1"># Here, giving it a little path_arc makes each part sort of</span>
<span class="c1"># rotate into their final positions, which feels appropriate</span>
<span class="c1"># for the idea of rearranging an equation</span>
<span class="bp">self</span><span class="o">.</span><span class="n">play</span><span class="p">(</span>
<span class="n">TransformMatchingTex</span><span class="p">(</span>
<span class="n">lines</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">copy</span><span class="p">(),</span> <span class="n">lines</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span>
<span class="n">path_arc</span><span class="o">=</span><span class="mi">90</span> <span class="o">*</span> <span class="n">DEGREES</span><span class="p">,</span>
<span class="p">),</span>
<span class="o">**</span><span class="n">play_kw</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">wait</span><span class="p">()</span>
<span class="c1"># Now, we could try this again on the next line...</span>
<span class="bp">self</span><span class="o">.</span><span class="n">play</span><span class="p">(</span>
<span class="n">TransformMatchingTex</span><span class="p">(</span><span class="n">lines</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">copy</span><span class="p">(),</span> <span class="n">lines</span><span class="p">[</span><span class="mi">2</span><span class="p">]),</span>
<span class="o">**</span><span class="n">play_kw</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">wait</span><span class="p">()</span>
<span class="c1"># ...and this looks nice enough, but since there's no tex</span>
<span class="c1"># in lines[2] which matches "C^2" or "B^2", those terms fade</span>
<span class="c1"># out to nothing while the C and B terms fade in from nothing.</span>
<span class="c1"># If, however, we want the C^2 to go to C, and B^2 to go to B,</span>
<span class="c1"># we can specify that with a key map.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">play</span><span class="p">(</span><span class="n">FadeOut</span><span class="p">(</span><span class="n">lines</span><span class="p">[</span><span class="mi">2</span><span class="p">]))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">play</span><span class="p">(</span>
<span class="n">TransformMatchingTex</span><span class="p">(</span>
<span class="n">lines</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">copy</span><span class="p">(),</span> <span class="n">lines</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span>
<span class="n">key_map</span><span class="o">=</span><span class="p">{</span>
<span class="s2">"C^2"</span><span class="p">:</span> <span class="s2">"C"</span><span class="p">,</span>
<span class="s2">"B^2"</span><span class="p">:</span> <span class="s2">"B"</span><span class="p">,</span>
<span class="p">}</span>
<span class="p">),</span>
<span class="o">**</span><span class="n">play_kw</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">wait</span><span class="p">()</span>
<span class="c1"># And to finish off, a simple TransformMatchingShapes would work</span>
<span class="c1"># just fine. But perhaps we want that exponent on A^2 to transform into</span>
<span class="c1"># the square root symbol. At the moment, lines[2] treats the expression</span>
<span class="c1"># A^2 as a unit, so we might create a new version of the same line which</span>
<span class="c1"># separates out just the A. This way, when TransformMatchingTex lines up</span>
<span class="c1"># all matching parts, the only mismatch will be between the "^2" from</span>
<span class="c1"># new_line2 and the "\sqrt" from the final line. By passing in,</span>
<span class="c1"># transform_mismatches=True, it will transform this "^2" part into</span>
<span class="c1"># the "\sqrt" part.</span>
<span class="n">new_line2</span> <span class="o">=</span> <span class="n">Tex</span><span class="p">(</span><span class="s2">"{{A}}^2 = (C + B)(C - B)"</span><span class="p">,</span> <span class="n">isolate</span><span class="o">=</span><span class="n">to_isolate</span><span class="p">)</span>
<span class="n">new_line2</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">lines</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span>
<span class="n">new_line2</span><span class="o">.</span><span class="n">match_style</span><span class="p">(</span><span class="n">lines</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span>
<span class="bp">self</span><span class="o">.</span><span class="n">play</span><span class="p">(</span>
<span class="n">TransformMatchingTex</span><span class="p">(</span>
<span class="n">new_line2</span><span class="p">,</span> <span class="n">lines</span><span class="p">[</span><span class="mi">3</span><span class="p">],</span>
<span class="n">transform_mismatches</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
<span class="p">),</span>
<span class="o">**</span><span class="n">play_kw</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">wait</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">play</span><span class="p">(</span><span class="n">FadeOut</span><span class="p">(</span><span class="n">lines</span><span class="p">,</span> <span class="n">RIGHT</span><span class="p">))</span>
<span class="c1"># Alternatively, if you don't want to think about breaking up</span>
<span class="c1"># the tex strings deliberately, you can TransformMatchingShapes,</span>
<span class="c1"># which will try to line up all pieces of a source mobject with</span>
<span class="c1"># those of a target, regardless of the submobject hierarchy in</span>
<span class="c1"># each one, according to whether those pieces have the same</span>
<span class="c1"># shape (as best it can).</span>
<span class="n">source</span> <span class="o">=</span> <span class="n">Text</span><span class="p">(</span><span class="s2">"the morse code"</span><span class="p">,</span> <span class="n">height</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">target</span> <span class="o">=</span> <span class="n">Text</span><span class="p">(</span><span class="s2">"here come dots"</span><span class="p">,</span> <span class="n">height</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">play</span><span class="p">(</span><span class="n">Write</span><span class="p">(</span><span class="n">source</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">wait</span><span class="p">()</span>
<span class="n">kw</span> <span class="o">=</span> <span class="p">{</span><span class="s2">"run_time"</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">"path_arc"</span><span class="p">:</span> <span class="n">PI</span> <span class="o">/</span> <span class="mi">2</span><span class="p">}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">play</span><span class="p">(</span><span class="n">TransformMatchingShapes</span><span class="p">(</span><span class="n">source</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">wait</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">play</span><span class="p">(</span><span class="n">TransformMatchingShapes</span><span class="p">(</span><span class="n">target</span><span class="p">,</span> <span class="n">source</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">wait</span><span class="p">()</span>
</pre></div>
</div>
</div><p>The new classes in this scene are <code class="docutils literal notranslate"><span class="pre">Tex</span></code>, <code class="docutils literal notranslate"><span class="pre">TexText</span></code>, <code class="docutils literal notranslate"><span class="pre">TransformMatchingTex</span></code>
and <code class="docutils literal notranslate"><span class="pre">TransformMatchingShapes</span></code>.</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">Tex</span></code> uses LaTeX to create mathematical formulas.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">TexText</span></code> uses LaTeX to create text.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">TransformMatchingTeX</span></code> automatically transforms sub-objects according to the similarities and differences of tex in <code class="docutils literal notranslate"><span class="pre">Tex</span></code>.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">TransformMatchingShapes</span></code> automatically transform sub-objects directly based on the similarities and differences of the object point sets.</p></li>
</ul>
</div>
<div class="section" id="updatersexample">
<h2>UpdatersExample<a class="headerlink" href="#updatersexample" title="Permalink to this headline"></a></h2>
<div class="manim-example"><video autoplay="" class="manim-video" controls="" id="updatersexample" loop="" src="../_static/example_scenes/UpdatersExample.mp4"></video><h5 class="example-header">UpdatersExample<a class="headerlink" href="#updatersexample"></a></h5><div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">UpdatersExample</span><span class="p">(</span><span class="n">Scene</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">construct</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">square</span> <span class="o">=</span> <span class="n">Square</span><span class="p">()</span>
<span class="n">square</span><span class="o">.</span><span class="n">set_fill</span><span class="p">(</span><span class="n">BLUE_E</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="c1"># On all all frames, the constructor Brace(square, UP) will</span>
<span class="c1"># be called, and the mobject brace will set its data to match</span>
<span class="c1"># that of the newly constructed object</span>
<span class="n">brace</span> <span class="o">=</span> <span class="n">always_redraw</span><span class="p">(</span><span class="n">Brace</span><span class="p">,</span> <span class="n">square</span><span class="p">,</span> <span class="n">UP</span><span class="p">)</span>
<span class="n">text</span><span class="p">,</span> <span class="n">number</span> <span class="o">=</span> <span class="n">label</span> <span class="o">=</span> <span class="n">VGroup</span><span class="p">(</span>
<span class="n">Text</span><span class="p">(</span><span class="s2">"Width = "</span><span class="p">),</span>
<span class="n">DecimalNumber</span><span class="p">(</span>
<span class="mi">0</span><span class="p">,</span>
<span class="n">show_ellipsis</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
<span class="n">num_decimal_places</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span>
<span class="n">include_sign</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="n">label</span><span class="o">.</span><span class="n">arrange</span><span class="p">(</span><span class="n">RIGHT</span><span class="p">)</span>
<span class="c1"># This ensures that the method deicmal.next_to(square)</span>
<span class="c1"># is called on every frame</span>
<span class="n">always</span><span class="p">(</span><span class="n">label</span><span class="o">.</span><span class="n">next_to</span><span class="p">,</span> <span class="n">brace</span><span class="p">,</span> <span class="n">UP</span><span class="p">)</span>
<span class="c1"># You could also write the following equivalent line</span>
<span class="c1"># label.add_updater(lambda m: m.next_to(brace, UP))</span>
<span class="c1"># If the argument itself might change, you can use f_always,</span>
<span class="c1"># for which the arguments following the initial Mobject method</span>
<span class="c1"># should be functions returning arguments to that method.</span>
<span class="c1"># The following line ensures thst decimal.set_value(square.get_y())</span>
<span class="c1"># is called every frame</span>
<span class="n">f_always</span><span class="p">(</span><span class="n">number</span><span class="o">.</span><span class="n">set_value</span><span class="p">,</span> <span class="n">square</span><span class="o">.</span><span class="n">get_width</span><span class="p">)</span>
<span class="c1"># You could also write the following equivalent line</span>
<span class="c1"># number.add_updater(lambda m: m.set_value(square.get_width()))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">square</span><span class="p">,</span> <span class="n">brace</span><span class="p">,</span> <span class="n">label</span><span class="p">)</span>
<span class="c1"># Notice that the brace and label track with the square</span>
<span class="bp">self</span><span class="o">.</span><span class="n">play</span><span class="p">(</span>
<span class="n">square</span><span class="o">.</span><span class="n">scale</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span>
<span class="n">rate_func</span><span class="o">=</span><span class="n">there_and_back</span><span class="p">,</span>
<span class="n">run_time</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">wait</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">play</span><span class="p">(</span>
<span class="n">square</span><span class="o">.</span><span class="n">set_width</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="p">{</span><span class="s2">"stretch"</span><span class="p">:</span> <span class="bp">True</span><span class="p">},</span>
<span class="n">run_time</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">wait</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">play</span><span class="p">(</span>
<span class="n">square</span><span class="o">.</span><span class="n">set_width</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span>
<span class="n">run_time</span><span class="o">=</span><span class="mi">3</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">wait</span><span class="p">()</span>
<span class="c1"># In general, you can alway call Mobject.add_updater, and pass in</span>
<span class="c1"># a function that you want to be called on every frame. The function</span>
<span class="c1"># should take in either one argument, the mobject, or two arguments,</span>
<span class="c1"># the mobject and the amount of time since the last frame.</span>
<span class="n">now</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">time</span>
<span class="n">w0</span> <span class="o">=</span> <span class="n">square</span><span class="o">.</span><span class="n">get_width</span><span class="p">()</span>
<span class="n">square</span><span class="o">.</span><span class="n">add_updater</span><span class="p">(</span>
<span class="k">lambda</span> <span class="n">m</span><span class="p">:</span> <span class="n">m</span><span class="o">.</span><span class="n">set_width</span><span class="p">(</span><span class="n">w0</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">time</span> <span class="o">-</span> <span class="n">now</span><span class="p">))</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">wait</span><span class="p">(</span><span class="mi">4</span> <span class="o">*</span> <span class="n">PI</span><span class="p">)</span>
</pre></div>
</div>
</div><p>The new classes and usage in this scene are <code class="docutils literal notranslate"><span class="pre">DecimalNumber</span></code>, <code class="docutils literal notranslate"><span class="pre">.to_edge()</span></code>,
<code class="docutils literal notranslate"><span class="pre">.center()</span></code>, <code class="docutils literal notranslate"><span class="pre">always_become()</span></code>, <code class="docutils literal notranslate"><span class="pre">always()</span></code>, <code class="docutils literal notranslate"><span class="pre">f_always()</span></code>, <code class="docutils literal notranslate"><span class="pre">.set_y()</span></code> and <code class="docutils literal notranslate"><span class="pre">.add_updater()</span></code>.</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">DecimalNumber</span></code> is a variable number, speed it up by breaking it into <code class="docutils literal notranslate"><span class="pre">Tex</span></code> characters.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">.to_edge()</span></code> means to place the object on the edge of the screen.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">.center()</span></code> means to place the object in the center of the screen.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">always(f,</span> <span class="pre">x)</span></code> means that a certain function (<code class="docutils literal notranslate"><span class="pre">f(x)</span></code>) is executed every frame.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">f_always(f,</span> <span class="pre">g)</span></code> is similar to <code class="docutils literal notranslate"><span class="pre">always</span></code>, executed <code class="docutils literal notranslate"><span class="pre">f(g())</span></code> every frame.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">.set_y()</span></code> means to set the ordinate of the object on the screen.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">.add_updater()</span></code> sets an update function for the object. For example: <code class="docutils literal notranslate"><span class="pre">mob1.add_updater(lambda</span> <span class="pre">mob:</span> <span class="pre">mob.next_to(mob2))</span></code> means <code class="docutils literal notranslate"><span class="pre">mob1.next_to(mob2)</span></code> is executed every frame.</p></li>
</ul>
</div>
<div class="section" id="surfaceexample">
<h2>SurfaceExample<a class="headerlink" href="#surfaceexample" title="Permalink to this headline"></a></h2>
<div class="manim-example"><video autoplay="" class="manim-video" controls="" id="surfaceexample" loop="" src="../_static/example_scenes/SurfaceExample.mp4"></video><h5 class="example-header">SurfaceExample<a class="headerlink" href="#surfaceexample"></a></h5><div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">SurfaceExample</span><span class="p">(</span><span class="n">Scene</span><span class="p">):</span>
<span class="n">CONFIG</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">"camera_class"</span><span class="p">:</span> <span class="n">ThreeDCamera</span><span class="p">,</span>
<span class="p">}</span>
<span class="k">def</span> <span class="nf">construct</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">surface_text</span> <span class="o">=</span> <span class="n">Text</span><span class="p">(</span><span class="s2">"For 3d scenes, try using surfaces"</span><span class="p">)</span>
<span class="n">surface_text</span><span class="o">.</span><span class="n">fix_in_frame</span><span class="p">()</span>
<span class="n">surface_text</span><span class="o">.</span><span class="n">to_edge</span><span class="p">(</span><span class="n">UP</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">surface_text</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">wait</span><span class="p">(</span><span class="mf">0.1</span><span class="p">)</span>
<span class="n">torus1</span> <span class="o">=</span> <span class="n">Torus</span><span class="p">(</span><span class="n">r1</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">r2</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">torus2</span> <span class="o">=</span> <span class="n">Torus</span><span class="p">(</span><span class="n">r1</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">r2</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">sphere</span> <span class="o">=</span> <span class="n">Sphere</span><span class="p">(</span><span class="n">radius</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">resolution</span><span class="o">=</span><span class="n">torus1</span><span class="o">.</span><span class="n">resolution</span><span class="p">)</span>
<span class="c1"># You can texture a surface with up to two images, which will</span>
<span class="c1"># be interpreted as the side towards the light, and away from</span>
<span class="c1"># the light. These can be either urls, or paths to a local file</span>
<span class="c1"># in whatever you've set as the image directory in</span>
<span class="c1"># the custom_defaults.yml file</span>
<span class="c1"># day_texture = "EarthTextureMap"</span>
<span class="c1"># night_texture = "NightEarthTextureMap"</span>
<span class="n">day_texture</span> <span class="o">=</span> <span class="s2">"https://upload.wikimedia.org/wikipedia/commons/thumb/4/4d/Whole_world_-_land_and_oceans.jpg/1280px-Whole_world_-_land_and_oceans.jpg"</span>
<span class="n">night_texture</span> <span class="o">=</span> <span class="s2">"https://upload.wikimedia.org/wikipedia/commons/thumb/b/ba/The_earth_at_night.jpg/1280px-The_earth_at_night.jpg"</span>
<span class="n">surfaces</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">TexturedSurface</span><span class="p">(</span><span class="n">surface</span><span class="p">,</span> <span class="n">day_texture</span><span class="p">,</span> <span class="n">night_texture</span><span class="p">)</span>
<span class="k">for</span> <span class="n">surface</span> <span class="ow">in</span> <span class="p">[</span><span class="n">sphere</span><span class="p">,</span> <span class="n">torus1</span><span class="p">,</span> <span class="n">torus2</span><span class="p">]</span>
<span class="p">]</span>
<span class="k">for</span> <span class="n">mob</span> <span class="ow">in</span> <span class="n">surfaces</span><span class="p">:</span>
<span class="n">mob</span><span class="o">.</span><span class="n">shift</span><span class="p">(</span><span class="n">IN</span><span class="p">)</span>
<span class="n">mob</span><span class="o">.</span><span class="n">mesh</span> <span class="o">=</span> <span class="n">SurfaceMesh</span><span class="p">(</span><span class="n">mob</span><span class="p">)</span>
<span class="n">mob</span><span class="o">.</span><span class="n">mesh</span><span class="o">.</span><span class="n">set_stroke</span><span class="p">(</span><span class="n">BLUE</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">opacity</span><span class="o">=</span><span class="mf">0.5</span><span class="p">)</span>
<span class="c1"># Set perspective</span>
<span class="n">frame</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">camera</span><span class="o">.</span><span class="n">frame</span>
<span class="n">frame</span><span class="o">.</span><span class="n">set_euler_angles</span><span class="p">(</span>
<span class="n">theta</span><span class="o">=-</span><span class="mi">30</span> <span class="o">*</span> <span class="n">DEGREES</span><span class="p">,</span>
<span class="n">phi</span><span class="o">=</span><span class="mi">70</span> <span class="o">*</span> <span class="n">DEGREES</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">surface</span> <span class="o">=</span> <span class="n">surfaces</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">play</span><span class="p">(</span>
<span class="n">FadeIn</span><span class="p">(</span><span class="n">surface</span><span class="p">),</span>
<span class="n">ShowCreation</span><span class="p">(</span><span class="n">surface</span><span class="o">.</span><span class="n">mesh</span><span class="p">,</span> <span class="n">lag_ratio</span><span class="o">=</span><span class="mf">0.01</span><span class="p">,</span> <span class="n">run_time</span><span class="o">=</span><span class="mi">3</span><span class="p">),</span>
<span class="p">)</span>
<span class="k">for</span> <span class="n">mob</span> <span class="ow">in</span> <span class="n">surfaces</span><span class="p">:</span>
<span class="n">mob</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">mob</span><span class="o">.</span><span class="n">mesh</span><span class="p">)</span>
<span class="n">surface</span><span class="o">.</span><span class="n">save_state</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">play</span><span class="p">(</span><span class="n">Rotate</span><span class="p">(</span><span class="n">surface</span><span class="p">,</span> <span class="n">PI</span> <span class="o">/</span> <span class="mi">2</span><span class="p">),</span> <span class="n">run_time</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="k">for</span> <span class="n">mob</span> <span class="ow">in</span> <span class="n">surfaces</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
<span class="n">mob</span><span class="o">.</span><span class="n">rotate</span><span class="p">(</span><span class="n">PI</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">play</span><span class="p">(</span>
<span class="n">Transform</span><span class="p">(</span><span class="n">surface</span><span class="p">,</span> <span class="n">surfaces</span><span class="p">[</span><span class="mi">1</span><span class="p">]),</span>
<span class="n">run_time</span><span class="o">=</span><span class="mi">3</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">play</span><span class="p">(</span>
<span class="n">Transform</span><span class="p">(</span><span class="n">surface</span><span class="p">,</span> <span class="n">surfaces</span><span class="p">[</span><span class="mi">2</span><span class="p">]),</span>
<span class="c1"># Move camera frame during the transition</span>
<span class="n">frame</span><span class="o">.</span><span class="n">increment_phi</span><span class="p">,</span> <span class="o">-</span><span class="mi">10</span> <span class="o">*</span> <span class="n">DEGREES</span><span class="p">,</span>
<span class="n">frame</span><span class="o">.</span><span class="n">increment_theta</span><span class="p">,</span> <span class="o">-</span><span class="mi">20</span> <span class="o">*</span> <span class="n">DEGREES</span><span class="p">,</span>
<span class="n">run_time</span><span class="o">=</span><span class="mi">3</span>
<span class="p">)</span>
<span class="c1"># Add ambient rotation</span>
<span class="n">frame</span><span class="o">.</span><span class="n">add_updater</span><span class="p">(</span><span class="k">lambda</span> <span class="n">m</span><span class="p">,</span> <span class="n">dt</span><span class="p">:</span> <span class="n">m</span><span class="o">.</span><span class="n">increment_theta</span><span class="p">(</span><span class="o">-</span><span class="mf">0.1</span> <span class="o">*</span> <span class="n">dt</span><span class="p">))</span>
<span class="c1"># Play around with where the light is</span>
<span class="n">light_text</span> <span class="o">=</span> <span class="n">Text</span><span class="p">(</span><span class="s2">"You can move around the light source"</span><span class="p">)</span>
<span class="n">light_text</span><span class="o">.</span><span class="n">move_to</span><span class="p">(</span><span class="n">surface_text</span><span class="p">)</span>
<span class="n">light_text</span><span class="o">.</span><span class="n">fix_in_frame</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">play</span><span class="p">(</span><span class="n">FadeTransform</span><span class="p">(</span><span class="n">surface_text</span><span class="p">,</span> <span class="n">light_text</span><span class="p">))</span>
<span class="n">light</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">camera</span><span class="o">.</span><span class="n">light_source</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">light</span><span class="p">)</span>
<span class="n">light</span><span class="o">.</span><span class="n">save_state</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">play</span><span class="p">(</span><span class="n">light</span><span class="o">.</span><span class="n">move_to</span><span class="p">,</span> <span class="mi">3</span> <span class="o">*</span> <span class="n">IN</span><span class="p">,</span> <span class="n">run_time</span><span class="o">=</span><span class="mi">5</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">play</span><span class="p">(</span><span class="n">light</span><span class="o">.</span><span class="n">shift</span><span class="p">,</span> <span class="mi">10</span> <span class="o">*</span> <span class="n">OUT</span><span class="p">,</span> <span class="n">run_time</span><span class="o">=</span><span class="mi">5</span><span class="p">)</span>
<span class="n">drag_text</span> <span class="o">=</span> <span class="n">Text</span><span class="p">(</span><span class="s2">"Try moving the mouse while pressing d or s"</span><span class="p">)</span>
<span class="n">drag_text</span><span class="o">.</span><span class="n">move_to</span><span class="p">(</span><span class="n">light_text</span><span class="p">)</span>
<span class="n">drag_text</span><span class="o">.</span><span class="n">fix_in_frame</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">play</span><span class="p">(</span><span class="n">FadeTransform</span><span class="p">(</span><span class="n">light_text</span><span class="p">,</span> <span class="n">drag_text</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">wait</span><span class="p">()</span>
</pre></div>
</div>
</div><p>This scene shows an example of using a three-dimensional surface, and
the related usage has been briefly described in the notes.</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">.fix_in_frame()</span></code> makes the object not change with the view angle of the screen, and is always displayed at a fixed position on the screen.</p></li>
</ul>
</div>
<div class="section" id="openingmanimexample">
<h2>OpeningManimExample<a class="headerlink" href="#openingmanimexample" title="Permalink to this headline"></a></h2>
<div class="manim-example"><video autoplay="" class="manim-video" controls="" id="openingmanimexample" loop="" src="../_static/example_scenes/OpeningManimExample.mp4"></video><h5 class="example-header">OpeningManimExample<a class="headerlink" href="#openingmanimexample"></a></h5><div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">OpeningManimExample</span><span class="p">(</span><span class="n">Scene</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">construct</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">title</span> <span class="o">=</span> <span class="n">TexText</span><span class="p">(</span><span class="s2">"This is some </span><span class="se">\\</span><span class="s2">LaTeX"</span><span class="p">)</span>
<span class="n">basel</span> <span class="o">=</span> <span class="n">Tex</span><span class="p">(</span>
<span class="s2">"</span><span class="se">\\</span><span class="s2">sum_{n=1}^</span><span class="se">\\</span><span class="s2">infty "</span>
<span class="s2">"</span><span class="se">\\</span><span class="s2">frac{1}{n^2} = </span><span class="se">\\</span><span class="s2">frac{</span><span class="se">\\</span><span class="s2">pi^2}{6}"</span>
<span class="p">)</span>
<span class="n">VGroup</span><span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="n">basel</span><span class="p">)</span><span class="o">.</span><span class="n">arrange</span><span class="p">(</span><span class="n">DOWN</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">play</span><span class="p">(</span>
<span class="n">Write</span><span class="p">(</span><span class="n">title</span><span class="p">),</span>
<span class="n">FadeIn</span><span class="p">(</span><span class="n">basel</span><span class="p">,</span> <span class="n">UP</span><span class="p">),</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">wait</span><span class="p">()</span>
<span class="n">transform_title</span> <span class="o">=</span> <span class="n">Text</span><span class="p">(</span><span class="s2">"That was a transform"</span><span class="p">)</span>
<span class="n">transform_title</span><span class="o">.</span><span class="n">to_corner</span><span class="p">(</span><span class="n">UL</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">play</span><span class="p">(</span>
<span class="n">Transform</span><span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="n">transform_title</span><span class="p">),</span>
<span class="n">LaggedStartMap</span><span class="p">(</span><span class="n">FadeOut</span><span class="p">,</span> <span class="n">basel</span><span class="p">,</span> <span class="n">shift</span><span class="o">=</span><span class="n">DOWN</span><span class="p">),</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">wait</span><span class="p">()</span>
<span class="n">fade_comment</span> <span class="o">=</span> <span class="n">Text</span><span class="p">(</span>
<span class="sd">"""</span>
<span class="sd"> You probably don't want to overuse</span>
<span class="sd"> Transforms, though, a simple fade often</span>
<span class="sd"> looks nicer.</span>
<span class="sd"> """</span><span class="p">,</span>
<span class="n">font_size</span><span class="o">=</span><span class="mi">36</span><span class="p">,</span>
<span class="n">color</span><span class="o">=</span><span class="n">GREY_B</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">fade_comment</span><span class="o">.</span><span class="n">next_to</span><span class="p">(</span>
<span class="n">transform_title</span><span class="p">,</span> <span class="n">DOWN</span><span class="p">,</span>
<span class="n">buff</span><span class="o">=</span><span class="n">LARGE_BUFF</span><span class="p">,</span>
<span class="n">aligned_edge</span><span class="o">=</span><span class="n">LEFT</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">play</span><span class="p">(</span><span class="n">FadeIn</span><span class="p">(</span><span class="n">fade_comment</span><span class="p">,</span> <span class="n">shift</span><span class="o">=</span><span class="n">DOWN</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">wait</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
<span class="n">grid</span> <span class="o">=</span> <span class="n">NumberPlane</span><span class="p">((</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span> <span class="mi">10</span><span class="p">),</span> <span class="p">(</span><span class="o">-</span><span class="mi">5</span><span class="p">,</span> <span class="mi">5</span><span class="p">))</span>
<span class="n">grid_title</span> <span class="o">=</span> <span class="n">Text</span><span class="p">(</span>
<span class="s2">"But manim is for illustrating math, not text"</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">grid_title</span><span class="o">.</span><span class="n">to_edge</span><span class="p">(</span><span class="n">UP</span><span class="p">)</span>
<span class="n">grid_title</span><span class="o">.</span><span class="n">add_background_rectangle</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">grid</span><span class="p">,</span> <span class="n">grid_title</span><span class="p">)</span> <span class="c1"># Make sure title is on top of grid</span>
<span class="bp">self</span><span class="o">.</span><span class="n">play</span><span class="p">(</span>
<span class="n">FadeOut</span><span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="n">shift</span><span class="o">=</span><span class="n">LEFT</span><span class="p">),</span>
<span class="n">FadeOut</span><span class="p">(</span><span class="n">fade_comment</span><span class="p">,</span> <span class="n">shift</span><span class="o">=</span><span class="n">LEFT</span><span class="p">),</span>
<span class="n">FadeIn</span><span class="p">(</span><span class="n">grid_title</span><span class="p">),</span>
<span class="n">ShowCreation</span><span class="p">(</span><span class="n">grid</span><span class="p">,</span> <span class="n">run_time</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">lag_ratio</span><span class="o">=</span><span class="mf">0.1</span><span class="p">),</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">wait</span><span class="p">()</span>
<span class="n">matrix</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">]]</span>
<span class="n">linear_transform_title</span> <span class="o">=</span> <span class="n">VGroup</span><span class="p">(</span>
<span class="n">Text</span><span class="p">(</span><span class="s2">"This is what the matrix"</span><span class="p">),</span>
<span class="n">IntegerMatrix</span><span class="p">(</span><span class="n">matrix</span><span class="p">,</span> <span class="n">include_background_rectangle</span><span class="o">=</span><span class="bp">True</span><span class="p">),</span>
<span class="n">Text</span><span class="p">(</span><span class="s2">"looks like"</span><span class="p">)</span>
<span class="p">)</span>
<span class="n">linear_transform_title</span><span class="o">.</span><span class="n">arrange</span><span class="p">(</span><span class="n">RIGHT</span><span class="p">)</span>
<span class="n">linear_transform_title</span><span class="o">.</span><span class="n">to_edge</span><span class="p">(</span><span class="n">UP</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">play</span><span class="p">(</span>
<span class="n">FadeOut</span><span class="p">(</span><span class="n">grid_title</span><span class="p">),</span>
<span class="n">FadeIn</span><span class="p">(</span><span class="n">linear_transform_title</span><span class="p">),</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">play</span><span class="p">(</span><span class="n">grid</span><span class="o">.</span><span class="n">apply_matrix</span><span class="p">,</span> <span class="n">matrix</span><span class="p">,</span> <span class="n">run_time</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">wait</span><span class="p">()</span>
<span class="n">grid_transform_title</span> <span class="o">=</span> <span class="n">Text</span><span class="p">(</span>
<span class="s2">"And this is a nonlinear transformation"</span>
<span class="p">)</span>
<span class="n">grid_transform_title</span><span class="o">.</span><span class="n">set_stroke</span><span class="p">(</span><span class="n">BLACK</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="n">background</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">grid_transform_title</span><span class="o">.</span><span class="n">to_edge</span><span class="p">(</span><span class="n">UP</span><span class="p">)</span>
<span class="n">grid</span><span class="o">.</span><span class="n">prepare_for_nonlinear_transform</span><span class="p">(</span><span class="mi">100</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">play</span><span class="p">(</span>
<span class="n">ApplyPointwiseFunction</span><span class="p">(</span>
<span class="k">lambda</span> <span class="n">p</span><span class="p">:</span> <span class="n">p</span> <span class="o">+</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="n">np</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">]),</span> <span class="n">np</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="mi">0</span><span class="p">]),</span>
<span class="n">grid</span><span class="p">,</span>
<span class="n">run_time</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span>
<span class="p">),</span>
<span class="n">FadeOut</span><span class="p">(</span><span class="n">linear_transform_title</span><span class="p">),</span>
<span class="n">FadeIn</span><span class="p">(</span><span class="n">grid_transform_title</span><span class="p">),</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">wait</span><span class="p">()</span>
</pre></div>
</div>
</div><p>This scene is a comprehensive application of a two-dimensional scene.</p>
<p>After seeing these scenes, you have already understood part of the
usage of manim. For more examples, see <a class="reference external" href="https://github.com/3b1b/videos">the video code of 3b1b</a>.</p>
</div>
</div>
</article>
<footer>
<div class="related-pages">
<a class="next-page" href="config.html">
<div class="page-info">
<div class="context">
<span>Next</span>
</div>
<div class="title">CONFIG dictionary</div>
</div>
<svg><use href="#svg-arrow-right"></use></svg>
</a>
<a class="prev-page" href="configuration.html">
<svg><use href="#svg-arrow-right"></use></svg>
<div class="page-info">
<div class="context">
<span>Previous</span>
</div>
<div class="title">CLI flags and configuration</div>
</div>
</a>
</div>
<div class="related-information">
<span class="copyright">Copyright &copy; - This document has been placed in the public domain.</span> |
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using
<a class="muted-link" href="https://pradyunsg.me">@pradyunsg</a>'s
<a href="https://github.com/pradyunsg/furo">Furo theme</a>.
</div>
</footer>
</div>
<aside class="toc-drawer">
<div class="toc-sticky toc-scroll">
<div class="toc-title-container">
<span class="toc-title">
Contents
</span>
</div>
<div class="toc-tree">
<ul>
<li><a class="reference internal" href="#">Example Scenes</a><ul>
<li><a class="reference internal" href="#squaretocircle">SquareToCircle</a></li>
<li><a class="reference internal" href="#warpsquare">WarpSquare</a></li>
<li><a class="reference internal" href="#textexample">TextExample</a></li>
<li><a class="reference internal" href="#textransformexample">TexTransformExample</a></li>
<li><a class="reference internal" href="#updatersexample">UpdatersExample</a></li>
<li><a class="reference internal" href="#surfaceexample">SurfaceExample</a></li>
<li><a class="reference internal" href="#openingmanimexample">OpeningManimExample</a></li>
</ul>
</li>
</ul>
</div>
</div>
</aside>
</main>
</div>
</body>
</html>