【manim動畫教程】--相機

来源:https://www.cnblogs.com/wang_yb/archive/2023/04/19/17334029.html
-Advertisement-
Play Games

相機(Camera)在二維的場景下使用不多,一般在3D場景中提及的比較多。 相機相當於我們看動畫的視角,簡單來理解的話,相當於我們的眼睛(實際情況會複雜一些,相機還有其他一些輔助功能)。 預設的相機焦點在屏幕的中心位置,相機預設是以俯視的視角查看所有的元素。 之前的介紹的常用動畫效果和高級動畫效果, ...


相機(Camera)在二維的場景下使用不多,一般在3D場景中提及的比較多。
相機相當於我們看動畫的視角,簡單來理解的話,相當於我們的眼睛(實際情況會複雜一些,相機還有其他一些輔助功能)。

預設的相機焦點在屏幕的中心位置,相機預設是以俯視的視角查看所有的元素。
之前的介紹的常用動畫效果高級動畫效果,都沒有對相機進行調整過,
所以,是通過移動和變換各個元素來實現動畫效果。

本篇介紹的相機,則是另一種製作動畫的方式,它不改變元素在屏幕或者說在坐標系中的位置,
通過改變相機的位置和角度來實現動畫效果。

舉個現實世界中的簡單例子,如果有個杯子,我們可以通過轉動杯子來從各個角度觀察杯子;
而如果是一棟樓的話,我們無法移動它,只能圍著樓走一圈來觀察它,這個過程就相當於移動相機。

下麵通過一些實例來看看移動相機帶來的不一樣的動畫效果。

1. 相機移動

相機移動常用的兩種方式:

  1. 移動焦點:改變相機的焦點,焦點在那個元素,那個元素就會在屏幕中心
  2. 改變視野:改變相機與元素的距離,離得越遠,物體越小。

1.1 移動焦點

manim中移動焦點要繼承 MovingCameraScene類,
然後通過 self.camera.frame.animate.move_to函數來移動焦點。

下麵的示例構造了一個正方形,一個三角形,然後通過改變焦點來形成元素移動的動畫。
實際上元素並沒有移動,它們的坐標始終沒變,變化的是相機的焦點。

class CameraSample1(MovingCameraScene):
    def _move_focus(self):
        s = Square(color=RED, fill_opacity=0.5)
        t = Triangle(color=GREEN, fill_opacity=0.5)
        vg = VGroup(s, t)
        vg.arrange(RIGHT, buff=MED_LARGE_BUFF)
        self.add(vg)

        self.play(self.camera.frame.animate.move_to(s))
        self.play(self.camera.frame.animate.move_to(t))
        self.play(self.camera.frame.animate.move_to(vg))

    def construct(self):
        self._move_focus()

        self.wait()

運行效果:
相機移動-移動焦點.gif

1.2 改變視野

改變視野通過 self.camera.frame.animate.set方法,通過這個方法設置視野的寬度,可以形成縮放元素的效果。

下麵的示例,通過改變視野的寬度,讓元素出現放大和縮小的現象,實際上元素並沒有變化。
變化的是相機到元素的距離。

class CameraSample1(MovingCameraScene):
    def _scale(self):
        s = Square(color=RED, fill_opacity=0.5)
        self.add(s)

        self.camera.frame.save_state()
        self.play(self.camera.frame.animate.set(width=s.width * 2))
        self.wait(0.3)
        self.play(self.camera.frame.animate.set(width=s.width * 8))
        self.wait(0.3)
        self.play(Restore(self.camera.frame))

    def construct(self):
        self._scale()

        self.wait()

運行效果:
相機移動-改變視野.gif

2. 鷹眼效果

鷹眼的效果是通過兩個相機來實現的,兩個相機的焦點一樣,但是視野不一樣。
鷹眼效果一般用在提供全局視圖的場合,特別是當元素特別多的時候。

下麵示例中,設置了兩個相機,縮放的參數為3,zoom_factor=3

class CameraSample2(ZoomedScene):
    def __init__(self, **kwargs):
        ZoomedScene.__init__(
            self,
            zoom_factor=3,
            zoomed_display_height=1,
            zoomed_display_width=2,
            image_frame_stroke_width=5,
            zoomed_camera_config={
                "default_frame_stroke_width": 3,
            },
            **kwargs
        )

    def construct(self):
        s = Square(color=RED, fill_opacity=0.5, side_length=1.5)
        t = Triangle(color=GREEN, fill_opacity=0.5).scale(0.5)
        vg = VGroup(s, t)
        vg.arrange(RIGHT, buff=SMALL_BUFF)
        self.add(vg)
        self.activate_zooming(animate=False)
        self.play(s.animate.shift(LEFT), t.animate.shift(RIGHT))
        self.play(s.animate.rotate(2 * PI / 3), t.animate.rotate(PI / 2))
        self.play(s.animate.shift(RIGHT), t.animate.shift(LEFT))
        self.wait()

運行效果:
鷹眼效果.gif

3. 追蹤物體

