999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于Blender的虛擬攝影機插件開發

2022-09-28 02:44:44
現代電影技術 2022年9期
關鍵詞:動畫用戶

胡 冰

北京影潤文化傳播有限公司,北京 102600

1 引言

攝影機作為影像創作的基本工具,決定了影視內容呈現的視角與方式。隨著時代的進步,無論是藝術創作者還是觀眾,都對畫面的呈現方式有著更高的要求與期待。以往那些難以通過實景拍攝獲得的鏡頭效果,在數字技術的加持下,正在被逐一攻克。

圖1 The Third Floor在 《復仇者聯盟》中應用Tech Vis虛擬攝影機

當觀眾身處影院跟隨疾馳的車輛穿過槍林彈雨,或是與各種科幻角色一起遨游太空,這些緊張刺激的畫面視角,都離不開虛擬攝影機的協助。所謂虛擬攝影機,是指在三維或視效軟件中虛構的攝影機對象,它們可以在三維空間內任意移動而不受物理上的限制,從而實現對數字場景的鏡頭化表達。不僅是在影視制作的后期階段,隨著Tech Vis等視效預覽技術的廣泛應用,虛擬攝影機還能為實景拍攝提供參考依據,或作為Motion Control機械臂的數據來源。因此,能夠便捷高效地應用虛擬攝影機工具,對現今的影視創作與拍攝都有著重要的意義。

2 痛點與解決方案

盡管當今的三維與合成類軟件都內置有攝像機(Camera)視角以及時間線動畫功能,然而在使用它們創建攝影機動畫時都需要較為繁瑣的操作步驟。更為重要的是,普通的三維動畫師往往并不具備十分專業的鏡頭語言表達能力,使得他們難以創建流暢、聚焦且引人入勝的鏡頭運動效果。因此,對現有制作軟件的功能進行擴展,使其能夠實現更加快捷、靈活、專業的虛擬鏡頭創建,就變得非常有價值。

針對上述需求,市場上已經存在部分面向主流DCC(Digital Content Creation)軟件的虛擬攝影機插件產品,但在靈活性方面往往無法滿足工作室用戶的特定需求,且在采購成本上對于擁有大量工作站的工作室并不友好。因此,在實際項目中,大多數視效與動畫工作室都會采取自研的方式進行開發,并將相關任務委派給Pipeline TD,即管線技術指導進行完成。Pipeline TD在接到開發任務后,會遵循以下三個步驟展開工作:插件需求設計、宿主軟件擴展性調研,以及最終為實現插件功能編寫代碼。

2.1 插件需求設計

對于這款虛擬攝影機插件,其應具備兩類基本功能。首先,通過包含一些經典、常用的攝影機運動方式預設,幫助用戶便捷高效地創建拍攝鏡頭;另一方面,允許用戶通過將三維空間內可自定義的平滑曲線作為攝影機的運動軌道,實現類似 “飛貓”的高空繩索攝影機視角,從而創建靈活度更高、視覺效果更加震撼的鏡頭語言。下文中,將以 “Movie-Cam”命名并指代此虛擬攝影機插件。

2.2 Blender開發擴展性調研

2.2.1 宿主軟件選擇

相對于傳統影視制作中剪輯、調色等相對孤立的制作流程,視效與動畫行業的內容生產則包含諸多環環相扣的緊密流程,即所謂管線 (pipeline)的概念。因此,與之對應的,專業DCC軟件在其架構設計上就是面向制作管線的,通常都會提供非常全面、豐富的API開發接口,以滿足行業用戶對于自定義工作流程與生產效率方面的嚴苛要求。

對于像Maya、3ds Max、Houdini這類商業軟件,無論是其API接口還是代碼調試,相關支持都已十分成熟。近年來,隨著開源生態的發展壯大,越來越多的內容創作者將目光投向Blender。作為一款免費開源的DCC軟件,Blender同時具備建模、動畫、視效合成等功能。根據Blender基金會官方發布的數據,在2020年期間,其軟件官網下載量超過1400萬次。選擇將Blender作為虛擬攝影機插件的宿主平臺,可顯著降低工作室的軟件采購成本,但在此之前,需要對其開發擴展支持做深入研究。

