【Blender 2.9】  トゥーンシェーダー風 雨と波紋の作り方

# 動作環境
本記事の動作環境は以下の通りです。
(2.9にアップデートしました)
 
| 項目             |               環境 |
|:-----------------|:------------------|
| OS               |         Windows 10 | 
| Blender          |               2.9 |


#アウトプットイメージ
以下のような雨と波紋を表現する。

![Videotogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/a2795830-bfa1-6593-a009-596ec507982d.gif)




#ワークフロー

- 動画の長さを決める
- 地面を作成する
- 雨粒を作成する
- パーティクルエミッタ平面を作成する
- 波紋を作成する
- 地面にマテリアルを追加する
- 動画の出力をする

#動画の長さを決める

以下の方法で動画の長さを設定する。
今回は5秒の予定。
ついでに出力設定もしておく。

- 秒数の設定
    - 出力プロパティ > 寸法 > 終了フレーム を 120に設定
        - 補足：秒数 = フレーム数 × フレームレート(fps フレーム数/秒)
- 出力の設定
    - 出力プロパティ > 出力 で出力先を設定
    - 出力プロパティ > 出力 > ファイルフォーマットをFFmpeg動画に設定
    - 出力プロパティ > 出力 > エンコーディング > MPEG-4 に設定     
           ![output_setting.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/18470427-4ecc-9af1-c371-880d8034edb3.png)

# 地面を作成する

以下の方法で地面を作成する。

- 平面を追加して地面を作成する
    - 操作①：Shift + a > メッシュ > Plane
    - 操作②：s > Shift + z > 8 > Enter 
    - 操作③：f2キーで名前をGroundに変更
    
          <img width="600" alt="ground.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/a159bfe8-0db4-9c70-14ef-a15b6f1da775.png">


# 雨粒を作成する


以下の方法で雨粒を作成

- ICOsphereを追加
    - 操作①：Shift + a > メッシュ > ICOsphere
    - 操作②：f2キーで名前をraindropに変更
- 編集モードでプロポーショナル編集を使用して縦長に編集
    - 操作①：tabキーで編集モードへ移行する
    - 操作②：oキーでプロポーショナル編集を有効化
    - 操作③：一番上の頂点を選択
    - 操作④：g > z > 2 > Enter (マウス操作でも可) 
        - ポイント：プロポーショナル編集のモードはシャープで編集
- スムーズシェードをかける
<img width="600" alt="rain_drop.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/ca8dcac7-aacb-0bc7-b1cd-d94f810d3e98.png">

- 放射マテリアルの設定
    - 操作①：ウィンドウを分割してシェーダーエディターを表示
    - 操作②：新規をクリック 
    - 操作③：既存のプリンシプルBSDFを削除
    - 操作④：Shift + a > シェーダー > 放射を追加
    - 操作⑤：色をグレーに変更
    
    <img width="600" alt="raindrop_material.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/072e01d7-30a0-67b3-a123-ed4e79abee5e.png">



# パーティクルエミッタ平面を作成する

以下の方法でパーティクルエミッタ平面を追加する

- 地面を複製する
    - 操作①：Shift + d > z > 5 > Enter
    - 操作②：f2キーで名前をParticleEmitter に変更
- パーティクルを設定する
    - 操作①：パーティクルプロパティ > ＋ でパーティクルシステムスロットを追加
    - 操作②：パーティクルプロパティ > 放射 > 数を200に変更
    - 操作③：パーティクルプロパティ > 放射 > 終了を120に変更
- 雨を降らす
    - 操作①：パーティクルプロパティ > レンダー > Render As をオブジェクトに変更
    - 操作②：パーティクルプロパティ > レンダー > オブジェクト > インスタンスオブジェクトにraindropを設定    
- ベイクする
    - 操作：パーティクルプロパティ > キャッシュ > ベイク でベイクする
   
        <img width="600" alt="particle_emitta.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/314f96ff-e438-e5a7-2afd-c9ed9a2059c8.png">

# 波紋を作成する

以下の方法で波紋を作成する。

- 内側の波紋を作成する
    - 操作①：Shift + a > メッシュ > Cylinder で円柱を追加
    - 操作②：f2キーで名前をRainWave_inに変更
    - 操作③：RainWave_in以外を非表示に変更
    - 操作③：tabキーで編集モードへ移行
    - 操作⑤：s > z > 0.2 > Enter でサイズを縮小
    - 操作⑥：上下の面を選択して削除
    - 操作⑦：tabキーでオブジェクトモードへ戻る
    - 操作⑧：スムーズシェードをかけておく
    - ポイント：オブジェクトは原点から移動させないこと
      
        <img width="600" alt="rain_wave.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/f7c26330-fe70-fa70-12bb-6f6b26da44ea.png">



