? 虛幻UE4中如何采集360度全景圖片和VR視頻 - 納金網
聯系我們

給我們留言

聯系我們

地址:福建省晉江市青陽街道洪山路國際工業設計園納金網

郵箱:info@narkii.com

電話:0595-82682267

(周一到周五, 周六周日休息)

當前位置:主頁 > 3D教程 > 圖文教程

虛幻UE4中如何采集360度全景圖片和VR視頻

來源: 52vr | 責任編輯:傳說的落葉 | 發布時間: 2019-06-18 09:55 | 瀏覽量:

如何使用虛幻4來制作一個VR視頻播放器呢,簡單來講,使用虛幻4的視頻采集插件來獲取圖像,并對圖像進行處理,就能獲取我們需要的圖像了,下一步,你可以把圖像投影到一個360度球體上,就能形成球形的播放器了。

虛幻UE4中如何采集360度全景圖片和VR視頻

1.插件測試—采集單幀雙眼圖像

打開Epic Games Launcher,啟動引擎(我使用的版本為4.14.0)。在彈出的對話框中點擊New Project標簽欄,再選擇C++標簽頁,選擇Vehicle Advanced模板,并將項目命名為STEREOSCOPIC。最后點擊CreateProject。 

 UE4中采集360°全景圖片和視頻

在打開的編輯器菜單欄依次點擊Edit→Plugins,然后選擇左側的Movie Capture,在右側Stereo Panoramic Movie Capture條目中勾選Enabled。然后重啟編輯器。 
當編輯器重啟后,再次點擊Edit→Plugins→Movie Capture,再次檢查Stereo Panoramic Movie Capture是否已啟用。 
在工具欄,依次點擊Blueprints→OpenLevelBlueprint。在Event BeginPlay事件后,新建兩個(具體依據需求而定)Execute Console Command節點保存我們需要執行的命令。 
這里先進行采集測試,將下面這兩條命令分別放入Execute Console Command節點中:

[代碼]:

1 <font size="3">SP.OutputDir D:/StereoCaptureFrames
2 // 采集單幀
3 SP.PanoramicScreenshot</font>

 

如下圖所示: 

 UE4中采集360°全景圖片和視頻

然后就可以點擊工具欄的Play按鈕了。此時系統可能會長時間沒有響應(一分鐘左右),然后將會有兩幀圖像存儲到先前用SP.OutputDir指定的目錄中(實際是在改目錄中的一個日期與時間目錄下,點擊一次Play生成一個),一個是左眼圖像,一個是右眼圖像。 

 UE4中采集360°全景圖片和視頻

2.在項目中集成插件

首先將引擎中的全景采集插件(Stereo Panomic Movie Capture)備份,再將整個插件目錄剪切(注意是剪切,而不是復制)出來,一是供我們修改,二是防止和我們自己編譯有沖突。Unreal引擎中的插件在路徑\Epic Games\4.14\Engine\Plugins下,在這里我們需要將其中的StereoPanorama(\Plugins\Experimental\StereoPanorama)剪切出來。 
然后打開Stereo項目文件夾,在文件夾根目錄下新建一個Plugins文件夾,將上一步剪切的StereoPanorama文件夾粘貼到這里。目錄結構示例如下(限于篇幅這里只列出了必要的文件): 

 UE4中采集360°全景圖片和視頻

打開項目的場景編輯器,依次點擊Editor→Plugins→Project→MovieCaputure,啟用Stereo Panoramic Movie Caputure,然后重啟項目。再次檢查Stereo Panoramic Movie Capture是否被啟用。 
項目編輯器中,依次點擊File→OpenVisualStudio,在VS工程中,依次點擊Solution→Games→STEREOSCOPIC→Config,打開DefaultEngine.ini文件,在該文件末尾添加如下文字。

[代碼]:

1 <font size="3">[Plugins]
2 +EnabledPlugins=StereoPanorama</font>

 

如下所示(截圖是添加插件后的工程,默認沒有Plugins): 

 UE4中采集360°全景圖片和視頻

 

為了強制打包項目的時候插件能夠和項目相連,在VS工程中,依次點擊Solution→Games→STEREOSCOPIC→Source→STEREOSCOPIC→STEREOSCOPIC.Build.cs文件中添加模塊依賴項。

[代碼]:

1 <font size="3"> PrivateDependencyModuleNames.AddRange(new string[] { "StereoPanorama" });</font>

如下所示: 

 UE4中采集360°全景圖片和視頻

關閉Visual Studio和UE4編輯器,并重啟。重啟之后可以發現VS工程中已經添加了Plugins文件夾和StereoPanorama插件。

3將左右眼圖像自動組合成單一圖像

在VS工程中,依次打開Solution→Games→STEREOSCOPIC→Plugins→StereoPahorama→Source→StereoPahorama\Private,打開文件SceneCapture.cpp文件。全部修改工作均在次完成。

為了使我們能夠方便地控制合成的開關,我們需要定義一個bool常量在文件的頭部,這樣,在我們不需要開啟合并的時候修改該常量的值即可,不必再修改其余的代碼。

[代碼]:

1 <font size="3">// Newly inserted code.Defined a const bool
2 const bool CombineAtlasesOnOutput = true;</font>

 

現在我們需要在代碼中有條件地禁用每只眼睛的輸出(通過上面定義的CombineAtlasesOnOutput來控制)。然后找到USceneCapturer::SaveAtlas()的底部,找到這樣一段代碼:

 

[代碼]:

