AWSIMにエフェクトを加えてみる


# 環境
今回はVFXというshader処理をGPUで行うことで大量のパーティクルを生成する機能を使用するため、PCのスペックには注意しましょう。快適に作業するには性能が高いほうがストレスなく進めることができます。

推奨PCスペック（このスペックではないとできないということはないですが、このスペック以下の場合画面がフリーズする可能性ありです）

|OS             |Ubuntu 22.04|
|:--------------|----------|
|CPU            |8コア×2，16スレッド|
|メモリ          |32GB以上 |
|GPU            |RTX1080Ti|


## vfxとは

vfxはVisual Effectsの略で視覚的効果という意味ではありますが、私はかっこいいエフェクト程度にしか捉えていませんでした。ググってみたところ以下のような説明がありました。

"VFXとは、視覚効果を意味する英語ビジュアル・エフェクツの略で、映画やテレビドラマなどの映像作品において、現実には見ることのできない画面効果を実現するための技術のことを指す。視覚効果ともいう。VFXは、コンピュータグラフィックスまたは合成処理によって実写映像を加工することである"

昔はparticle systemというものでエフェクトを作成していたものですが処理速度の限界があり、大量のパーティクルが気軽に生成できませんでした。しかし、2019年頃から登場し始めたパーティクルエフェクトをGPUで並列処理させ、大量のパーティクルをリアルタイムに生成する技術の発展と、そのパーティクルのグラフィカルな編集用のエディタVisual Effect Graphが登場したことで、だれでも手軽にかっこいいvisual effectsを編集できる時代がきました。（2019年頃vfxはpreview版として導入されていました）

## vfxを使ってみる

さて、UnityにはVisual Effect Graphを用いてエフェクトを作成するEditorが備わっているので、軽く触れてみていろいろなエフェクトを試してみましょう。

https://unity.com/ja/visual-effect-graph


UnityEditorを開き、hierarchyのところで右クリックしてVisualEffects->VisualEffectと選択肢、魔法のランプのアイコンのようなものを表示してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/59390682-e951-c2b1-3701-bd62de492c13.png)

general->asset template -> newのボタンを押しててきとうにeffectsを作成していきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/ccf9169a-9fde-b41f-72b1-f1c5cc7263f7.png)

こんな感じのエディタが開くのでそれぞれの項目をすきにいじってみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/61ec1a69-c2ae-6b92-5cbf-3877924d8657.png)

色は白ー＞水色、textureをAWSIMのデータにあったtier4 logoにしてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/9ada911c-662d-d0ed-f025-27253d50ab93.png)

実行するとこんな感じですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/9b104a31-73ff-5b50-dce3-ccdf9e9bb14f.png)

次に桜吹雪を作ってみましょう。今回使用するのはこちらの画像です。

https://kohacu.com/20170815post-12261/

ダウンロードしてunityのプロジェクトに追加してみましょう。
update particleからspaceを押してturbulance gravityなどを追加するとparticleに動きをつけることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/5b64f0e1-da42-8f83-f42b-2f522d1e68fc.png)

speed size spawn rate capacity gravityなどを調整して、桜吹雪をつくることもできます。ここは解説しないので、自分でやってみましょう。
（directional lightを追加すると現実感が増して描画が綺麗になります。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/f8612b39-83c4-c89c-951e-1d2e2235bce4.png)


## assetを使ってみる

アセットストアやアセットの追加方法などは前回の記事で紹介したのでそちらをみてないかたは、こちらの記事の内容を見ておきましょう。

https://qiita.com/ttanaka3/items/f3f468ec3bad53e71a12

さて、次にアセットとしてもともと用意されているものを見てみましょう。

https://assetstore.unity.com/packages/vfx/particles/cool-visual-effects-part-1-hdrp-support-176544


1.雪を降らせる

今回はassetを使っていきます。こちらのパッケージのsnowをつかっていきましょう。

sceneにprefabを追加してみるとこんな感じで雪を降らせることができます。

![snow.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/6e48ebf4-fd85-9566-69ec-43b096a05003.gif)

capacity 50000くらいでかなり本物感でてきますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/2163ad1c-63f9-33bd-8e82-65316e86dcaa.png)

さて、移動しているとvfxのeffectから外れてしまうことがありますね。西新宿雨全体を雪でおおうには相当なGPUのスペックが必要なのでカメラに映る範囲のみと影響範囲を絞りましょう。
自車両のtfに雪を追加するという工夫をすると自然な雪の日のように見せることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/c5c0688f-2b7e-313b-0580-458dc4fc0aa0.png)

主観画像はこちら。違和感はないですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/e82be99d-607b-44eb-1e88-701f9112c453.png)



2.集中線を出してみる。 

star field を追加してみましょう。もうスピードで駆け抜けている感じありますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/734aa10b-05e9-6cad-0301-e15e00a3066c.png)

車両の速度が5m/s以上になったら線を出すといった実装にしてみます。AddComponet->scriptからC#スクリプトを追加してみましょう。
vehicleの[SerializeFiled]に車両とvisual effectを選択し車両の速度が5m/s以上ならvisual effect開始といった形の実装にします。（ここの内容はunityになれていないとさっと組むのは難しいと思うのでおまじないだと思って書いてみると良いと思います。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/56465d64-a3fd-1c20-581b-b5d58333ce97.png)


![star_filed.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/dd2dd110-3bca-a6ba-ea0b-9b24e43df783.gif)

buildして実行してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/95ed15b3-a0e3-27b6-e620-4222a4dd5b8e.png)


## 終わりに

さて、今回はAWSIMに雪を降らせる内容について書いてみました。
雨や雪が降っているときの車両の画像などを使って信号認識や物体検出の学習をしてみる、ノイズを考慮した物体検出器などを作ってみるのも面白いかもしれませんね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639823/fda16b89-de42-0f87-ae80-cc01a6456816.png)


## 補足

最新のAWでは起動時にcamera_lidar_fusionがデフォルトになっており、カメラ123456がないと怒られるので起動コマンドとしてはperpcetion_mode:=lidarとするのがよさそうです。
```
ros2 launch autoware_launch e2e_simulator.launch.xml vehicle_model:=sample_vehicle sensor_model:=awsim_sensor_kit map_path:=/home/t4tanaka/maps/nishishinjuku_autoware_map perception_mode:=lidar
```