15 ноября 2021

🎞️ Π˜Π·ΡƒΡ‡Π°Π΅ΠΌ manim. Π§Π°ΡΡ‚ΡŒ 1: основныС свСдСния ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ для Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ²

Π£Ρ‡Π΅Π½Ρ‹ΠΉ, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈ ΠΊ.Ρ‚.Π½. Π Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽ всякиС Π½Π°ΡƒΡ‡Π½Ρ‹Π΅ ΡˆΡ‚ΡƒΠΊΠΈ ΠΈ ΠΈΠ³Ρ€Π°ΡŽΡΡŒ Π²ΠΎ встраиваСмыС систСмы. УмСю Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ, ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈ чСртовски Ρ…ΠΎΡ€ΠΎΡˆ собой :) Π–ΠΈΠ²Ρƒ Π² России, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽ Π² ΠœΠ“Π’Π£ ΠΈΠΌ. Н.Π­. Π‘Π°ΡƒΠΌΠ°Π½Π°.
Manim – Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Python для создания матСматичСских Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΉ. Π’Ρ‹ навСрняка Π²ΠΈΠ΄Π΅Π»ΠΈ Ρ€ΠΎΠ»ΠΈΠΊΠΈ ΠΊΠ°Π½Π°Π»Π° 3Blue1Brown, Π°Π²Ρ‚ΠΎΡ€ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΈ написал Π΅Π΅ ΠΏΠ΅Ρ€Π²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ. ΠœΡ‹ ΠΆΠ΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ созданный сообщСством Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Ρ„ΠΎΡ€ΠΊ – manim community.
🎞️ Π˜Π·ΡƒΡ‡Π°Π΅ΠΌ manim. Π§Π°ΡΡ‚ΡŒ 1: основныС свСдСния ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ для Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ²

Установка Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ

Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² установки масса, Π½ΠΎ ΠΌΡ‹ рассмотрим установку Π½Π° Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΌΠ°ΡˆΠΈΠ½Ρƒ с ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмой Windows. Π”Ρ€ΡƒΠ³ΠΈΠ΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ. Для Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ функционирования Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ ffmpeg. ΠŸΡ€ΡΠΌΠ°Ρ ссылка для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ: https://www.gyan.dev/ffmpeg/builds/ffmpeg-release-essentials.7z.

Архив Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π°ΡΠΏΠ°ΠΊΠΎΠ²Π°Ρ‚ΡŒ Π² любоС мСсто Π½Π° дискС ΠΈ внСсти Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ срСды Path. Π§Ρ‚ΠΎΠ±Ρ‹ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΉΡ‚ΠΈ Π² свойства ΠΌΠΎΠ΅Π³ΠΎ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°, Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ систСмы, Π½Π°ΠΆΠ°Ρ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ срСды ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Path ΠΏΡƒΡ‚ΡŒ Π΄ΠΎ ΠΏΠ°ΠΏΠΊΠΈ ffmpeg/bin:

🎞️ Π˜Π·ΡƒΡ‡Π°Π΅ΠΌ manim. Π§Π°ΡΡ‚ΡŒ 1: основныС свСдСния ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ для Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ²

Π”Π°Π»Π΅Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ½ΡΡ‚Π°Π»Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ manim. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Π² основной систСмС ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ окруТСния. ПойдСм Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΡƒΡ‚Π΅ΠΌ.

  • Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΏΠ°ΠΏΠΊΡƒ для нашСго Π±ΡƒΠ΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° manim_ex.
  • ΠžΡ‚ΠΊΡ€ΠΎΠ΅ΠΌ консоль Π² Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠ΅ ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ: python -m venv env. Π­Ρ‚ΠΎ Π·Π°ΠΊΠ»ΠΈΠ½Π°Π½ΠΈΠ΅ создаст Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ с ΠΈΠΌΠ΅Π½Π΅ΠΌ env.
  • АктивируСм ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ: env\Scripts\activate.bat.
  • Установим саму Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ: pip install manim.
  • НС Π·Π°ΠΊΡ€Ρ‹Π²Π°ΠΉΡ‚Π΅ консоль, ΠΎΠ½Π° Π½Π°ΠΌ Π΅Ρ‰Π΅ пригодится.