1 <font size="3">IImageWrapperPtr ImageWrapper = ImageWrapperModule.CreateImageWrapper( EImageFormat::PNG );
2 ImageWrapper->SetRaw(SphericalAtlas.GetData(), SphericalAtlas.GetAllocatedSize(), SphericalAtlasWidth, SphericalAtlasHeight, ERGBFormat::BGRA, 8);
3 const TArray<uint8>& PNGData = ImageWrapper->GetCompressed(100);
4 FFileHelper::SaveArrayToFile( PNGData, *AtlasName );</uint8></font>

 

這幾行代碼就是控制左右眼輸出的,如果我們定義的CombineAtlasesOnOutput為true,就意味這我們需要合并兩張眼睛的圖像,那么我們就需要禁掉它(左右單獨輸出),如果為false則我們需要輸出左右眼的單獨序列幀,所以就需要執行它。 

綜上,可以寫一個if語句來判斷CombineAtlasesOnOutput的值:

[代碼]:

1 <font size="3">IImageWrapperPtr ImageWrapper = ImageWrapperModule.CreateImageWrapper( EImageFormat::PNG );
2 if (!CombineAtlasesOnOutput)
3 {
4     ImageWrapper->SetRaw(SphericalAtlas.GetData(), SphericalAtlas.GetAllocatedSize(), SphericalAtlasWidth, SphericalAtlasHeight, ERGBFormat::BGRA, 8);
5     const TArray<uint8>& PNGData = ImageWrapper->GetCompressed(100);
6     FFileHelper::SaveArrayToFile(PNGData, *AtlasName);
7 }</uint8></font>

 

這樣會導致一個錯誤,因為PNGData是在if的作用域內定義的,如果執行到了if后(被釋放掉)或者根本沒有執行到(if判斷為false(!true))就會導致后面對PNGData的使用造成錯誤。 

在上面if語句之后的代碼塊中對PNGData的使用處為:

[代碼]:

01 <font size="3">if (FStereoPanoramaManager::GenerateDebugImages->GetInt() != 0)
02 {
03     FString FrameStringUnprojected = FString::Printf(TEXT("%s_%05d_Unprojected.png"), *Folder, CurrentFrameCount);
04     FString AtlasNameUnprojected = OutputDir / Timestamp / FrameStringUnprojected;
05  
06     ImageWrapper->SetRaw(SurfaceData.GetData(), SurfaceData.GetAllocatedSize(), UnprojectedAtlasWidth, UnprojectedAtlasHeight, ERGBFormat::BGRA, 8);
07     const TArray<uint8>& PNGDataUnprojected = ImageWrapper->GetCompressed(100);
08     // 原來的代碼為 FFileHelper::SaveArrayToFile(PNGData, *AtlasNameUnprojected);
09     FFileHelper::SaveArrayToFile(PNGDataUnprojected, *AtlasNameUnprojected);
10 }</uint8></font>

 

對禁用左右眼單幀輸出部分,如果只寫這部分代碼,現在再執行采集是不會有任何有意義圖像輸出的(因為現在已經把左右眼輸出禁用了)。下面繼續搞將兩張合并到一塊的方法。 

查找代碼:

[代碼]:

1 <font size="3">TArray<fcolor> SphericalLeftEyeAtlas  = SaveAtlas( TEXT( "Left" ), UnprojectedLeftEyeAtlas );
2         TArray<fcolor> SphericalRightEyeAtlas = SaveAtlas(TEXT("Right"), UnprojectedRightEyeAtlas);</fcolor></fcolor></font>

 

在其后添加:

[代碼]:

01 <font size="3">//*NEW* - Begin
02 if (CombineAtlasesOnOutput)
03 {
04     TArray<fcolor> CombinedAtlas;
05     CombinedAtlas.Append(SphericalLeftEyeAtlas);
06     CombinedAtlas.Append(SphericalRightEyeAtlas);
07     IImageWrapperPtr ImageWrapper = ImageWrapperModule.CreateImageWrapper(EImageFormat::JPEG);
08     ImageWrapper->SetRaw(CombinedAtlas.GetData(), CombinedAtlas.GetAllocatedSize(), SphericalAtlasWidth, SphericalAtlasHeight * 2, ERGBFormat::BGRA, 8);
09     const TArray<uint8>& PNGData = ImageWrapper->GetCompressed(100);
10     // Generate name
11     FString FrameString = FString::Printf(TEXT("Frame_%05d.jpg"), CurrentFrameCount);
12     FString AtlasName = OutputDir / Timestamp / FrameString;
13     FFileHelper::SaveArrayToFile(PNGData, *AtlasName);
14     ImageWrapper.Reset();
15  
16 }
17 //*NEW* - END</uint8></fcolor></font>

 

此時在VS工程中編譯項工程STEREOSCOPIC,并重啟UE4編輯器和VS,就會采集并將左右眼合并成一張圖片了。 

 UE4中采集360°全景圖片和視頻

參考連接:https://imzlp.me/2016/09/05/capturing-stereoscopic-360-screenshots-videos-movies-unreal-engine-4/

翻譯整理:zhuxiaoyang2000

相關文章
網友評論

您需要登錄后才可以發帖 登錄 | 立即注冊

關閉

全部評論:0條

推薦
熱門
淑女派对电子
四方棋牌李逵劈鱼 赛车单双大小技巧 股票行情今天涨停股票 浙江6+1走势图表 意甲尤文图斯赛程 至尊棋牌豪华版官网 山西大唐麻将安卓版官方网站 安徽十一选五任五走势 今晚福建体彩31选7开奖结果 刮刮乐教程 麻将棋牌神助手视频 广西快乐10分开奖走势图 黑龙江6+1开奖号 1zplay电竞比分安卓版 福建快3计划 竞彩足球历史数据