2.2.2 Blender Python API模塊構成

在Blender軟件的官方文檔中有這樣的描述:“能夠使用Blender標準UI實現的功能,都能夠通過對Blender API的調用來實現。”為此,Blender內置了豐富的開發接口。其中,“bpy”作為Blender Python API的主模塊,包含了對Blender主要功能的調用接口。根據用途的不同,它們被劃分為9類功能模塊。

(1)上下文模塊 (bpy.context):提供了對上下文狀態及屬性的訪問。它將根據Blender軟件當前所處的操作模式提供不同的成員選項。需要注意的是以上下文方式訪問的值僅可只讀。

(2)數據訪問模塊 (bpy.data):提供了對Blender項目工程中全部數據的可讀寫訪問接口。

(3)消息總線模塊 (bpy.msgbus):當使用數據API修改Blender項目中數據塊 (datablocks)的屬性時,消息總線系統可用于接收通知提醒。

(4)操作符模塊 (bpy.ops):提供基于Python訪問的可調用操作符 (Operators),它們由C、Python或宏語言編寫,并以bpy.ops作為訪問路徑。

(5)類型模塊 (bpy.types):以類 (Class)的形式提供了對Blender內置數據結構的抽象。

(6)實用工具模塊 (bpy.utils):提供了諸如功能類注冊、資源路徑查找等非Blender項目數據相關的實用工具函數。

(7)路徑工具模塊 (bpy.path):類似于Python標準庫中的os.path模塊,包含了用于處理與Blender路徑解析相關的實用工具函數。

(8)應用程序數據模塊 (bpy.app):用于獲取Blender應用程序及其內部組件的相關運行配置信息。

(9)屬性定義模塊 (bpy.props):用于通過自定義屬性對Blender內部數據進行擴展。

從上述模塊組件的描述中可以看出,Blender插件的開發采用面向對象的方式。Blender Python API通過預置類提供對軟件功能的整合與擴展。用戶通過創建子類來繼承父類中預先定義的屬性和方法,它們實現了與Blender程序間的交互接口。在上述模塊組件的基礎上,通過對其各自函數接口的深入調研后發現,Blender對于虛擬攝影機插件所涉及的對象創建、屬性變更、時間線與關鍵幀設置等操作都提供有相應的API調用接口,可以滿足需求設計中各項功能的實現。

2.2.3 Blender內置開發支持

在掌握了Blender開發接口的能力后,還需要對其代碼調試的支持情況進行評估。任何程序的開發都不是一蹴而就,在編寫代碼的同時,還伴隨著對程序功能、執行流程的持續測試與驗證。Blender軟件默認提供了一個名為 “Scripting”的腳本調試工作區,其中分別包含有一個交互式命令行、一個文本編輯器以及一個操作執行信息窗口。

圖2 Blender腳本調試工作區

當Blender應用啟動時,其內嵌的Python解釋器也會同步運行。用戶可通過交互式命令行執行單步腳本指令,并借助其代碼自動補全功能,更便捷地檢索對象的屬性、方法等關鍵字信息。由于Blender API的結構龐大復雜,且在不斷擴充,部分接口功能并未在官方文檔中詳細闡述。因此,在插件的實際開發過程中,很多函數及屬性信息,都是借助交互式命令行的關鍵字提示功能,結合單詞語義推測獲取的。

相較于交互式命令行,Blender內置的文本編輯器則允許批量調試、運行多行代碼。開發者可通過工作區左下角的信息窗口查看單行或多行代碼的執行情況。此外,在Blender軟件的用戶偏好設置中,提供了 “開發者附加內容”(Developer Extras)與“Python工具提示”(Python Tooltips)選項。開啟后,當鼠標指針懸停在軟件界面任意控件的上方時,將會顯示該UI控件所對應編程接口的調用路徑,用戶通過上下文菜單還可在文本編輯器中直接查看并修改對應的Blender源代碼。

綜上所述,作為一款開源DCC軟件,Blender已經具備了較為完善的開發擴展支持能力,在滿足虛擬攝影機插件開發需求的同時,也能為開發者帶來良好的調試體驗。

2.3 Blender虛擬攝影機插件開發流程