- 内側の波紋を降らす
    - 操作①：非表示にしたオブジェクトをすべて表示させる
    - 操作②：RainWave_inを選択する
    - 操作③：モディファイアープロパティ > モディファイアーを追加 > パーティクルインスタンス でパーティクルインスタンスを追加
    - 操作④：モディファイアープロパティ > ParticleInstance > オブジェクト でParticleEmitterを選択
    - 操作⑤：モディファイアープロパティ > ParticleInstance > 表示 で 消滅 と 発生前 を無効にする
    - 操作⑥：モディファイアープロパティ > ParticleInstance > 座標軸 で Y を選択
    - 操作⑦：モディファイアープロパティ > モディファイアーを追加 > ソリッド化 で ソリッド化モディファイアーを追加
    - 操作⑧：モディファイアープロパティ > Solidify > 幅 を 0.02 に変更
- 内側の波紋のサイズと位置を修正する
    - 操作①：tabキーで編集モードへ移行する
    - 操作②：頂点を全選択して s > Shift + z > マウス操作 で任意の大きさに円形を修正する
    - 操作③：頂点を全選択して g > z > マウス操作で雨粒の一番上辺りまで移動する
    - 操作④：調整が終わったらtabキーでオブジェクトモードに戻っておく
    - ポイント：オブジェクトモードでやるとスケールや位置が変わって、パーティクルインスタンスがうまく使えなくなる
    - 補足：オブジェクトモードでやるときは、Ctrl + a ですべてのトランスフォームを適応させるとパーティクルインスタンスがん狙った位置に来る
    
        <img width="600" alt="rain_wave_particle_instance.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/83197731-4616-7677-7a54-db8dd1998e8e.png">

- 外側の波紋を作成する
    - 操作②：RainWave_inを選択し、Shift + d > Enter で複製する
    - 操作②：f2キーでRainWave_outに名前を変更する
    - 操作③：モディファイアープロパティ > Solidify を削除する

- 外側の波紋のサイズと位置を修正する
    - 操作①：tabキーで編集モードへ移行する
    - 操作②：頂点を全選択して s > Shift + z > マウス操作 で任意の大きさに円形を修正する
    - 操作③：頂点を全選択して g > z > マウス操作でraindropの下側の頂点からRainWave_inの下面と同じくらいの位置に移動する

    - 操作④：調整が終わったらtabキーでオブジェクトモードに戻っておく
    - ポイント：オブジェクトモードでやるとスケールや位置が変わって、パーティクルインスタンスがうまく使えなくなる
    - 補足：オブジェクトモードでやるときは、Ctrl + a ですべてのトランスフォームを適応させるとパーティクルインスタンスがん狙った位置に来る
    
          <img width="600" alt="rain_wave_out_particle_instance.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/8ea1351a-c937-e4e3-17a5-b09d865e05e6.png">

 
# 地面にマテリアルを追加する

以下の方法で地面にマテリアルを追加する。

- 内側の波紋にダイナミックペイント(ブラシ)を追加する
    - 操作①：RainWave_inを選択する
    - 操作②：物理演算プロパティ > ダイナミックペイント を追加する
    - 操作③：物理演算プロパティ > ダイナミックペイント > タイプをブラシに設定
    - 操作④：物理演算プロパティ > ダイナミックペイント > 設定 > ブラシを追加 でブラシを追加
    - 操作⑤：物理演算プロパティ > ダイナミックペイント > 設定 > 塗り色 を 白に設定
    - 操作⑥：物理演算プロパティ > ダイナミックペイント > ソース > ペイントを メッシュボリューム + 境界面に設定
    - 操作⑦：物理演算プロパティ > ダイナミックペイント > ソース > 減衰 を 一定に変更
    - ポイント：ペイントがメッシュボリュームのままだと、外側の波紋がペイントできない
- 外側の波紋にダイナミックペイント(ブラシ)を追加する
    - 操作①：RainWave_outを選択する
    - 操作②：物理演算プロパティ > ダイナミックペイント を追加する
    - 操作③：物理演算プロパティ > ダイナミックペイント > タイプをブラシに設定
    - 操作④：物理演算プロパティ > ダイナミックペイント > 設定 > ブラシを追加 でブラシを追加
    - 操作⑤：物理演算プロパティ > ダイナミックペイント > 設定 > 塗り色 を 白に設定
    - 操作⑥：物理演算プロパティ > ダイナミックペイント > ソース > ペイントを メッシュボリューム + 境界面に設定
    - 操作⑦：物理演算プロパティ > ダイナミックペイント > ソース > 減衰 を 一定に変更
    - ポイント：ペイントがメッシュボリュームのままだと、外側の波紋がペイントできない
         <img width="600" alt="rainWave.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/95479359-303e-6443-102e-d3a5f5336549.png">