НСобходимый ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ инсталлирован, Π½ΠΎ для ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ потрСбуСтся любой дистрибутив LaTeX. Π‘ΠΎΠ·Π΄Π°Ρ‚Π΅Π»ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ MikTeX ΠΈΠ·-Π·Π° простоты добавлСния Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ². Π‘ΠΊΠ°Ρ‡ΠΈΠ²Π°Π΅ΠΌ ΠΈ устанавливаСм Π΅Π³ΠΎ, Π½Π΅ Π·Π°Π±ΠΎΡ‚ΡΡΡŒ ΠΎ Π²Ρ‹Π±ΠΎΡ€Π΅. Когда manim Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ MikTeX ΠΈ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Ρ‚ Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π°, встроСнный ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ Π΅Π³ΠΎ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ.

На этом этапС ΠΌΡ‹ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ Π½Π°Ρ‡Π°Ρ‚ΡŒ знакомится с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ.

Hello world

Manim ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Ρ‚Ρ€ΠΈ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ:

  • mobject (mathematical object)
  • animations
  • scene
Π­Ρ‚ΠΈ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… классах: Mobject, Animation, Scene. ΠŸΡ€Π΅ΠΆΠ΄Π΅, Ρ‡Π΅ΠΌ ΡƒΠ³Π»ΡƒΠ±Π»ΡΡ‚ΡŒΡΡ Π² ΠΈΡ… структуру, сдСлаСм ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ hello-world.

Π’ ΠΏΠ°ΠΏΠΊΠ΅ manim-ex создадим Ρ„Π°ΠΉΠ» hello.py ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² Π½Π΅Π³ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ строки:

hello.py
        from manim import *
 
 
class SquareToStar(Scene):
    def construct(self):
        square = Square()
        square.set_fill(GREEN, opacity=0.5)
        self.play(Create(square))
    

Π”Π°Π»Π΅Π΅ возвращаСмся Π² ΠΎΡΡ‚Π°Π²Π»Π΅Π½Π½ΡƒΡŽ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ консоль ΠΈ выполняСм ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

        manim -pql .\hello.py SquareToStar
    

НачнСтся процСсс Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π°, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ автоматичСски откроСтся ΠΎΠΊΠ½ΠΎ с ΠΏΠΎΡ…ΠΎΠΆΠ΅ΠΉ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠ΅ΠΉ.

🎞️ Π˜Π·ΡƒΡ‡Π°Π΅ΠΌ manim. Π§Π°ΡΡ‚ΡŒ 1: основныС свСдСния ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ для Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ²

РазбСрСмся построчно, Ρ‡Ρ‚ΠΎ происходит.

        from manim import *
    

Π’ΡƒΡ‚ ΠΌΡ‹ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ всС, Ρ‡Ρ‚ΠΎ содСрТится Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Π² глобальноС пространство ΠΈΠΌΠ΅Π½. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ случаС это Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ»ΠΎΡ…ΠΎΠΉ ΠΈΠ΄Π΅Π΅ΠΉ, Π½ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽΡ‚ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡƒΡ‚ΡŒ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°, Π° Π½Π΅ ΠΏΠΎΠΈΠΌΠ΅Π½Π½ΠΎΠ΅ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, классов, констант. Π’Π΅Π΄ΡŒ для нашСго hello world ΠΌΡ‹ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ ΡƒΠΆΠ΅ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΈΠΌΠ΅Π½ΠΈ: Scene, Square, Green, Create.

        class SquareToStar(Scene):
    def construct(self):
    ...

    

