MATLAB / Simulink で作ったシミュレーションを Unreal Engine で可視化して遊ぶ 【後編】

[前回の記事](https://qiita.com/BParound30/items/31e67fb3bdb433851d55)に引き続き後編。

# 手順
Unreal Engine (UE) 側の設定と、アクターの配置や、ブループリント、アニメーションの編集がメイン。前記事の`Unreal Editor を開く`でUEを起動した直後からの手順。
前記事同様、自分がつまずいたところを中心に、その他は参考リンクに任せる。

## Unreal Engine 側
### シーンの作成
シーン = 運転コースなどの走行環境を自由に作る（もっともクリエイティブな部分？）。
[参考リンク-1](#参考リンク)
例：本記事ではスプライン道路のみ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3362399/7c4e5c35-5990-c40d-c88f-f92dd255072b.png)

### アクターをシーン内で動かす
Simulation 3D Actor Transform Set ブロックを使うと簡単にできる
[参考リンク-2](#参考リンク)
1. コンテンツブラウザ > ソースパネル > MathWorksSimulation C++クラス > MathWorksSimulation > Public > Sim3dActor をベースにブループリントクラスを作成する（この記事では`VehicleSedan`と名付ける）
1. ブループリントにSkeltal Mesh コンポーネントを追加し、DefaultSceneRootを上書きする

    :::note warn
    Static Mesh を選ぶと後でアニメーションがつけれない。タイヤを曲げたりハンドルを回すアニメーションをつけたい場合は必ずSkeltal Meshに！

1. 好きなSkeltal Meshを選択。デフォルトで MathWorks の用意したものもあるが、オプションでオリジナルのものを作ってもいい（[参考リンク-3,4](#参考リンク)）
1. `VehicleSedan`ブループリントをシーンに配置し、アクタ > Tags に `Simulation 3D Actor Transform Set` ブロックの`3D シーンのアクターのタグ、ActorTag []`で設定した名前を追加（この記事では`MySedan`とする）
1. レベルブループリント > ファイル > ブループリントの親を変更 で 親を必ずSim3DLevelScriptActorに変更しておく

    :::note alert
    これを忘れると、UEがクラッシュする。

1. Simulinkモデルを実行し、左下に初期化中の表示が出たら、Unreal Editorでプレイして、アクターが動くのを確認する

### カメラの設置
[参考リンク-5,6](#参考リンク) のような方法もあるが、今回は`Simulation 3D Actor`ブロックを使って実現した。
1. `Simulation 3D Actor`プロパティの`親の名前`に`MySedan`を設定
1. `アクター名`プロパティにカメラアクターの名前を付ける（この記事では`CameraMounted`とする）
1. `Simulation 3D Scene Configuration`のプロパティ`シーンビュー`に`CameraMounted`を設定
:::note
[前回記事](https://qiita.com/BParound30/items/31e67fb3bdb433851d55)に説明用のスクリーンショットあり。
:::

### アクターにアニメーションをつける
筆者が一番苦労した部分。[参考リンク-5](#参考リンク)に、C++を使用したアクターのアニメーション化の方法はあるが、ブループリントで実現する方法を探った。いろいろ模索した結果、`Simulation 3D Message Set`ブロックでアニメーション情報をUEに送るという手段に落ち着いた。

一方C++での方法は、`Simulation 3D Actor Transform Set`のみでアニメーションも実現している。ブループリントでも同じようにできないか試行錯誤したが、わからず断念。知っている方がいたら、コメント等で情報お待ちしております。

#### アニメーションBPの作成
[参考リンク-7](#参考リンク)

:::note
今回アニメーションにするのは、タイヤ4輪の回転方向の角度と、前2輪の曲げ方向の角度とする。
:::

1. コンテンツブラウザ > 追加/インポート > アニメーション > アニメーションBP を選択
1. 親クラスを`AnimInstance`に、ターゲットスケルトンはブループリント作成時に指定したものと同じ Skeltal Mesh を指定（この記事では`SedanAnimBP`と名付ける）
1. AnimGraphを編集する
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3362399/2f0e9cc5-e6c8-e8cf-4685-255f9790ba3d.png)

    :::note warn
    `ボーンをトランスフォーム(修正)する`ノードの設定で、`Bone to Modify`, `Rotation Mode`, `Rotation Space` を正しく設定する。
    例
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3362399/cea3735a-afc6-0c38-0671-6fc5904c9ae6.png)

1. コンパイルして、変数を変化させながらプレビューで動作確認

#### アニメーション情報をSimulinkから取得
[参考リンク-8](#参考リンク)
1. アクタを配置 > クラスの検索 から `Sim3dGetFloat` を検索してシーンに配置
1. レベルブループリントで、`Sim3dGetFloat`で取得した配列を`VehicleSedan`内の変数にセットする
    例：`VehicleSedan`にあらかじめセットした変数を作成しておく（ここでは配列としてセット）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3362399/019ae56d-e44b-c68e-bde2-b60530d813dd.png)
1. コンパイルする

#### ブループリント(`VehicleSedan`)とアニメーションBP(`SedanAnimBP`)を紐づける
1. `VehicleSedan`ビューポートの詳細設定 > アニメーション > Anim Class で`SedanAnimBP_C`を検索して指定する
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3362399/dc0caf56-1d9e-dd9b-815c-450689139f04.png)
1. イベントグラフで、レベルブループリントでセットした変数を`SedanAnimBP`にキャストする
    例：`VehicleSedan`の変数を必要に応じて加工してから`SedanAnimBP`にキャスト
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3362399/05b0b67d-c9cb-563e-bfd1-15dc2e5b072f.png)
1. コンパイルし、Simulinkモデルを実行
1. UEでプレイし、アクターが動くのと同時にアニメーションも動いていることを確認（下のgifではタイヤも回転しているが、見えない...）
    ![VehicleSimulation_large.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3362399/71b0ffd9-8c0c-0c85-61a7-1987ae3429ad.gif)

# さいごに
仕事でMATLABを使用しているときにUEと連携できることを知り、GWの課題としてこの記事の内容を仕上げた。UEの編集は初心者だったが、ブループリントはSimulink同様に視覚的にプログラムできるので、学習ハードルは低く、楽しんで作業できた。
Simulinkでモデルを作りUEで可視化するこの方法は、個人の趣味として楽しくシミュレーション開発プロセスを学びながら、なおかつタイムパフォーマンスにも優れた方法だと感じた。


# 参考リンク
1. [Landscape Road Spline 【動画】](https://www.youtube.com/watch?v=8WIWuybAKj4&t=15s)
1. [Connect a Physical Model in Simulink to Unreal Engine | AUV Deep Dive, Part6 【動画】](https://www.youtube.com/watch?v=fNd0fVYxkGg&list=PLn8PRpmsu08r6VnOWlQyY1B5kuGRJVRsc&index=22&t=229s)
1. [Preparing A Custom Vehicle Mesh for the Unreal Editor【動画】](https://www.youtube.com/watch?v=A5P1aMTrq_s)
1. [Unreal Editor 用のカスタム車両メッシュの準備](https://jp.mathworks.com/help/vdynblks/ug/prepare-custom-vehicle-mesh-for-the-unreal-editor.html)
1. [Animate Custom Actors in the Unreal Editor](https://jp.mathworks.com/help/vdynblks/ug/animate-custom-actors-in-the-unreal-editor.html?lang=en)
1. [Place Cameras on Actors in the Unreal Editor](https://jp.mathworks.com/help/vdynblks/ug/place-cameras-on-actors-in-the-unreal-editor.html)
1. [Fully Drivable Kinematic Car from Scratch - Unreal Engine 5 Blueprints Tutorial 【動画】](https://www.youtube.com/watch?v=hi_RiTavMWQ&list=PLdJTb2JHbl1DjvFIP0tBIR3am-qCVPO2v&index=35)
1. [Get Started Communicating with the Unreal Engine Visualization Environment](https://jp.mathworks.com/help/vdynblks/ug/get-started-communicating-with-the-unreal-engine-visualization-environment.html?lang=en#mw_d916dea9-c596-4ce0-848c-47d7db9a9650)