Newtek NDI®とUnreal EngineでAR/VR を作ってみた
InterBEE 2021 (国際放送機器展)にCIS社の新製品Newtek NDI® 対応の4K60PカメラVCC-4KNDI、DCC-4KNDIを展示しました。カメラの展示というと何か撮って終わりというのが普通ですがそれでは芸がないのと、カメラには新機能があるのでそれを使ったアプリケーション展示の一例として簡単なバーチャルリアリティシステムを作ってみました。本当はグリーンバック使って合成したかったのですがブースの関係上そんなスペースも取れないのでARとして仕立ててみました。
ブースにその辺の説明を提示していなかった私が悪いのですが、極小スペースでそんなことやっていると来場者に気づかれずカメラ見てもLANケーブル1本しか出てないのでどうやっているのかわからない、そもそもNewtek NDI®って何ですか?という質問が多くなかなかシステムの説明までは辿り着けなかったというのが実状でした。反省を踏まえどうやってAR/VRシステムを作ったかをここで公開いたします。
■ バーチャルスタジオの基本構造
まず初めにテレビでよく見るバーチャルスタジオってどんな構造で作られているかを説明します。バーチャルリアリティの名のとおり現実空間と仮想空間を用意します。仮想空間を用意するというのはCGの空間ってことです。現実空間には実際にカメラを設置するのですが仮想空間にも同じ位置に仮想のカメラを設置します。この2つのカメラは全く同じスペックにする必要があります。スペックとはつまりイメージセンサーのサイズ、レンズの画角、焦点距離などです。これで両方のカメラで写したスケールが一致することになります。次に現実空間にあるカメラの位置や傾きを検出するトラッカーと呼ばれるものを使って同じ動きを仮想空間にあるカメラにシンクロさせます。最後に現実空間と仮想空間を合成して出来上がりです。
カメラを動かせば合成されたCGも同じように動いてテレビでよく見るようなバーチャルスタジオになります。あとはレンズのズームやフォーカスと連動してCGも動けばよりリアルに見えることになります。
■ バーチャルリアリティの構築にUnreal Engineを使う
こんなシステムの構築に何を使う?お高いんでしょ?と思いがちですがうってつけのプラットフォームが存在します。ゲームエンジンと呼ばれるEpic社のUnreal Engineというものです。
Epic Unreal Engine
外部リンクへ
ゲームエンジンとはその名の通りゲームを作るためのソフトウェアツールです。現在では実写かと見間違えるような描写がガンガン動くゲームがたくさんありますがそういったものもUnreal Engineのようなゲームエンジンで作られています。ハイフレームレートでリアルタイムに映像が動いてしまうのと最近ではレイトレーシングなど高品質な画像を実現する機能も盛り込まれているためゲーム業界だけでなく映像製作や建築シミュレーションなど他分野でも使われるようになっています。(最近だとインカメラVFXなんか注目されてますね。)いくつかのバーチャルスタジオシステムでは内部のエンジンにUnreal Engineが組み込まれていたりします。
というわけで、
・映像の入出力
・バーチャル空間(CG空間)の作成
・仮想カメラのコントロール
・実カメラのレンズ情報を取得
・実カメラの傾き、位置を取得
・合成(必要ならクロマキーなどの処理)
以上をUnreal Engineでまかないます。ってほとんどコレで作るような感じです。Unreal Engineにはプラグインという形で機能拡張できるようになっており、サードパーティ製の製品に対応させたり新しい機能を追加ということができる仕組みになっています。ちなみにUnreal Engineの個人利用は無償で、サポートを受けたいとか成果物を販売するようなときに何%かEpic社に支払う仕組みになっています。Unreal Engineの対抗馬であるUnity Technologies社のUnityも同じような感じです。
実際の動作環境は
CPU : Intel Core i7-5960X 3GHz
RAM : 32GB
GPU : NVIDIA Geforce 3080Ti 12GB
OS : Windows 10 Pro
Network : 1GB Ethernet(オンボード)
Unreal Engine : Ver 4.27
かなりへなちょこな構成です。CPUなんか数世代前です。マザーボードごと変えたい気分です。Unreal EngineはGPUを主に使うためグラフィクスボードだけは最新の強力なものを使います。とはいえ今回のプロジェクトはCPU20%くらい、GPU30%くらいの使用率でした。この辺りはプロジェクトの複雑さによって変わってきます。
■ 入力のカメラとしてNDI対応 CIS社 VCC-4KNDIを使う
Unreal Engineには外部から映像を取り込むことができます。制作用のカメラということであればSDI対応キャプチャーカードを使うことになります。AJA社のKONAカードとかBlackMagicDesign社のDeckLinkカードが一般的でUnreal Engineにそのプラグインがあります。今回はSDIではなく放送用IPであるNewtek NDI®を使っています。これならキャプチャカードが必要なくマザーボードのオンボードにある1Gb Ethernetで十分役割を果たします。
NDI対応 4K60P 18倍ズームレンズ搭載カメラ
CIS VCC-4KNDI, DCC-4KNDI レビュー
レビュー記事へ
使用したNDI®カメラはCIS社のVCC-4KNDIという4K/60Pに対応したBOXカメラです。NDIカメラというとPTZカメラばかりなのですが後述のトラッカーを使うためにはBOXタイプであることが都合が良かったりします。またVR/ARにはフレームレートが高い方が良く、60P以上が扱えることが重要です。NDIカメラにはNDI|HXというLong-GOPのコーデックを採用しているものがほとんどですがこのカメラはFull NDIを採用して高画質、低遅延を実現しています。VR/ARで使うことを考えるとシステム的に低遅延であることが望ましく、グリーンバックを使ってキーイングが必要な時には高画質であることが要件となります。Unreal Engineからも制御しやすい機能がカメラに備わっている上、PoEにも対応のため映像、制御、電源がLANケーブル一本で済ますことができます。
NDI SDK for Unreal Engine
外部リンクへ
NDI®をUnreal Engineで使うにはプラグインがNewtek社から提供されているのでそれをインストールします。現在のところUnreal Engineへの対応バージョンが4.25と4.26なのですが4.27で使おうとしてコンパイルが走ったので問題はなさそうと勝手に思ってます。VR/ARのソースとして使えるようにコードを書いていきます。Unreal EngineにはBlueprintというコードを視覚的に書いていく機能(実際には各機能のノードを繋いでいく)がありプログラマーでなくても作れるというのがウリなのですが実際にはプログラム行為そのものなのでその素養はあった方がいいと思います。Blueprintも複雑になると見にくくなるのでコードで書いた方が見やすいなぁと思うこともあります。(もちろんC++で書いていくことも可能)
Blueprintを使ってNDIが取り込めるようコードを書いていきます。(上の左の図)NDI Unreal Engine SDKには送受信のやり方が載っていてそれを踏襲するだけなのですが受信方法がこちらのやりたいこととは違っていたのでSDK記載の関数表を見ながらこうなんじゃないの?という感じで書きました。ARに使うカメラが一台だけなのでIP直打ちで設定しても問題なかったのですがNDIの説明をするためにUnreal Engine実行中にメニューを出してそこからNDIソースを選べるようにしました。
NDIではmDNS(AppleだとBonjour)を使って同一ネットワークにあるNDI機器をスキャンします。この時はまだ映像のストリームは流れていなくてお互いの機器のリンクが確定してから実ストリームを流すようになっていて無駄なネットワーク帯域を使わないような仕組みになっています。NDIソースは機器名(アプリ名)という形式になります。入力だけでなくNDI出力ができるようにしたので表示されていますがモザイクで隠れているコンピュータ名がUnreal Engine機です。これを選んでしまうと当然映像は回ることになります。VCC-4KNDI、DCC-4KNDIはカメラのほうで名前やアプリ名部分を変更することができます。
■ カメラの傾きや位置を追跡するVR用トラッカーを用意する
AR/VRで重要なカメラの動きを検出するトラッカーの存在があります。古くはカメラ三脚のヘッドにジャイロセンサー、ローラーに回転検出装置なんてつけたり赤外線を使った光学式トラッカーなんてものがあります。だいたいはシリアル信号(RS422とか)で出てきたデータを使用するバーチャルスタジオシステムに合わせるよう変換ボックスなるものをこしらえてデータを渡すという超絶面倒かつお高くなってしまうというのが常でした。展示会で使うのにそんなコストはかけられないので安価なもので試してみました。
ここ数年DIYでバーチャルスタジオを作る方々にとっては定番のトラッカーが存在します。そんな人いるのか?と思うかもしれませんが世界広しです。十分いらっしゃいます。本来はヘッドセットつけてVR/ARを体験するシステムのオプション品です。BaseStationから照射された赤外線レーザーをVIVEトラッカーが受けて傾きや位置情報をBluetoothでPCへ飛ばすといったものになります。本来はヘッドマウントシスプレイ(HMD)が必要なのですがドライバソフトをハックすることにより無しでもいけます。(私もはなから買ってません)Epic社がその方法を公開しています。
Unreal Engine LiveLinkXR
Vive トラッカーを HMDなしで使用する 外部リンクへ
トラッカーとベースステーションの距離は最大5mくらいです。間に遮るものがあると計測できなくなってしまうので複数ベースステーションを置くやり方もあります。トラッカー自体はバッテリー動作し7.5時間もちます。
カメラにトラッカーを取り付けます。Amazonで購入したリグを使ってます。PTZカメラだとこういう使い方は出来ません。内部にエンコーダーがあるPTZカメラもありますがメカなのでズレてくるのと高精度なパーツを使ってるカメラ=高価なものカメラになってしまいます。Unreal Engineではトラッカーとイメージセンサーの位置の違いを調整したり、トラッカー情報と映像入力のタイミングを合わせたりすることができます。実際のカメラの動きをUnreal Engine上の仮想カメラにリンクさせます。
■ レンズ情報をカメラからRestAPIで取得する
カメラのレンズからズーム、フォーカス、アイリスの値を取り込みます。一般的に放送業務用レンズを使う場合キヤノンかフジノンのVR対応で400万くらいするモデルを使います。レンズにシリアル出力がありこれを使うことになります。もしくはPLレンズなどギアが付けられるものにエンコーダーをつけてシリアル出力といった感じになります。どちらにしてもカメラにごてごてケーブルなりボックスなりを付けることになります。今回使用したCIS VCC-4KNDIカメラにはシリアル経由でレンズ情報を読み出すこともできますがこのシリアル通信を別用に使いたかったのでもう一つの通信方法であるRestAPIを使いました。
RestAPI(RestfulAPIとも言います)はhttp, httpsプロトコルを使って簡単な情報をデバイス間通信する方法です。映像ハードウェアではまだまだ使われることは少ないかもしれませんがWebサービスを構築するような業界では既に一般的です。今後映像機器がネットワークで機器が繋がるようになると必要になってくる技術です。CIS VCC-4KNDIではAPIを叩くとJSONでステータスが返ってくるようになっています。
UE4 plugin VaRest
外部リンクへ
Unreal Engine上でRestAPIを使って通信するプラグインは既に存在します。しかも無償。業界標準の機能を使えばインターフェースを一から作る必要はなくなるという好例です。これを使いBlueprint上でカメラから逐一レンズ情報を引っ張ってこれるようにします。なんならUnreal Engineからカメラのコントロールをすることも可能になります。もちろんシリアル通信を可能にさせるプラグインも存在するので繋ぐ機器によって使い分けることもできます。選択肢が多いことはいいことです。
様々な種類のデータをやり取りしている割にはカメラとPC間のケーブルは1本のみです。(カメラは他にRS232→レンズコントローラー、ビューファインダー出力→ATOMOS SHINOBIに接続)通常バーチャルスタジオで使うカメラはそれ用だけでケーブルを数本〜十数本使ったりするのでかなりスッキリしてます。カメラをレンズコントローラーで操作してUnreal Engineから常にレンズ情報を取りにいくといった感じになります。
■ リアルタイムコンポジット(合成)
最終的に仮想世界と現実世界を合成します。従来のバーチャルスタジオシステムではキーイングや合成を別の機器で行ったりしていたのですがUnreal Engineにはそのどちらの機能も備わっているのでそれを使うことにします。
合成にはUnreal Engineのリアルタイムコンポジットを使用します。3種類のレイヤーが用意されていて
・Media Plate 入力動画レイヤー ここではNDI®入力映像
・CG Layer Unreal Engineで作ったCG空間に置いたオブジェクト(アクタ)
・CG Matte グリーンバックで抜けないものやスタジオの天井とか隠したいものに使ったりします。
AdobeのPhotoshopやAfterEffectsを使用している方であれば同じように理解できます。レイヤーは複数作ることができるので背景CGレイヤー、その前にグリーンバックで抜いた映像レイヤー、さらにその前にCGレイヤーを置くといった複雑な構成も可能です。
■ まとめ
放送用バーチャルスタジオを構築しようとするとどうしても数千万〜億超えのような金額になってしまいます。よほどの覚悟がないと導入するのにかなり躊躇することでしょう。自身がスタジオ設計者なのでバーチャルスタジオの話が出てきても金額聞いて話が流れたなんてことはよくあることです。今回のような方法を使えばかなり安価に済むので小規模スタジオでの運用や将来のステップアップを見据えた第一歩として考えることもいいのかもしれません。Unreal Engineを使うのにプログラムしなければならないという手間はありますが映像業界でのUnreal Engineの普及が見込まれることが予想されるので今のうちから慣れておくといった考え方もあると思います。
■ 最後に
展示会向けにこのコンテンツを作ったのですがもう少し時間があれば実現できたかなぁと思ったことを出してみます。
・HDR対応にしてみたかった
Unreal Engine、CIS VCC-4KNDIともにHDR(High Dynamic Range)に対応しています。HDRが使えれば画質的によりリアルになるはずです。いかにもCGといった感じではなくなるのかもしれません。ただし対応HDRの種類が違うので(Unreal EngineはPQ、CIS VCC-4KNDIはHLG)カメラからのストリームをUnreal Engineに合わせる必要があります。
・VIVEトラッカーのブレを抑えたい
この手のセンサーにはよくあることですが受け取る生データに少なからず振れ幅が生じます。結果的に仮想カメラが見るCGオブジェクトが細かく揺れてしまうことがあります。データの揺らぎを抑えるためにローパス処理は追加していたもののまた別なノイズ除去フィルタを追加する必要がありそうです。
関連製品
M-Design Virtual Studio
Link
関連Blog
【UE5】アニメ調3Dアバターを使ってバーチャルスタジオ 【バ美肉】
【UE5】プアマンズジェスチャーコントローラーを作る
【UE5】トラッカーとレンズコントローラーを使ってバーチャルカメラを操作する
【UE5】MetaHumanを使ってバーチャルスタジオを作る
【UE5】MetaHumanを使ってVTuber、Zoom、Teamsをやってみる