diff --git a/docs/source/getting_started/learning_by_example.rst b/docs/source/getting_started/learning_by_example.rst index 96de24dd..dee86d7c 100644 --- a/docs/source/getting_started/learning_by_example.rst +++ b/docs/source/getting_started/learning_by_example.rst @@ -1,13 +1,19 @@ Learning by Example =================== -You create videos in manim by writing :class:`~scene.scene.Scene` instances. -``example_scenes.py`` contains a few simple ones that we can use to learn about -manim. For instance, take ``SquareToCircle``. +SquareToCircle +-------------- + +``example_scenes.py`` contains simple examples that we can use to learn about manim. + +Go ahead and try out the ``SquareToCircle`` scene by running it with ``$ manim example_scenes.py SquareToCircle -p`` +in manim directory. .. code-block:: python :linenos: + from manimlib.imports import * + class SquareToCircle(Scene): def construct(self): circle = Circle() @@ -20,115 +26,106 @@ manim. For instance, take ``SquareToCircle``. self.play(Transform(square, circle)) self.play(FadeOut(square)) -:meth:`~scene.scene.Scene.construct` specifies what is displayed on the screen -when the :class:`~scene.scene.Scene` is rendered to video. You can render a -:class:`~scene.scene.Scene` by running ``extract_scene.py``. Run ``python -extract_scene.py -h`` to see how it's used. - -.. code-block:: none - - > python extract_scene.py -h - usage: extract_scene.py [-h] [-p] [-w] [-s] [-l] [-m] [-g] [-f] [-t] [-q] [-a] - [-o OUTPUT_NAME] [-n START_AT_ANIMATION_NUMBER] - [-r RESOLUTION] [-c COLOR] [-d OUTPUT_DIRECTORY] - file [scene_name] - - positional arguments: - file path to file holding the python code for the scene - scene_name Name of the Scene class you want to see - - optional arguments: - -h, --help show this help message and exit - -p, --preview - -w, --write_to_movie - -s, --show_last_frame - -l, --low_quality - -m, --medium_quality - -g, --save_pngs - -f, --show_file_in_finder - -t, --transparent - -q, --quiet - -a, --write_all - -o OUTPUT_NAME, --output_name OUTPUT_NAME - -n START_AT_ANIMATION_NUMBER, --start_at_animation_number START_AT_ANIMATION_NUMBER - -r RESOLUTION, --resolution RESOLUTION - -c COLOR, --color COLOR - -d OUTPUT_DIRECTORY, --output_directory OUTPUT_DIRECTORY - -The most common flags are ``-p``, to automatically play the generated video, -``-l``, to render in lower quality in favor of speed, and ``-s``, to show the -last frame of the :class:`~scene.scene.Scene` for faster development. Run -``python extract_scene.py example_scenes.py SquareToCircle -pl`` to produce a -file called SquareToCircle.mp4 in the media directory that you have configured, -and automatically play it. - .. raw:: html - + -Let's step through each line of the :class:`~scene.scene.Scene`. Lines 3 and 4 -instantiate a :class:`~mobject.geometry.Circle` and -:class:`~mobject.geometry.Square`, respectively. Both of these subclass -:class:`~mobject.mobject.Mobject`, the base class for objects in manim. Note + +.. note:: + + The flag ``-p`` plays the rendered video with default video player. + + Other frequently used flags are: + + * ``-l`` for rendering video in lower resolution (which renders faster) + * ``-s`` to show the last frame of the video. + + Run ``manim -h`` all the available flags (``python -m manim -h`` if you installed it to a venv) + + +Let's step through each line of ``SquareToCircle`` + +.. code-block:: python + :lineno-start: 3 + + class SquareToCircle(Scene): + +You create videos in manim by writing :class:`~scene.scene.Scene` classes. + +Each :class:`~scene.scene.Scene` in manim is self-contained. That means everything +you created under this scene does not exist outside the class. + +.. code-block:: python + :lineno-start: 4 + + def construct(self): + +:meth:`~scene.scene.Scene.construct` specifies what is displayed on the screen +when the :class:`~scene.scene.Scene` is rendered to video. + +.. code-block:: python + :lineno-start: 5 + + circle = Circle() + square = Square() + +``Circle()`` and ``Square()`` create :class:`~mobject.geometry.Circle` and :class:`~mobject.geometry.Square`. + +Both of these are instances of :class:`~mobject.mobject.Mobject` subclasses, the base class for objects in manim. Note that instantiating a :class:`~mobject.mobject.Mobject` does not add it to the :class:`~scene.scene.Scene`, so you wouldn't see anything if you were to render the :class:`~scene.scene.Scene` at this point. .. code-block:: python - :linenos: - :lineno-start: 3 - - circle = Circle() - square = Square() - -Lines 5, 6, and 7 apply various modifications to the mobjects before animating -them. The call to :meth:`~mobject.mobject.Mobject.flip` on line 5 flips the -:class:`~mobject.geometry.Square` across the RIGHT vector. This is equivalent -to a refection across the x-axis. Then the call to -:meth:`~mobject.mobject.Mobject.rotate` on line 6 rotates the -:class:`~mobject.geometry.Square` 3/8ths of a full rotation counterclockwise. -Finally, the call to :meth:`~mobject.mobject.Mobject.set_fill` on line 7 sets -the fill color for the :class:`~mobject.geometry.Circle` to pink, and its -opacity to 0.5. - -.. code-block:: python - :linenos: - :lineno-start: 5 + :lineno-start: 7 square.flip(RIGHT) square.rotate(-3 * TAU / 8) circle.set_fill(PINK, opacity=0.5) -Line 9 is the first to generate video. -:class:`~animation.creation.ShowCreation`, -:class:`~animation.transform.Transform`, and -:class:`~animation.creation.FadeOut` are -:class:`~animation.animation.Animation` instances. Each -:class:`~animation.animation.Animation` takes one or more -:class:`~mobject.mobject.Mobject` instances as arguments, which it animates -when passed to :meth:`~scene.scene.Scene.play`. This is how video is typically -created in manim. :class:`~mobject.mobject.Mobject` instances are automatically -added to the :class:`~scene.scene.Scene` when they are animated. You can add a -:class:`~mobject.mobject.Mobject` to the :class:`~scene.scene.Scene` manually -by passing it as an argument to :meth:`~scene.scene.Scene.add`. +``flip()`` ``rotate()`` ``set_fill()`` apply various modifications to the mobjects before animating +them. The call to :meth:`~mobject.mobject.Mobject.flip` flips the +:class:`~mobject.geometry.Square` across the RIGHT vector. This is equivalent +to a refection across the x-axis. + +The call to :meth:`~mobject.mobject.Mobject.rotate` rotates the +:class:`~mobject.geometry.Square` 3/8ths of a full rotation counterclockwise. + +The call to :meth:`~mobject.mobject.Mobject.set_fill` sets +the fill color for the :class:`~mobject.geometry.Circle` to pink, and its opacity to 0.5. .. code-block:: python - :linenos: - :lineno-start: 9 + :lineno-start: 11 self.play(ShowCreation(square)) self.play(Transform(square, circle)) self.play(FadeOut(square)) -:class:`~animation.creation.ShowCreation` draws a -:class:`~mobject.mobject.Mobject` to the screen, -:class:`~animation.transform.Transform` morphs one -:class:`~mobject.mobject.Mobject` into another, and -:class:`~animation.creation.FadeOut` fades a -:class:`~mobject.mobject.Mobject` out of the :class:`~scene.scene.Scene`. Note -that only the first argument to :class:`~animation.transform.Transform` is -modified, and the second is not added to the :class:`~scene.scene.Scene`. After -line 10 is executed ``square`` is a :class:`~mobject.geometry.Square` instance -with the shape of a :class:`~mobject.geometry.Circle`. +To generated animation, :class:`~animation.animation.Animation` classes are used. + +Each :class:`~animation.animation.Animation` takes one or more :class:`~mobject.mobject.Mobject` instances as arguments, which it animates +when passed to :meth:`~scene.scene.Scene.play`. This is how video is typically +created in manim. + +:class:`~mobject.mobject.Mobject` instances are automatically +added to the :class:`~scene.scene.Scene` when they are animated. You can add a +:class:`~mobject.mobject.Mobject` to the :class:`~scene.scene.Scene` manually +by passing it as an argument to :meth:`~scene.scene.Scene.add`. + + +:class:`~animation.creation.ShowCreation` draws a :class:`~mobject.mobject.Mobject` to the screen. + +:class:`~animation.transform.Transform` morphs one :class:`~mobject.mobject.Mobject` into another. + +:class:`~animation.creation.FadeOut` fades a :class:`~mobject.mobject.Mobject` out of the :class:`~scene.scene.Scene`. + +.. note:: + + Only the first argument to :class:`~animation.transform.Transform` is modified, + the second is not added to the :class:`~scene.scene.Scene`. :class:`~animation.tranform.Transform` + only changes the appearance but not the underlying properties. + + After the call to ``transform()`` ``square`` is still a :class:`~mobject.geometry.Square` instance + but with the shape of :class:`~mobject.geometry.Circle`. diff --git a/docs/source/installation/mac.rst b/docs/source/installation/mac.rst index 07915a0e..86ce8afa 100644 --- a/docs/source/installation/mac.rst +++ b/docs/source/installation/mac.rst @@ -1,4 +1,12 @@ Mac === -A stub for mac installation +The simplest way to install the system dependencies on Mac OS X is with Homebrew. +Mac come preinstalled with python2, but to use manim, python3 is required + +1. Install python3 https://docs.python.org/3/using/mac.html +2. Install Cairo: ``brew install cairo`` +3. Install Sox: ``brew install sox`` +4. Install ffmpeg: ``brew install ffmpeg`` +5. Install latex (MiKTeX): https://miktex.org/howto/install-miktex-mac +6. Install manimlib ``pip install manimlib`` (or ``pip install --user manimlib`` to just yourself)