Π’ этой конструкции ΠΌΡ‹ наслСдуСм ΠΎΡ‚ класса Scene, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ construct. Π’ Π½Π΅ΠΉ ΠΈ происходит сборка сцСны: Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², настройка ΠΈΡ… Π΄ΠΈΠ·Π°ΠΉΠ½Π° ΠΈ располоТСния, настройка Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ.

        square = Square()
square.set_fill(GREEN, opacity=0.5)
self.play(Create(square))
    

Π’ этих строках создаСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Square (ΠΎΠ½ ΠΆΠ΅ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚) ΠΈ устанавливаСтся Π·Π΅Π»Π΅Π½Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚ Π·Π°Π»ΠΈΠ²ΠΊΠΈ с ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΡΡ‚ΡŒΡŽ 0.5. Π’ послСднСй строкС Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° self.play() создаСтся анимация Create, которая постСпСнно проявляСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π° сцСнС.

УслоТним ΠΏΡ€ΠΈΠΌΠ΅Ρ€, сдСлав Ρ‚Ρ€Π°Π½ΡΡ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ созданного Π½Π°ΠΌΠΈ Π·Π΅Π»Π΅Π½ΠΎΠ³ΠΎ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π° Π² ΠΏΡΡ‚ΠΈΠΊΠΎΠ½Π΅Ρ‡Π½ΡƒΡŽ Π·Π²Π΅Π·Π΄Ρƒ с синим ΠΊΠΎΠ½Ρ‚ΡƒΡ€ΠΎΠΌ ΠΈ Π±Π΅Π· Ρ„ΠΎΠ½Π°, которая послС исчСзнСт. Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:

hello.py
        from manim import *
 
 
class SquareToStar(Scene):
    def construct(self):
        square = Square()
        square.set_fill(GREEN, opacity=0.5)
        star = Star(outer_radius=2, color = BLUE)
        self.play(Create(square)) 
        self.play(Transform(square, star))
        self.play(FadeOut(square))
    

НС Π·Π°Π±Ρ‹Π²Π°Π΅ΠΌ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

        manim -pql .\hello.py SquareToStar
    

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ:

🎞️ Π˜Π·ΡƒΡ‡Π°Π΅ΠΌ manim. Π§Π°ΡΡ‚ΡŒ 1: основныС свСдСния ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ для Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ²

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ

ПослС запуска послСднСго заклинания Π² ΠΏΠ°ΠΏΠΊΡƒ с ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ добавилась дирСктория media. Π’Π½ΡƒΡ‚Ρ€ΠΈ Π½Π΅Π΅ Π»Π΅ΠΆΠ°Ρ‚ ΠΎΡ‚Ρ€Π΅Π½Π΄Π΅Ρ€Π΅Π½Π½Ρ‹Π΅ части нашСй сцСны ΠΈ собранный ΠΈΡ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΉΠ». Найти Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ media\videos\hello, Π³Π΄Π΅ Π±ΡƒΠ΄ΡƒΡ‚ созданы ΠΏΠ°ΠΏΠΊΠΈ, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΌΡƒ качСству Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π°.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹ΠΌ ΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π±Π»ΠΎΠΊΠΎΠΌ любой сцСны manim являСтся mobject.

Π’Π°ΠΊΠΈΠ΅ элСмСнты, ΠΊΠ°ΠΊ Circle, Axis, Rectangle, Arrow ΠΈ Star, ΡΠ²Π»ΡΡŽΡ‚ΡΡ mobject. MObject – Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ прСдставлСния абстрактный класс, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ всС ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π²Ρ‹ΡˆΠ΅ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹. ΠŸΡ€ΠΈ этом стоит ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ всС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ manim Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π²Π΅ΠΊΡ‚ΠΎΡ€Π½Ρ‹ΠΌΠΈ. Для простоты понимания ΠΏΠΎΠΊΠ° опустим этот ΠΌΠΎΠΌΠ΅Π½Ρ‚. Π‘ΡƒΠ΄Π΅ΠΌ всСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ понятиС mobject, хотя фактичСски Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ ΠΎ Π΅Π³ΠΎ Π²Π΅ΠΊΡ‚ΠΎΡ€Π½ΠΎΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅.

РасполоТСниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ mobject Π½Π° экранС, Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ add нашСй сцСны. Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ сцСну, Π³Π΄Π΅ Π·Π²Π΅Π·Π΄Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΈΠ΄ΠΈΠΌΠ° ΠΎΠ΄Π½Ρƒ сСкунду, Π° послС исчСзнСт. Код Π΄Π°ΠΆΠ΅ Π½Π΅ нуТдаСтся Π² коммСнтариях. Π’ Π½ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΉΠ» mobjects.py помСстим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

mobjects.py
        from manim import *
 
class CreatingMObjects(Scene):
    def construct(self):
        star = Star()
        self.add(star)
        self.wait(1)
        self.remove(star)
        self.wait()

    
🎞️ Π˜Π·ΡƒΡ‡Π°Π΅ΠΌ manim. Π§Π°ΡΡ‚ΡŒ 1: основныС свСдСния ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ для Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ²

Π”ΠΎΠ±Π°Π²ΠΈΠΌ Π² этот ΠΆΠ΅ Ρ„Π°ΠΉΠ» Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ сцСну:

mobjects.py
        class Shapes(Scene):
    def construct(self):
        star = Star()
        square = Square()
        circle = Circle()
 
        circle.shift(LEFT)
        star.shift(UP)
        square.shift(RIGHT)
 
        self.add(star, square, circle)
        self.wait(1)

    

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

🎞️ Π˜Π·ΡƒΡ‡Π°Π΅ΠΌ manim. Π§Π°ΡΡ‚ΡŒ 1: основныС свСдСния ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ для Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ²

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² Π½Π°Ρ‡Π°Π»ΠΎ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ сцСны, располоТСнноС Π² Π΅Π΅ Ρ†Π΅Π½Ρ‚Ρ€Π΅. Для измСнСния полоТСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², manim ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… способов. ΠœΡ‹ использовали Π½ΠΎΠ²Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ любого mobject – shift(vector). Он сдвигаСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π° ΠΎΠ΄Π½Ρƒ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ Π² сторону ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π²Π΅ΠΊΡ‚ΠΎΡ€Π° ΠΈΠ»ΠΈ суммы Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ². Π’ нашСй сцСнС созданы ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π·Π²Π΅Π·Π΄Ρ‹, ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π° ΠΈ ΠΊΡ€ΡƒΠ³. Π—Π²Π΅Π·Π΄Π° Π±Ρ‹Π»Π° сдвинута Π²Π»Π΅Π²ΠΎ Π½Π° ΠΎΠ΄Π½Ρƒ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ, ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ – Π²ΠΏΡ€Π°Π²ΠΎ, ΠΊΡ€ΡƒΠ³ – Π²Π»Π΅Π²ΠΎ. ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Ρ‹ UP, RIGHT, LEFT входят Π² состав Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ manim ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой numpy ndarray. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, UP выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

        UP: np.ndarray = np.array((0.0, 1.0, 0.0))
    

Рассмотрим Π΄Ρ€ΡƒΠ³ΠΈΠ΅ способы, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π½Π° сцСнС. Π­Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ mobject: move_to(), align_to(), next_to().

Π”ΠΎΠ±Π°Π²ΠΈΠΌ Π½ΠΎΠ²ΡƒΡŽ сцСну Π² Ρ„Π°ΠΉΠ» mobjects.py. Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π½Π° Π½Π΅ΠΉ Ρ‚Π΅ ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Ρ‡Ρ‚ΠΎ ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ: Π·Π²Π΅Π·Π΄Ρƒ, ΠΎΠΊΡ€ΡƒΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚:

