Unreal EngineでDMX照明機材動かす最初の一歩

#目次
1.前書き
2.そもそもDMXとは
3.UE4 DMXプラグイン
4.ブループリントで制御
***

#1.前書き
"Unreal Engine DMX"とかでググると、Unreal Engine内の照明を動かすドキュメントが沢山出てきます。
まあ確かに、バーチャルライブとかでよく使われてますよね。
ですが、自分は現実世界の照明機材をUnreal Engineと結び付けて動かしてメディアアートとかのそういう方向性のものを作る機会があったので、その経験を踏まえ、今回の記事では現実のDMX照明機材をUnreal Engineで動かすことにフォーカスをあてて書きます！

仮に読者の想定としては、Unreal Engineを元々やっていて、照明の制御に手を伸ばしてみたいという方を想定しています。
照明屋からUnreal Engineに入る人にも参考になる部分もあると思いますが、UE4の基本的な部分の説明は省きます！

ただ、予め断っとくと、業界の人間とかでも全然なくて、ただの一般大学生です。間違ってる部分もあると若干あるかもしれないので、怒らないでください。
でも、実際Unreal Engineで現実のDMX機材を動かす記事がなかなかなくて、英語の動画を見たりしながら実装したので、初心者記事でも日本語のドキュメントを残しとくことは価値が多少はあるかなと思うので、書いてみます。

