今回は、UnityとTouchDesignerの間でリアルタイムに画像を共有する方法を紹介します。
TEXT_高田稔則 / Toshinori Takata(Codelight)
EDIT_小村仁美 / Hitomi Komura(CGWORLD)
<1>UnityでSpoutを使えるようセットアップする
こんにちは、高田です。最近はドローンをPCでプログラムするべく、いろいろ調べても良い方法が見つからなかったのですが、先日ようやくスウェーデンのBitcrazeが開発している「Crazyflie」というドローンキットを見つけることができました。光学式モーションキャプチャシステム用のdeck(パーツ)やHTC ViveのトラッキングシステムLighthouseを使って位置を割り出すLighthouse deck(Early Access)などが用意されており、さっそく購入して試し始めています。
前回の記事ではOSC(Open Sound Control)を使ってデータをアプリケーション間でやり取りする方法を紹介しました。OSCでデータ通信を行えば、センサ処理と描画のアプリケーションを分けて作ったり、既存のOSC対応アプリやコントローラを利用することもできるため全体の開発がシンプルになると思います。
また、OSCと同じようにレンダリングした画像を他のアプリケーションと共有できるようになると、表現の幅が広がります。今回はその方法を簡単に紹介していこうと思います。
以下の画像は「Enviro」という天候のアセットを使ってUnityでレンダリングした空を、TouchDesignerでリアルタイムに共有し、数パターンの変換をかけて表示している様子です。
Unityにも後処理用のPost Processing Stackコンポーネントが用意されていますが、TouchDesignerやVJ系のアプリを介すと、より簡単に演出を加えていくことができます。
リアルタイムの画像共有を行うためのフレームワークとしては、Max OSXではSyphon、WindowsではSpoutがデファクトスタンダードになっており、ほとんどのグラフィックス処理を行うアプリケーションで対応しています。
筆者はWindowsを使っているので、ここではSpoutを主に説明していきます。SyphonもSpoutもGPUメモリを別のアプリケーションと共有することでリアルタイムでの画像共有を実現するものです。SpoutはNVIDIA DirectX/OpenGL Interop(NV_DX_interop)エクステンションが利用できれば、共有するアプリケーションがDirectX、OpenGLのどちらで作られていても問題ありません。
基本的にはDirectXを利用してメモリ共有されるので、双方がDirectXを使っていればそのまま共有され、OpenGLの場合はNV_DX_interopを介して、DirectXのテクスチャメモリにダイレクトアクセスを行います。Spout 2.006以降ではNV_DX_interopが使えない場合、CPU処理でDirectXからOpenGLにテクスチャメモリをコピーするそうです。
Unityで利用できるプラグインとしてSpoutのサイトから「Spout4Unity」がリンクされていますが、個人的にはこちらよりもUnity Japanの高橋啓治郎さんが開発された「KlakSpout」の方が安定している印象です。高橋さんのGitHubは素晴らしいリソースなのでどんどん活用していきましょう。
UnityからTouchDesignerへの共有は、UnityにKlakSpoutをインストールしてレンダリングカメラにKlakSpout Senderコンポーネントを追加するだけです。
TouchDesigner側では「Syphon Spout In TOP」を追加します。
これで双方をPlayすれば、TouchDesignerのSyphon Spout In TOPに画像が共有されます。
以下のようにUnityでレンダリングした空を点描風に変化させて、ワイヤーフレームのオブジェクトを合成させるなど、Unityだけでは少しやりにくい表現も容易にできるようになるので上手く使っていくと良いでしょう。
もちろん、Unity側で映像を受信することもできます。ProcessingをSenderとして使ってみましょう。Processingを起動して[スケッチ→ライブラリをインポート→ライブラリを追加→Spout]を選択してインストールしてください。
インストールが完了したらProcessingのContributed Managerを開き、[Libraries→Spout for Processing→Spout Senderスケッチ]を実行すれば良いのですが、このままでは上手く共有できません。SpoutのサイトからSpoutのインストーラをダウンロードしてインストールしてださい。
Unity側ではRaw Imageを作成し、Klak Spout Receiverコンポーネントを追加します。Source Name にSpout Processingを指定して、Target TextureにはReceiverを設定します。これで、Processingからのレンダリング画像がUnityに渡るようになります。
最後に近年広まってきているNDI(Network Device Interface)を紹介しておきます。NDIはNewtekが開発したIPベースで画像共有を行うための仕様です。SyphonやSpoutが同一PC間での共有を目的としていたのに対し、NDIはEthernetで繋がれたPC間での画像共有を目的としています。対応しているアプリケーションやハードウェアも多く、やはり高橋さんがUnity用のプラグインを公開しています。
また、Spoutが「Spout to NDI」というNDIとSpoutの相互変換を可能にするツールを公開しています。このツールを使うことでSpoutしか対応していないアプリケーションをNDIに変換してネットワーク越しに共有を行うことが可能になります。
Profile.
高田稔則/Toshinori Takata(Codelight)Codelight株式会社 代表取締役・インタラクションエンジニア
フリーランス、株式会社TBSテレビ等で映画CG制作、株式会社ソニー・コンピュータエンタテインメント(現 ソニー・インタラクティブエンタテインメント)でPS4のOSD開発などを経て2006年にCodelight株式会社を設立。インタラクティブコンテンツの制作を中核として、製造業向けのプロトタイプ開発なども行う
www.codelight.co.jp