mobjects.py
        class ShapesPlacement(Scene):
    def construct(self):
        star = Star()
        square = Square()
        circle = Circle()
 
        star.move_to(LEFT * 2)  # ΡΠ΄Π²ΠΈΠ½ΡƒΡ‚ΡŒ Π·Π²Π΅Π·Π΄Ρƒ Π½Π° Π΄Π²Π΅ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ Π²Π»Π΅Π²ΠΎ
        square.next_to(star, LEFT)  # ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ слСва ΠΎΡ‚ Π·Π²Π΅Π·Π΄Ρ‹
        circle.align_to(star, LEFT)  # Π²Ρ‹Ρ€ΠΎΠ²Π½ΡΡ‚ΡŒ Π»Π΅Π²ΡƒΡŽ Π³Ρ€Π°Π½ΠΈΡ†Ρƒ ΠΊΡ€ΡƒΠ³Π° с Π»Π΅Π²ΠΎΠΉ Π³Ρ€Π°Π½ΠΈΡ†Π΅ΠΉ Π·Π²Π΅Π·Π΄Ρ‹
        self.add(star, square, circle)
        self.wait(1)

    

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ:

🎞️ Π˜Π·ΡƒΡ‡Π°Π΅ΠΌ manim. Π§Π°ΡΡ‚ΡŒ 1: основныС свСдСния ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ для Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ²

ΠœΠ΅Ρ‚ΠΎΠ΄ move_to() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹Π΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹, Ρ‚.Π΅. ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π°Ρ‡Π°Π»Π° ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚. next_to() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π΅ΠΌΡƒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ. align_to() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π»Π΅Π²ΡƒΡŽ Π³Ρ€Π°Π½ΠΈΡ†Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² для выравнивания ΠΏΠΎ Π½ΡƒΠΆΠ½ΠΎΠΉ сторонС. Для расчСтов полоТСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚, описанный Π²ΠΎΠΊΡ€ΡƒΠ³ любого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° сцСны. Π•Π³ΠΎ Π½Π΅ Π²ΠΈΠ΄Π½ΠΎ, Π½ΠΎ это Ρ„ΠΈΡˆΠΊΠ° Π΄Π²ΠΈΠΆΠΊΠ° Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.

Π‘Ρ‚ΠΈΠ»ΡŒ ΠΈ порядок отобраТСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΡΡ‚ΠΈΠ»ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹: set_stroke(), set_fill() ΠΈ set_color().

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ сцСну ShapesStyle со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ содСрТимым:

mobjects.py
        class ShapesStyle(Scene):
    def construct(self):
        star = Star().shift(LEFT)
        square = Square().shift(RIGHT)
        circle = Circle().shift(UP)
 
        star.set_color(RED)
        square.set_fill(color=YELLOW, opacity=0.5)
        circle.set_stroke(PINK, width=20)
 
        self.add(star, square, circle)
        self.wait(1)
    

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ manim ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ chaining.

🎞️ Π˜Π·ΡƒΡ‡Π°Π΅ΠΌ manim. Π§Π°ΡΡ‚ΡŒ 1: основныС свСдСния ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ для Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ²
        star = Star().shift(LEFT)
    
  • set_stroke() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для установки Ρ€Π°ΠΌΠΊΠΈ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Ρ‚ΠΎΠ»Ρ‰ΠΈΠ½Ρ‹ ΠΈ Ρ†Π²Π΅Ρ‚Π°.
  • set_color() измСняСт Ρ†Π²Π΅Ρ‚ ΠΎΠ±Π²ΠΎΠ΄ΠΊΠΈ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹.
  • set_fill() заполняСт Ρ„ΠΈΠ³ΡƒΡ€Ρƒ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠΌ с Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΡΡ‚ΡŒΡŽ Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΎΡ‚ 0.0 (ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΉ) Π΄ΠΎ 1.0 (ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π½Π΅ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΉ).

