3ds max 的 VR 全景 Viewport 擷取工具(附帶影片生成)

最近公司開始越來越多 VR 的案子,看有些只是要確認動態的 previz,也必須用 Vray 算出來很浪費時間。最近了解到 windows 的 command line 的強大後,測試一下發現要寫出生成 VR viewport 影片其實不會太艱難,便著手進行。

由於對於 Maxscript 不是很深入,在這次寫工具的過程中遇到一些關卡,在這邊筆記下來。


最後完成的工具如上圖:

指定要擷取的攝影機,給予檔名路徑,選擇是否縮放尺寸,指定截圖品質,選擇是否要算成影片,影片品質,是否保留截圖序列,是否只擷取 Geometry,擷取的時間範圍。

Script 的整體流程是,創造六個攝影機綁在指定攝影機上,擷取六個方位截圖,產生 Cubemaps,再把 Cubemaps 轉換成 Equirectangular 形式,最後再算成影片檔。


遇到的第一個問題便是產生的 Cubemaps 怎麼轉換成 Equirectangular?

在經過多方資料參考後,按照這個網址的解答去製作了 maxscript 版本的算式。問題是,maxscript 的 bitmap 可撐不住這種算法,一般尺寸就會運算很久,所以果斷放棄。

後來不斷尋覓一些可以從 command line 執行的轉換程式,找到一個非常理想的程式叫做 krpanotools,裡面便含有一個cube2sphere的exe檔,去做輕便並快速的轉換。

而且這個程式是讀取六張單張個別的 Cubemap,所以我不用在 maxscript 先行合併起來,省去了一段 maxscript 運算緩慢的時間。


另外要把轉換出來的圖像序列,在編碼成 H.264 影片,畢竟這種 VR 全景的預覽,都是要丟給 GearVR 或者 Kolor 播放器,這邊便使用了已經封裝好的 ffmpeg去做處理,相當簡單方便。

剩下的就是去做 maxscript 跟 windows command line 的整合,並去隱藏或者命名一些檔案讓整個程序看起來簡化一些。


在流程方面的關卡都解決後,遇到擷取 viewport 畫面的問題,要怎麼去偵測使用者的 viewport 設定,並去關閉 viewport 上不必要的資訊,甚至取消背景的漸層,統一 viewport 的燈光,才能讓六張截圖完美融接。

程式碼有大半的行數都是花在這上面:擷取設定->覆蓋設定->(截圖)->還原設定。

尤其有一部份必須調用 DialogMonitorOPS 去做設定,這部分整理了很久才做出很簡潔的 Fuction 去處理。

如果有興趣的話,這邊是 Script 原始檔,可能還有很多 Bug,僅供參考。