2.3.1 Blender插件基本結構

一個標準的Blender插件通常由四部分代碼段所構成。首先是插件的元數據部分,由一個名為bl_info的字典變量構成,其中包含有當前插件的名稱、開發者、版本、界面位置等基礎信息,用戶在安裝插件時可從中獲取有關此插件的基本信息。

第二部分則包含了插件各項功能的實現代碼,通常由操作子類 (Operator Subclass)與函數構成,例如對場景中對象屬性的變更或是創建時間線動畫等。第三部分是用戶交互界面代碼,開發者在這部分代碼中對插件的按鈕、滑塊、復選框等操作控件進行布局,同時將之前已創建的功能子類或函數綁定至相關的UI控件之上。

最后一部分則是插件的功能注冊模塊,包含register與unregister兩個預置函數,用于對插件中自定義屬性、操作子類以及鍵盤布局等項目在運行環境中的注冊與注銷。當用戶在Blender軟件中激活或禁用指定插件時,將會分別調用它們。

2.3.2 搭建外部開發環境

盡管Blender軟件內置了便于腳本調試的交互式界面,但當進行插件這類結構化代碼的編寫時,仍然需要搭建一套專注可靠的開發環境。Movie-Cam插件選擇使用Visual Studio Code作為代碼編輯器,并搭配微軟官方的Python擴展插件。在配置好Python解釋器后,為了獲得針對Blender API模塊的代碼提示等功能,還需要安裝名為 “fakebpy-module”的Python軟件包。具體安裝指令為:

CMD∶>pip install fake-bpy-module-latest。

當Blender插件的外部開發環境搭建完成后,應詳細記錄所涉及到的各軟件版本信息,以便在后期代碼調試或版本迭代過程中保持一致。以下為Movie-Cam插件開發時的環境版本信息:

Windows 10專業版21 H2(19044.1889);

Blender v3.2.2;

Python v3.10.6 64bit;

Visual Studio Code v1.70.1;

fake-bpy-module-latest(20220815)。

2.3.3 虛擬攝影機插件功能實現

以下將分別闡述Movie-Cam插件主要功能模塊所涉及的技術要點與代碼實現。

圖3 Movie-Cam插件功能模塊圖

(1)導入跟蹤攝影機

為了能夠更加精準地識別和操控虛擬攝影機對象,將其與Blender軟件中的默認攝像機進行區分,在編寫代碼前,需要先使用Blender應用為Movie-Cam插件創建一套單獨的外部資產。

此外部資產由三類對象組成,首先是一個標準的攝像機對象,用于實現基本拍攝參數的設置;其次,是一個攝影機造型的網格模型,便于用戶更好地識別和選定虛擬攝影機;最后則是一個球狀空物體,作為虛擬攝影機的目標跟蹤對象。通過將攝影機網格模型與攝像機對象設定為父子關系,以實現兩者間的綁定。同時,利用物體的約束 (Constraint)屬性將虛擬攝影機的鏡頭朝向始終跟隨至球狀空物體,以便用戶只需操作球狀空物體,即可控制虛擬攝影機的拍攝視角。對于上述資產對象,都為其設置了專屬的命名空間,從而為后續的代碼編寫提供便利。

圖4 Movie-Cam插件外部資產模型

接下來便進入到功能代碼的開發。由于Blender Python API提供了面向對象的功能綁定,因此在大多數情況下,插件的功能模塊都是透過子類繼承的方式予以實現。首先通過繼承 類創建一個標準的操作子類,并調用Blender的追加 (Append)功能將先前創建的虛擬攝影機資產以集合 (Collection)的形式整體導入到當前場景中。此部分代碼應用了 模塊內的resource_path方法,實現對Movie-Cam插件所附帶資產的路徑解析。

(2)創建攝影機動畫預置

此功能模塊提供了不同類型的攝影機動畫預置方案,當用戶導入虛擬攝影機后,便可從中選擇所需的運動效果快速創建專業的拍攝鏡頭。