Как Π±Ρ‹ это странно Π½ΠΈ выглядСло, Π½ΠΎ Π² manim Ρ‚Ρ€ΠΈ оси, Π° Π½Π΅ Π΄Π²Π΅. Π’Ρ€Π΅Ρ‚ΡŒΡ ось, которая смотрит Π½Π° Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»Ρ пСрпСндикулярно плоскости ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π°, ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° порядок отобраТСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π½Π° сцСнС. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ, достаточно ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ порядок ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ сцСны add(). ИзмСним Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΊΠΎΠ΄Π΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΡΠ»Π΅Π΄Π½ΡŽΡŽ строку Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ:

        self.add(circle, star, square)
    
🎞️ Π˜Π·ΡƒΡ‡Π°Π΅ΠΌ manim. Π§Π°ΡΡ‚ΡŒ 1: основныС свСдСния ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ для Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ²

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ послСдний ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ списка оказался Π½Π° самом Π²Π΅Ρ€Ρ…Ρƒ. Π£ нас это ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚.

Анимации

НаконСц ΠΌΡ‹ с Π²Π°ΠΌΠΈ Π΄ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ Π΄ΠΎ самого сочного, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π² этой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ – Π΄ΠΎ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΉ.

Π§Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ сцСны play(). Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π½ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΉΠ» manim_animations.py ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² Π½Π΅Π³ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:

manim_animations.py
        from manim import *
 
class ShapeAnimation(Scene):
    def construct(self):
        square = Square()
        self.add(square)
        self.play(FadeIn(square))
        self.play(Rotate(square, PI/4))
        self.play(FadeOut(square))
        self.wait(1)
    

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ:

🎞️ Π˜Π·ΡƒΡ‡Π°Π΅ΠΌ manim. Π§Π°ΡΡ‚ΡŒ 1: основныС свСдСния ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ для Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ²

РазбСрСмся ΠΏΠΎ строкам, Ρ‡Ρ‚ΠΎ здСсь происходит:

  1. Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π°.
  2. ДобавляСм Π΅Π³ΠΎ Π² Π½Π°Ρ‡Π°Π»ΠΎ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ сцСны.
  3. ΠŸΡ€ΠΎΠΈΠ³Ρ€Ρ‹Π²Π°Π΅ΠΌ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ FadeIn (появлСниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°).
  4. ΠŸΡ€ΠΎΠΈΠ³Ρ€Ρ‹Π²Π°Π΅ΠΌ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ Rotate (ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°) Π½Π° ΡƒΠ³ΠΎΠ» PI/4.
  5. ΠŸΡ€ΠΎΠΈΠ³Ρ€Ρ‹Π²Π°Π΅ΠΌ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ FadeOut (исчСзновСниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°).
  6. Π–Π΄Π΅ΠΌ ΠΎΠ΄Π½Ρƒ сСкунду.

FadeIn ΠΈ FadeOut ΠΏΠ»Π°Π²Π½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΎΡ‚ 0 Π΄ΠΎ 1 ΠΈ 1 Π΄ΠΎ 0 соотвСтствСнно.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, любоС свойство mobject, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈ Π°Π½ΠΈΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° animate(). Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π½ΠΎΠ²ΡƒΡŽ сцСну, Ρ‡Ρ‚ΠΎΠ±Ρ‹ это ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π”ΠΎΠ±Π°Π²ΠΈΠΌ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ красного Ρ†Π²Π΅Ρ‚Π°, ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ Π΅Π³ΠΎ Ρ†Π²Π΅Ρ‚ ΠΈ смСстим с ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚ Π½Π° ΠΎΠ΄Π½Ρƒ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ Π²Π²Π΅Ρ€Ρ….

manim_animations.py
        class ShapePropsAnimation(Scene):
    def construct(self):
        square = Square().set_fill(BLUE, opacity=1.0)
        self.add(square)
 
        self.play(square.animate.set_fill(RED))
        self.wait(1)
 
        self.play(square.animate.shift(UP).rotate(PI/3))
        self.wait(1)
    

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