#2.そもそもDMXとは
DMXに関して、深い説明は下のリンク等を見ることをおすすめします！
[Unreal Engine の公式ドキュメント](https://docs.unrealengine.com/4.27/ja/WorkingWithMedia/CommunicatingWithMediaComponents/DMX/Overview/)
[Sound House さん](https://www.soundhouse.co.jp/howto/light/dmx/)

ここでは簡易的に説明します。
既にご存じの方は飛ばしてください。

DMXとはプロトコル(通信規格)です。
何のプロトコルかというと、照明等の機材を制御するためのプロトコルです。
DMX規格を大きく括って考えれば、コンサートやライブ、舞台等においては照明制御のデファクトスタンダードと言えるでしょう。

次にどのようにDMX規格で実際の照明を制御するかを理解しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/c0bb1c64-c1d4-d975-eb60-413932c20389.png)
上の画像は自分の持っている、"BETOPPER LPC015" という照明機材です。[Amazonのリンク](https://www.amazon.co.jp/dp/B087M6KPJM/ref=cm_sw_em_r_mt_dp_ETSS25FYB6XJJCSRK6RW?_encoding=UTF8&psc=1)

裏はこんな感じです。
![S__9338913.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/7aee141b-6750-058f-1ddf-90117009865d.jpeg)

このようなDMX照明機材とPCを繋ぎ、Unreal Engineで制御するためには、
PCからの信号をEthernetでLANを通じて照明機材に送ります。
その際、Art-Net DMX Converter というような機材が必要になります。(Art-Netに関しては 2.そもそもDMXとは の後半で解説します。)
[Aliexpress](https://ja.aliexpress.com/item/32648179253.html?spm=a2g0o.productlist.0.0.155b736bTJBfoM&algo_pvid=c02ae75b-e78b-45bf-88c5-5381b5640c6c&algo_exp_id=c02ae75b-e78b-45bf-88c5-5381b5640c6c-0&pdp_ext_f=%7B%22sku_id%22%3A%2265901791789%22%7D)
![S__9338909.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/458d1405-b3bd-c3b2-e132-dec31fddbb2a.jpeg)
スイッチングハブ等を用いて、Art-Net DMX ConverterとPCを同じローカルネットワークになるようにします。
![S__9338912.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/e18f56af-5c78-dd80-57a3-bc32df3ca543.jpeg)
そしてArt-Net DMX ConverterのDMX出力端子を照明機材につなぎます。
![S__9338911.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/90e5fbb3-c044-086f-97e8-6de0230aadd6.jpeg)

DMX端子間をつなぐケーブルは、DMX XLRケーブルを用います。
インピーダンス等が異なるので、音響機材に使われるものとは異なるDMX専用のケーブルを用意すると良いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/740c5945-562e-a98b-5ced-e93fd779b762.png)

複数の照明機材をつなぐ際は、以下のように、DMX out → DMX IN → DMX OUTというように数珠繋ぎのように繋ぎます。
また、照明機材には大概いくつかのモードがあり、それをDMXモードにします。
![S__9338908.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/c51ecc73-4157-d381-4a5e-0337843f3c5e.jpeg)

簡易的なステージ等であれば、XLRケーブルで配線することも多いようですが、より高速で信頼性の高いEthernetネットワークで信号を送るプロトコルである、Art-NetやsACNという通信規格が使用されるケースも多いようです。
[Art-Netの詳細](https://show-network-lab.hateblo.jp/entry/artnet)
[sACNの詳細](https://show-network-lab.hateblo.jp/entry/acn)
UE4で現実世界の照明を動かそうと考えた際、Art-NetかsACNを採用することになります。
ただし、相当大規模なプロジェクトでない限り、どちらを使用しても大差はないと自分は捉えています。
Art-Netのほうを自分は使います。

Ethernetネットワークを使用するので、インターネットに繋げてVPNなどを使用すれば遠隔地からオペレーションをすることも可能になります。

また、照明機材によってはEthernet端子があるものもあるので、そういう場合はDMXに変換することなく、Ethernetケーブルのみで各機材をつなげることもできます。


#3. UE4 DMXプラグイン
基本的にはUnreal Engine 公式のDMXクイックスタートに従います。

DMX × Unreal Engine の記事を書いといて、これを言うのもなんですが、UE4.27だと下のスクショのようにIPとかの設定するControllerが開けないというか、編集がどうもやり方がわかりません。誰か教えてほしい...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/3e6b7683-1194-2e6d-7061-d0aacef5e477.png)
なので今回はUE4.26を使います。
UE5.0でも同じ感じでできます。

個人的には、DMXプラグインを使用するよりも、Blankのプロジェクトを立ち上げたほうが、DMXLibrary の競合とかを防げてとっかかりやすいと思っています。

ではクイックスタートっぽくやってみます。
以下の手順でやっています。

① 新規プロジェクトを立ち上げる
② プラグインの追加
③ DMXライブラリを追加
④ DMXライブラリを開く
⑤ コントローラーの設定
⑥ 器具タイプ(Fixture Type)を追加
⑦ 器具パッチ(Fixture Patch)を追加
⑧ フェーダを動かす



① 新規プロジェクトを立ち上げる
② プラグインの追加
　- DMX Engine
　- DMX Protocol
を入れておけばとりあえず動きます。
![Desktop Screenshot 2021.12.10 - 18.50.18.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/b1228231-ee0b-42f9-dbd9-ee6aabdf298f.png)
③ DMXライブラリを追加
![Desktop Screenshot 2021.12.10 - 19.02.09.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/77a22a17-bc97-9c68-017b-0c96b4bf1e8a.png)

④ DMXライブラリを開く
![Desktop Screenshot 2021.12.10 - 19.09.09.18_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/edbd2c8c-6af2-e541-9cee-b49c09019d61.jpeg)
DMX出力コンソールがない場合、上のスクショ内の赤く〇をした部分から開けます。

⑤ コントローラーの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/83e760ec-7b02-96fd-db29-0c3c67c23857.png)
1. コントローラーを追加
2, 追加したコントローラーのDMX信号の設定
プロトコルはここではArt-Netを選択しておきます。
通信方式は最低限Broadcastでも正しく設定できていれば動きますが、Unicastにする際に困らないよう、一応ここではUnicastでやります。
Art-Net-DMX Converterの設定用ソフトを立ち上げ、ネットワーク上でSearchをかけると、ConverterのローカルIPを取得できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/ac9c7ec1-1363-26c9-584a-fe80330ee0b4.png)
Unreal Engineで信号を送るPCが、同一LAN内のどのIPアドレスのノードに信号を送ればいいのかを支持したいので、そのConverterのローカルIPアドレス
を Additional Unicast IPs に追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/95f48d6d-4819-8b7c-ba58-1d497bb40853.png)

⑥ 器具タイプ(Fixture Type)を追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/d19401e2-40fb-6cd4-fcf1-3756ffeba222.png)
Static、Modes、Functionを追加しましょう。
自分はセクション2で載せたBETOPPER LPC015の3チャンネルモードを使用しようと思うので、名前を割り当てつつ設定すると以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/32dd91aa-3134-51a4-d1b6-63f258027b72.png)

⑦ 器具パッチ(Fixture Patch)を追加
先ほど作成した機材を追加しましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/9c283d90-cd46-4236-bf0d-833c0e4aff4f.png)
開くと、ユニバース1上のチャンネルに勝手に割り当てられます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/c9b6f88c-d888-30b6-5e9e-89672dbe5710.png)
<details><summary>複数機材を使うケースはこんな感じです。</summary>
例えば、以下のような時は
![S__9338908.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/144925a3-d33a-3504-cae1-a0b22bcdf8da.jpeg)
新しい照明機材の情報を追加して
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/37f46a76-810c-514d-e0f0-8ea4c380574f.png)
チャンネルを割り当てます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/1599f27c-bbf3-05ca-5197-4ae0fa0a5e62.png)
こういう感じになりますね。
</details>