通過 接口模塊,Blender允許開發者為項目場景、網格、骨骼等對象創建自定義的屬性字段,用于存放特定用途的元數據信息。Movie-Cam插件分別包含一個枚舉類型 (EnumProperty)的自定義場景屬性用于保存不同的攝影機動畫預置方案,以及一個整型 (IntProperty)自定義場景屬性用來保存攝影機動畫的持續幀數。通過 接口模塊創建的屬性字段將一同被保存在Blender項目工程中,且當為插件創建交互界面時,Blender將根據自定義屬性的數據類型自動匹配相應的UI控件。通常情況下,自定義屬性的初始化代碼應置于插件的register函數內,以確保相關變量在插件加載時同步注冊。

此處以滑動變焦 (Dolly zoom)動畫預置為例介紹其功能實現。Dolly zoom也常被稱作 “希區柯克變焦”,它通過鏡頭焦距與攝影機位間的反向變化,使得拍攝畫面產生一種連續的透視變形,來營造迷離、眩暈的鏡頭質感。

首先,需根據用戶所設定的動畫持續幀數 ,換算出攝影機對象的移動距離。對于幀速率為25FPS的項目,可設定為每經歷1秒 (即25幀),攝影機與空物體間的距離在原有基礎上增加20%。然后,基于此設定求解出攝影機移動該段距離后所處的空間向量坐標。由于該坐標位于球狀空物體與攝影機當前位置所構成的空間直線的延長線上,因此可通過空間直線的方向向量公式 (式1)求解出移動相應距離后的攝影機空間坐標。

當計算得出攝影機的目標空間向量坐標后,還需要獲取隨攝影機移動過程中鏡頭焦距的持續變化值。精確的鏡頭焦距改變量可通過攝影機與被攝物體間距離、被攝物體 (前景)在實際空間與像場中大小等參數計算得出。為了簡化代碼實現的復雜度,在Movie-Cam插件中直接將鏡頭焦距的改變值應用到攝影機動畫的出點關鍵幀。從實際效果來看,在常用鏡頭焦段下,可以獲得比較滿意的透視變形效果。式2為簡化后的Dolly zoom鏡頭焦距計算公式。

在上述功能的代碼實現中,使用了Blender提供的獨立數學工具模塊mathutils來對攝影機、空物體等對象的空間向量進行定義與計算。

對于攝影機動畫關鍵幀的創建,Blender提供了keyframe_insert方法來為當前對象在時間線中插入關鍵幀。需要注意的是,由于空間坐標位置與攝影機鏡頭焦距分別歸于不同的對象屬性類型 (物體對象與攝像機對象),故需要分別為這兩類數據屬性設定關鍵幀。

至此,滑動變焦這一攝影機動畫預置便創建完成。開發者還可根據需要創建更多的攝影機預置動畫效果,并添加至 自定義枚舉屬性中。

(3)繩索攝影機動畫

相較于之前的攝影機動畫預置,繩索攝影機模塊提供了更為靈活的拍攝視角設定。其實現原理主要基于Blender的鉗制 (Clamp To)約束功能。通過將跟蹤攝影機鉗制約束到一條路徑曲線 (NURBS Path)上,便可將攝影機的移動軌跡與之綁定。用戶可根據需要在三維空間中自由設定路徑曲線的走向,從而創建比現實中高空繩索攝影機更具視覺沖擊力的鏡頭效果。

圖5 繩索攝影機應用場景

此功能模塊在編寫時有兩處細節需要注意:首先,應確保攝影機對路徑曲線的鉗制約束優先于對球狀空物體的標準跟隨 (Track To)約束,否則可能導致攝影機對球狀空物體的跟蹤異常。其次,在創建標準跟隨約束后,還需要在代碼中明確指定跟隨軸(Track Axis)與向上 (Up)局部軸的屬性參數以確保攝影機鏡頭視角對跟蹤空物體的正確朝向。

與攝影機動畫預置模塊類似,通過分別創建的三個操作子類,結合動畫持續幀數自定義場景屬性,即可實現對時間線入點、出點以及動畫播放的控制。

(4)動畫曲線插值模式切換

當攝影機運動動畫創建完成后,Blender會根據所設定的關鍵幀自動創建一條動畫曲線,稱作 “FCurve”。F-Curve基于關鍵幀之間的插值生成,它能夠幫助用戶更加便捷、平滑地控制動畫對象的運動趨勢。