🎞️ Π˜Π·ΡƒΡ‡Π°Π΅ΠΌ manim. Π§Π°ΡΡ‚ΡŒ 1: основныС свСдСния ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ для Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ²
  • animate() – это свойство любого mobject, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π°Π½ΠΈΠΌΠΈΡ€ΡƒΠ΅Ρ‚ всС, Ρ‡Ρ‚ΠΎ ΠΈΠ΄Π΅Ρ‚ Π·Π° Π½ΠΈΠΌ ΠΏΠΎ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅. НапримСр, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π°Π½ΠΈΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свойство set_fill(WHITE), Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΅Π³ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:
        animate.set_fill(WHITE)
    

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, всС ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Π΅ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π² play() Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠΈΠ³Ρ€Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΎΠ΄Π½Ρƒ сСкунду. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ это врСмя, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ run_time. Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π½ΠΎΠ²ΡƒΡŽ сцСну, Ρ‡Ρ‚ΠΎΠ±Ρ‹ это ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

manim_animations.py
        class ShapeRunTimeAnimation(Scene):
    def construct(self):
        square = Square()
        self.add(square)
        self.play(square.animate.shift(UP), run_time=3)
        self.wait()
    

Π’ΡƒΡ‚ анимация двиТСния ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π° длится Π½Π΅ ΠΎΠ΄Π½Ρƒ сСкунду, Π° Ρ‚Ρ€ΠΈ.

🎞️ Π˜Π·ΡƒΡ‡Π°Π΅ΠΌ manim. Π§Π°ΡΡ‚ΡŒ 1: основныС свСдСния ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ для Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ²
Π₯отя manim ΠΈΠΌΠ΅Π΅Ρ‚ мноТСство встроСнных Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΉ, Π²Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡ… Π½Π΅ Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ. Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ собствСнныС, придСтся ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈ собствСнного наслСдника класса Animation, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ interpolate_mobject(). Он ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ alpha, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ начинаСтся с 0 ΠΈ измСняСтся Π½Π° протяТСнии всСй Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ. Manim прСдоставляСт этот ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ interpolate_mobject() Π½Π° основС частоты ΠΊΠ°Π΄Ρ€ΠΎΠ² Π²ΠΈΠ΄Π΅ΠΎ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ воспроизвСдСния Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ. Он измСняСтся 0 Π΄ΠΎ 1 ΠΈ скрываСт ΠΏΠΎΠ΄ собой ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ врСмя Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ. Π’.Π΅. 0 – Π½Π°Ρ‡Π°Π»ΠΎ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ, 0.5 – сСрСдина, 1 – ΠΊΠΎΠ½Π΅Ρ†.

Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° создадим Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ прСобразования ΠΎΠ΄Π½ΠΎΠ³ΠΎ числа Π² Π΄Ρ€ΡƒΠ³ΠΎΠ΅. Π’ manim присутствуСт анимация этой трансформации, FadeTransform, Π½ΠΎ ΠΎΠ½Π° ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ ΠΎΠ΄Π½ΠΎ число Π² Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Ρ‡Π΅Ρ€Π΅Π· исчСзновСниС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΈ появлСниС Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ. ΠœΡ‹ сдСлаСм ΠΏΠΎ-Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ. ΠŸΡƒΡΡ‚ΡŒ наша трансформация Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ счСтчик ΠΎΡ‚ стартового Π΄ΠΎ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ числа. Для этого создадим класс CountAnimation, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся наслСдником Animation.

Для ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ понимания, рассмотрим ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ alpha.

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ прСобразования числа 50 Π² число 100. Π’ΠΎΠ³Π΄Π° alpha Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ значСния:

  • alpha = 0, Ρ‚ΠΎΠ³Π΄Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ равняСтся 50, Ρ‚.Π΅. стартовому.
  • alpha = 0.5, Ρ‚ΠΎΠ³Π΄Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ равняСтся 75.
  • alpha = 1, Ρ‚ΠΎΠ³Π΄Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ равняСтся 50, Ρ‚.Π΅. ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌΡƒ.