⑧ フェーダを動かす
まず、3チャンネル動かせるようにフェーダを追加してみましょう。
この際、アドレスの変更を忘れずに、それぞれのチャンネルに対応するアドレスを割り振りましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/eddf0c50-64e6-6dda-608c-31ad3eefccdb.png)

![S__9338924.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/4cef0392-ba9c-67c2-78f3-3203e4ca3f97.jpeg)
光りました


<details><summary>~光らなかった場合~</summary>
自分は、最初DMXテンプレートでプロジェクトを作成し、公式のDMXクイックスタートに従ってたところ、以下のようなエラーが発生しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/de66e1f9-2c11-63a2-cb6e-852445b9b1c0.png)
DMXテンプレートのDMXライブラリと競合してしまっていました。
以降自分はDMXライブラリは1プロジェクトに1つにするようにしています。
同じ壁に当たる人も少なくないかなと思うので、書いときました。
</details>


#4. ブループリントで制御
[公式 DMXブループリント拡張](https://docs.unrealengine.com/4.27/ja/WorkingWithMedia/CommunicatingWithMediaComponents/DMX/BlueprintExtension)

① まずは、クラスはActorとかでブループリントを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/8c2a40ee-9126-2a3f-cd6b-1b94f50d7135.png)

② DMXコンポーネントを追加します。
作成したブループリントを開き、左上のコンポーネントを追加からDMXコンポーネントを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/03b9fea0-4d5d-687c-ffb8-a89ece70210f.png)

③ イベントグラフをいじります。
何かのイベントを発生させて、照明を変えたいとき、イベントグラフを右クリックしてDMXSubsystemというものを作成します。
そして、SendDMXRawノードを作成して繋ぎ、Universeを指定し、またMake MapノードからKeyとValueでチャンネルと送信する値(0~255)を指定ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442991/ead0331a-5184-bf65-689f-51483e6a8a2b.png)
このノードで大体のことはできる気はします。

④応用してこんなことができます。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">UE4で照明光らせたぞ！！<a href="https://twitter.com/hashtag/DMX?src=hash&amp;ref_src=twsrc%5Etfw">#DMX</a> <a href="https://twitter.com/hashtag/Artnet?src=hash&amp;ref_src=twsrc%5Etfw">#Artnet</a><a href="https://twitter.com/hashtag/UnrealEngine?src=hash&amp;ref_src=twsrc%5Etfw">#UnrealEngine</a> <a href="https://twitter.com/hashtag/UE4Study?src=hash&amp;ref_src=twsrc%5Etfw">#UE4Study</a> <a href="https://t.co/46oWMaAIXL">pic.twitter.com/46oWMaAIXL</a></p>&mdash; なかむらた (@isutothukue) <a href="https://twitter.com/isutothukue/status/1438539395225702404?ref_src=twsrc%5Etfw">September 16, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

モーションキャプチャとかと組み合わせれば、無人オペレーションできます。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">記事投稿しました！Unreal EngineでDMX照明機材を動かす最初の一歩 on <a href="https://twitter.com/hashtag/Qiita?src=hash&amp;ref_src=twsrc%5Etfw">#Qiita</a> <a href="https://twitter.com/hashtag/UnrealEngine?src=hash&amp;ref_src=twsrc%5Etfw">#UnrealEngine</a> <a href="https://twitter.com/hashtag/DMX?src=hash&amp;ref_src=twsrc%5Etfw">#DMX</a> <a href="https://twitter.com/hashtag/MotionCapture?src=hash&amp;ref_src=twsrc%5Etfw">#MotionCapture</a> <a href="https://twitter.com/hashtag/%E8%AC%9D%E7%BD%AA?src=hash&amp;ref_src=twsrc%5Etfw">#謝罪</a><a href="https://t.co/5zrddyGbnt">https://t.co/5zrddyGbnt</a> <a href="https://t.co/6aHOxzwaNI">pic.twitter.com/6aHOxzwaNI</a></p>&mdash; なかむらた (@isutothukue) <a href="https://twitter.com/isutothukue/status/1469325733671870465?ref_src=twsrc%5Etfw">December 10, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
でも、DMXで何かするとき、キーボードイベントとか、いくつかのイベントが何故か効かないんですけど、それの理由が正直よくわかんないんですよね...


まあ、でも、いずれにせよUE4 × DMXで現実の照明をプログラム書かないでインタラクティブに動かせるのはとても良いです。
誰かの何かの参考になったら嬉しいです。
以上です。ありがとうございました。