默認情況下,F-Curve采用類似貝塞爾曲線(Bezier)的軌跡設置動畫插值,即運動物體在整個動畫行程中是逐漸加速或減速的。然而對于某些應用場景,使用者更希望攝影機始終保持勻速運動,這時便需要將F-Curve的插值方式從默認的貝塞爾曲線更改為線性 (Linear)模式,Movie-Cam插件通過一個開關選項允許用戶在這兩種模式間任意切換。

首先,在代碼的注冊段新建一個名為 的自定義場景屬性,并將其設定為布爾類型。對于大部分自定義屬性類型,Blender都提供有一個update參數,用于當屬性值發生改變時,調用指定的函數執行操作。因此,相應地創建一個名為 的函數,當的值為True時,將當前攝影機動畫曲線的插值方式設定為線性,反之亦然。

對于已創建的攝影機動畫,Blender會為每一個運動屬性值設置對應的F-Curve通道,并將插值模式保存于動畫曲線所覆蓋的每個關鍵幀中。因此,函數必須要分別遍歷攝影機對象每個F-Curve通道中的全部關鍵幀,并改變其插值屬性。

圖6 Blender曲線編輯器

當用戶通過插件切換攝影機動畫插值模式時,可在Blender的曲線編輯器 (Graph Editor)中直接觀察到F-Curve的曲率變化。

(5)構建UI操作面板

在完成了Movie-Cam插件主要功能部分的編寫后,便是對用戶交互界面的創建。Blender提供了 類用于創建UI操作面板,并通過預置的變量參數設定UI面板在軟件界面中的呈現位置。對于Movie-Cam這類場景輔助類插件,通常都會將其操作面板安放在3D視口的側邊欄處顯示。

圖7 Movie-Cam插件操作面板

此后,使用類中的draw方法來為UI面板繪制控件并配置布局。開發者即可以將先前創建的操作子類以按鈕的形式添加至操作面板中,也可以直接使用Blender中的預置屬性或用戶自定義屬性作為UI面板中的字段控件。當使用屬性字段時,面板類會自動根據屬性的數據類型匹配相應的UI控件。例如此前所創建的枚舉型、整型以及布爾型自定義場景屬性,分別會以下拉列表、數值滑塊以及復選框的形式在UI面板中對應呈現。

由于Blender在繪制UI面板時,采用即時刷新機制。因此,在面板類中,還可以應用條件判斷及數值綁定等手段,實現更為復雜的面板布局顯示控制。

(6)鏡頭焦距快捷菜單

在現實拍攝中,攝影師會借助不同焦段的鏡頭實現不同的景別視角。同樣,Movie-Cam插件參照ARRI Master Prime定焦鏡頭組中的幾個常用焦段,創建了四個操作子類,用于將跟蹤攝影機的鏡頭焦距分別設定至27mm、40mm、75mm以及100mm。

Blender提供了一種稱作輪盤菜單 (Pie Menus)的交互界面,允許用戶通過快捷鍵在3D視口中將其呼出,并在幾個預設選項間快速切換。類似于視口操作面板,首先通過繼承 類實例化一個菜單子類,并將其UILayout界面布局類型設定為menu_pie。之后,便可將之前創建的四組鏡頭焦距操作子類指派到所創建的輪盤菜單中。

圖8 鏡頭焦距快捷菜單

接下來,還需要為這個輪盤菜單綁定快捷鍵。Blender對其插件采用獨立的鍵盤映射,以避免與主程序內置的鍵盤映射產生沖突。因此需要為Movie-Cam插件創建一個專屬的鍵盤映射,指定其作用域為3D視口,即僅在3D視口處于激活狀態時響應用戶的快捷鍵指令。此處,選擇將Shift+F作為新的快捷鍵組合添加到鍵盤映射中,并設定其執行指令為呼出鏡頭焦距輪盤菜單。最后,將上述配置對象追加至插件的鍵盤映射列表 [addon_keymaps]中即可。應當注意的是,在插件末尾的注銷函數段,同樣需要將之前配置的快捷鍵映射清除以釋放資源。

3 結語