ΠœΡ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ со стартового числа ΠΈ добавляСм Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Ρ€Π°Π·Π½ΠΈΡ†Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠ½Ρ†ΠΎΠΌ ΠΈ Π½Π°Ρ‡Π°Π»ΠΎΠΌ, которая Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π² соотвСтствии с Π°Π»ΡŒΡ„Π°-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ. Π˜Ρ‚Π°ΠΊ, Π»ΠΎΠ³ΠΈΠΊΠ° вычислСния числа для отобраТСния Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ шагС Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ:

50+alphaβ‹…(100βˆ’50)

Π Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ классы Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ ΠΈ сцСны. Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Ρ„Π°ΠΉΠ» count_animation.py Π² ΠΏΠ°ΠΏΠΊΠ΅ с ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ:

count_animation.py
        from manim import *
 
class CountAnimation(Animation):
    def __init__(self, number: DecimalNumber, start: float, end: float, **kwargs) -> None:
        super().__init__(number, **kwargs)
        self.start = start
        self.end = end
   
    def interpolate_mobject(self, alpha: float) -> None:
        value = self.start + (alpha * (self.end - self.start))
        self.mobject.set_value(value)
 
 
class CustomCountingScene(Scene):
    def construct(self):
        number = DecimalNumber().set_color(WHITE).scale(5)
        number.add_updater(lambda number: number.move_to(ORIGIN))
 
        self.add(number)
        self.wait()
        self.play(CountAnimation(number, 0, 100), run_time=4, rate_func=linear)
        self.wait()
    

DecimalNumber – это Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Mobject. Наша анимация ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π² свой конструктор ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ number, ΠΈ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Π΅ значСния ΠΎΡ‚ 0 Π΄ΠΎ 100, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ 4 сСкунды, Π° ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ прСобразования Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ:

🎞️ Π˜Π·ΡƒΡ‡Π°Π΅ΠΌ manim. Π§Π°ΡΡ‚ΡŒ 1: основныС свСдСния ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ для Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ²

Врансформации

Врансформация – это Ρ‚ΠΎΠΆΠ΅ анимация, которая ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ ΠΎΠ΄ΠΈΠ½ mobject Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ. Π’ самом Π½Π°Ρ‡Π°Π»Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΌΡ‹ с Π²Π°ΠΌΠΈ использовали Ρ‚Ρ€Π°Π½ΡΡ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π° Π² Π·Π²Π΅Π·Π΄Ρƒ.

Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, создадим Ρ‚Ρ€Π°Π½ΡΡ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π° Π² ΠΊΡ€ΡƒΠ³ Π² Π½ΠΎΠ²ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ transform.py со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ содСрТимым:

transform.py
        from manim import *
 
 
class SquareToCircleScene(Scene):
    def construct(self):
        square = Square().set_fill(BLUE, opacity=1.0)
        circle = Circle().set_fill(RED, opacity=1.0)
        self.add(square)
        self.play(Transform(square, circle), run_time=2)
        self.wait()

    

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

🎞️ Π˜Π·ΡƒΡ‡Π°Π΅ΠΌ manim. Π§Π°ΡΡ‚ΡŒ 1: основныС свСдСния ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ для Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ²

Π”Ρ€ΡƒΠ³ΠΈΠ΅ трансформации ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

***

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΡΡ‚Π°Ρ‚ΡŒΡΡ… Ρ†ΠΈΠΊΠ»Π° ΠΌΡ‹ рассмотрим Π±ΠΎΠ»Π΅Π΅ слоТныС аспСкты использования Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ manim. Π£Π΄Π°Ρ‡ΠΈ Π² ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠΈ!

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹:

ΠœΠ•Π ΠžΠŸΠ Π˜Π―Π’Π˜Π―

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

Π’ΠΠšΠΠΠ‘Π˜Π˜

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ вакансию
Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ C++
Москва, ΠΏΠΎ ΠΈΡ‚ΠΎΠ³Π°ΠΌ собСсСдования

Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•