追蹤物體就是將相機的焦點定位在移動的物體上,就像我們坐在火車上的感覺一樣,那時,我們覺得火車沒動,而是車外的風景不斷向後移動。

下麵的示例是一個點沿著正弦曲線運動,我們將相機焦點定位在這個點上,感覺就像是曲線在移動。

class CameraSample3(MovingCameraScene):
    def construct(self):
        self.camera.frame.save_state()

        graph = FunctionGraph(
            lambda x: np.sin(x),
            x_range=[-3, 3],
            color=RED,
        )
        d = dot(graph.get_start())
        self.add(graph, d)

        self.play(self.camera.frame.animate.scale(0.5).move_to(d))

        def update_curve(mob):
            mob.move_to(d.get_center())

        self.camera.frame.add_updater(update_curve)
        self.play(MoveAlongPath(d, graph), rate_func=linear, run_time=2)
        self.camera.frame.remove_updater(update_curve)

        self.play(Restore(self.camera.frame))

運行效果:
追蹤物體.gif

4. 3D 場景

相機其實主要就是應用在3D場景中的,所以 manim的3D場景類 ThreeDScene中提供了一個非常方便的移動相機的方法 move_camera

下麵的示例中,我們用 move_camera方法來改變視角和調整視野。
示例中的球其實一直沒動,也就是球上各點的坐標沒有改變過。

class CameraSample4(ThreeDScene):
    def construct(self):
        axes = ThreeDAxes()
        sphere = Surface(
            lambda u, v: np.array(
                [
                    1.5 * np.cos(u) * np.cos(v),
                    1.5 * np.cos(u) * np.sin(v),
                    1.5 * np.sin(u),
                ]
            ),
            v_range=[0, TAU],
            u_range=[-PI / 2, PI / 2],
            checkerboard_colors=[BLUE_D, BLUE_E],
            resolution=(15, 32),
        )
        self.add(axes, sphere)

        self.move_camera(phi=75 * DEGREES, theta=30 * DEGREES)
        self.move_camera(zoom=1.5)
        self.move_camera(zoom=0.5)
        self.wait()

運行效果:
3D場景.gif

5. 總結回顧

本篇介紹從另一種角度來實現動畫的方式,也就是不改變物體本身,而是改變觀察物體的方式。

manim中能夠操作相機的類主要有:

  1. MovingCameraScene:改變相機的焦點和視野
  2. ZoomedScene:增加多個相機,多個相機可以從不同的視角同時觀察物體
  3. ThreeDScene:3D場景下的相機操作

本文關聯的微信視頻號短視頻:
manim-相機-視頻號.png


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 更新完微信服務號的模板消息之後,我又趕緊把微信小程式的訂閱消息給實現了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 消息推送平臺🔥推送下發【郵件】【簡訊】【微信服務號】【微信小程式】【企業微信】【釘釘】等消息類型。 https://gitee.com/zhongfuch ...
  • 緩衝流 緩衝流, 也叫高效流, 按照數據類型分類: 位元組緩衝流:BufferedInputStream,BufferedOutputStream 字元緩衝流:BufferedReader,BufferedWriter 緩衝流的基本原理,是在創建流對象時,會創建一個內置的預設大小的緩衝區數組,通過緩衝 ...
  • 老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下麵是抄的一段StackOverflow的代碼...自己大修改過的,寫的註釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ...
  • 教程簡介 Windows 10開發入門教程 - 從簡單的步驟瞭解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制項,數據綁定,XAML性能,自適應設計,自適應UI,自適應代碼,文件管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ...
  • 簡單介紹十幾款常用的畫架構圖流程圖的軟體 draw.io draw.io是開源免費的線上畫圖工具,還提供桌面版本。 特性: 實時協作; 支持線上離線版本; 存儲支持多種方式:Google Drive, OneDrive, GitHub, GitLab, Dropbox等; 許多豐富的圖標庫。 Pro ...
  • Haskell語言線上運行編譯,是一款可線上編程編輯器,在編輯器上輸入Haskell語言代碼,點擊運行,可線上編譯運行Haskell語言,Haskell語言代碼線上運行調試,Haskell語言線上編譯,可快速線上測試您的Haskell語言代碼,線上編譯Haskell語言代碼發現是否存在錯誤,如果代碼 ...
  • Rust 實現的飛機游戲 簡介 一個使用 bevy 引擎製作的飛機游戲。 原視頻教程地址,github 地址。 因為 bevy 已經升級到 0.10.1 了,所以重新做一遍。順帶手出個教程。 下麵是做的部分變動: 將激光以及玩家的移動模塊進行了拆分。 新增了背景圖片。 新增了游戲狀態管理 Welco ...
  • 引言 推排序常常應用在操作系統的任務調度中,嘗試使用硬體對堆排序進行實現,在實現的過程中不使用function和tasks語法,即真·硬體實現 參考的博客 也就這一個博客有介紹 堆排序的Verilog實現 原理 ~~堆排序還需要複習一遍嗎?~~ 我肯定是要的 菜鳥-堆排序 圖解排序演算法(三)之堆排序 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...