- 地面にダイナミックペイント(キャンバス)を追加して連番画像を作成する
    - 操作①：Groundを選択する
    - 操作②：物理演算プロパティ > ダイナミックペイント を追加する
    - 操作③：物理演算プロパティ > ダイナミックペイント > 設定 > Add Canvas でキャンバスを追加
    - 操作④：物理演算プロパティ > ダイナミックペイント > 設定 > フォーマット を連番画像に設定
    - 操作⑤：物理演算プロパティ > ダイナミックペイント > 設定 > 解像度 を 1024に設定
    - 操作⑥：物理演算プロパティ > ダイナミックペイント > 設定 > サブステップを2に設定
    - 操作⑦：物理演算プロパティ > ダイナミックペイント > サーフェス > 半径 を 0.02に変更
    - 操作⑧：物理演算プロパティ > ダイナミックペイント > 乾燥 を 無効
    - 操作⑨：物理演算プロパティ > ダイナミックペイント > エフェクト > 収縮 を 有効
    - 操作⑩：物理演算プロパティ > ダイナミックペイント > エフェクト > 収縮 > 速度を0.15に設定
    - 操作⑪：物理演算プロパティ > ダイナミックペイント > 初期色 > タイプを カラーに設定
    - 操作⑫：物理演算プロパティ > ダイナミックペイント > 初期色 > カラー を黒色に変更
    - 操作⑬：物理演算プロパティ > ダイナミックペイント > 出力 > キャッシュパスを任意のパスに変更
    - 操作⑭：物理演算プロパティ > ダイナミックペイント > 出力 > UVマップをUVMapに設定
    - 操作⑮：物理演算プロパティ > ダイナミックペイント > 出力 > Bake Image Sequence で画像を出力する
         <img width="800" alt="ground.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/4d1d94e7-3953-863e-bbcd-fc4615867a18.png">
- ワールドマテリアルを作成する
    - 操作①：ウィンドウを分割してシェーダーエディターを表示
    - 操作②：ワールドに変更
    - 操作③：Shift + a > シェーダー > シェーダーミックス を既存の背景ノードとワールド出力の間に追加
    - 操作④：既存の背景ノードを選択してShift + d で複製
    - 操作⑤：複製した背景ノードの背景出力をシェダ―ミックスの第2シェーダー入力に接続
    - 操作⑥：Shift + a > テクスチャ > 大気テクスチャで大気テクスチャノードを追加
    - 操作⑦：大気テクスチャノードのカラー出力を第一シェーダ入力に接続されている背景ノードのカラー入力に接続
    - 操作⑧：第2シェーダ入力に接続されている背景ノードのカラーをグレーに変更
    - 操作⑨：Shift + a >  入力 > ライトパス でライトパスノードを追加
    - 操作⑩：ライトパスノードのカメラレイか？出力をシェーダーミックスノードの係数入力接続
        <img width="600" alt="worldMaterial.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/73395c9a-c781-b29b-65bc-298c0038ad02.png">

    
- 地面マテリアルを作成する
    - 操作①：Groundを選択してシェーダーエディターをオブジェクトに変更
    - 操作②：新規をクリック 
    - 操作③：プリンシプルBSDFのベースカラーをグレーに設定
    - 操作④：Shift + a > テクスチャ > Image Sequence でImage Sequence ノードを追加
    - 操作⑤：先に出力したイメージ画像をすべて選択してImport Image Sequence(aキーでフォルダ内のすべての.pngが選択される)
    - 操作⑥：Image Sequence ノードの繰り返しと自動更新を有効にする
    - 操作⑦：Shift + a > コンバーター > カラーランプ でカラーランプノードを追加
    - 操作⑧：カラーランプノードの右側のカラーストップの色をグレーに変更 
    - 操作⑨：Image Sequence ノードのカラー出力をカラーランプノードの係数入力に接続
    - 操作⑩：カラーランプノードのカラー出力をプリンシプルBSDFの放射入力に接続
       <img width="600" alt="groundMaterial.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/89dbdb1b-1957-9127-9042-3e03ad43a0fd.png">



# 動画の出力をする

以下の方法で動画の出力をする

- 内側の波紋を非表示にする
    - 操作①：RainWave_inを選択する
    - 操作②：オブジェクトプロパティ > 可視性 > Show in Viewport を無効にする
    - 操作③：オブジェクトプロパティ > 可視性 > Show in Renders を無効にする
- 外側の波紋を非表示にする
    - 操作①：RainWave_outを選択する
    - 操作②：オブジェクトプロパティ > 可視性 > Show in Viewport を無効にする
    - 操作③：オブジェクトプロパティ > 可視性 > Show in Renders を無効にする
- 画角を決定する
    - 操作①：3Dビューポート上で0キーを押し、カメラの視点にする
    - 操作②：サイドバーのビュー > ビューのロック > Camera to View を有効にする
    - 操作③：マウス操作で画角を決定する
    - 操作④：Ctrl + f12 で動画を出力する(出力先は冒頭で決定済み)
    
           <img width="600" alt="output.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/829704dd-52f9-b153-ab5e-29a1c04159dd.png">


# 補足：パーティクルのダイナミックペイント

ダイナミックペイントでパーティクルを指定してもオブジェクトの形状まではペイントされない。
だからパーティクルインスタンスを使用してダイナミックペイントをした。
リンク：[https://docs.blender.org/manual/ja/2.90/physics/dynamic_paint/brush.html](https://docs.blender.org/manual/ja/2.90/physics/dynamic_paint/brush.html)

<img width="600" alt="補足.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/d473271d-2a32-a878-e3ab-8524c2d4ff96.png">