最終編寫完成的代碼及虛擬攝影機資產文件以zip方式打包后,即可作為插件供Blender安裝使用。Movie-Cam插件從其開發工具到宿主平臺,均基于開源軟件打造和實現。為供廣大從業者使用和參考,現已將此插件免費開源發布。代碼網址:https://github.com/filmlight/movie-cam-addon。

當下,以虛擬攝制技術為代表的新技術的興起,促使傳統影視與CG動畫、數字游戲等領域在制作手段上有著越來越多的共通之處,Movie-Cam虛擬攝影機插件能夠同時為上述領域的內容生產帶來便利。后續,通過對該插件功能的進一步擴展,還可將其應用于Motion Control、教學演示等諸多場景。

猜你喜歡
動畫用戶
做個動畫給你看
動畫發展史
我的動畫夢
文苑(2019年22期)2019-12-07 05:28:56
動畫批評融入動畫教育的思考
新聞傳播(2018年3期)2018-05-30 07:01:39
關注用戶
商用汽車(2016年11期)2016-12-19 01:20:16
關注用戶
商用汽車(2016年6期)2016-06-29 09:18:54
我是動畫迷
學生天地(2016年9期)2016-05-17 05:45:06
關注用戶
商用汽車(2016年4期)2016-05-09 01:23:12
Camera360:拍出5億用戶
創業家(2015年10期)2015-02-27 07:55:08
100萬用戶
創業家(2015年10期)2015-02-27 07:54:39
主站蜘蛛池模板: 欧美va亚洲va香蕉在线| 无码粉嫩虎白一线天在线观看| 国产成人三级在线观看视频| 欧美精品H在线播放| 呦女亚洲一区精品| 国产免费福利网站| 99久久精品视香蕉蕉| 国产成人做受免费视频| 国产一在线| 国产亚洲精品自在线| 超碰精品无码一区二区| 91精品国产麻豆国产自产在线| 日本欧美中文字幕精品亚洲| 国内精品久久九九国产精品| 成人综合网址| 国产99视频免费精品是看6| 久久久久亚洲av成人网人人软件| 色综合国产| 欧美成人二区| 亚洲人成电影在线播放| 久久精品国产精品青草app| 久无码久无码av无码| 亚洲国产天堂久久九九九| 亚洲天堂视频网站| 久久久久久久久亚洲精品| 伊在人亚洲香蕉精品播放 | 亚洲乱码在线播放| 日韩精品少妇无码受不了| 免费一级α片在线观看| 亚洲伊人天堂| 日本不卡免费高清视频| 5388国产亚洲欧美在线观看| 欧美成人亚洲综合精品欧美激情| 另类综合视频| 免费在线不卡视频| 色妺妺在线视频喷水| 激情国产精品一区| 国产成人精品无码一区二| 国产91高跟丝袜| 在线看AV天堂| 国产视频自拍一区| 色爽网免费视频| 国产福利拍拍拍| 国产九九精品视频| 亚洲伦理一区二区| 亚洲永久色| 亚洲毛片一级带毛片基地| 亚洲国产中文精品va在线播放 | 久久综合亚洲色一区二区三区| 呦系列视频一区二区三区| 性69交片免费看| 久久无码高潮喷水| 手机精品视频在线观看免费| 国产亚洲精品97AA片在线播放| 国产精品嫩草影院视频| 自偷自拍三级全三级视频| 亚洲综合香蕉| 国产成a人片在线播放| 最新国产午夜精品视频成人| 亚洲色成人www在线观看| 国产乱子伦精品视频| 99久久精品免费看国产电影| 精品少妇人妻一区二区| 国产区福利小视频在线观看尤物| 成人字幕网视频在线观看| 国产9191精品免费观看| 久久性视频| 亚洲国产午夜精华无码福利| 九色视频线上播放| 日本手机在线视频| 69av免费视频| 国产91精品调教在线播放| 午夜精品久久久久久久99热下载 | 日本一区二区三区精品国产| 国产精品成| 99久久国产精品无码| 亚洲午夜天堂| 麻豆精品在线播放| 国产一区二区三区免费| 亚洲日韩精品无码专区97| 久草视频一区| 久久国产热|