VRoidのワンピーススカートに、UnityのClothコンポーネントを適用し、VRChatに持っていくまで

# はじめに
はじめまして、ファル・マカです。
無能なので非常に長い記事になってしまいました。申し訳ないです。
ショートカットなどの基本的な操作説明を省いていますので、Blender・Unityを触りだした直後の方は~~読むのをやめた方が良い~~他の記事も参考にしながらどうぞ。記事終盤は本当に、一回Cloth触ったことないと分かりづらいです。。。
とはいえ、私のBlender・Unity歴も4カ月なので、専門的知識は少ないです。必要のない作業を行っている可能性もあります。

**当記事で制作するアバターは、VRChat上で必ず"Very Poor"と判定されます。**(2019年8月時点)
加えて、**リップシンク・視線の追従・テクスチャのアトラス化等については割愛**させていただきます。(Clothだけで既に内容が長すぎる上、参考になる記事がいくつもあるので。)

VRoidを使っていないアバター自作勢に役立つ記述は少量です。

# (個人的)VRChat上でのClothの弱点
1. VRChat内では頻繁にテレポートがあるため、いくつかの数値を0にする必要がある。
2. 計算がローカルで行われるため、自分の画面では綺麗でも、他者視点では崩れている可能性がある。
3. 重い。自分だけでなく他人のPCにも負荷をかける。

1.2.は自己責任で済む話ですが、3.についてはアバターパフォーマンスによる非表示システムがあるとはいえ、十二分に注意を払いましょう。

# 今回の完成品(動画と写真)
https://twitter.com/falmaka/status/1170629032729165826?s=20
https://twitter.com/falmaka/status/1178694098133237760?s=20
音声なしの動画と、スクショです。
深夜にも関わらず撮影依頼に対応してくださった[ゆーげんさん](https://twitter.com/yuugen6vr)、[にゃんぱす](https://twitter.com/Nyan_Pa_Su)さん、ありがとうございます...！

# ここから先へ進む前に
[Unity公式ブログのClothに関する記事](https://blogs.unity3d.com/jp/2015/11/24/unity5clothsimulation/)を読んでおいてください。
(Clothを根本的に理解するにあたって、必要な情報のほぼ全てがここから得られます...ありがてぇ...)

# 環境
- VRoid 0.7.2
- Blender 2.8
- Unity2017 4.28 f1
- VRCSDK 2019.08.23
- VRM Converter for VRChat-15.0.1 + UniVRM-0.53.0


# VRoid編
キャラクターを書き出すだけです。スカートの広がりや長さはお好みで。
ただし、後でClothコンポーネントを適用し、重力の影響を受けてすぼむため、それを考慮しておくと良いかもしれません。
![Vroid01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481979/c96990ae-ce54-9809-9a04-17a90217fce5.png)



# Blender編
日本語化については省略します。
### VRM Importer/Cats Blender Pluginの導入
画面左上の「編集」から「プリファレンス」を開きます。
出てきたウィンドウでアドオンを選択し、画面上部の「公式・コミュニティ・テスト中」の3つ全てを、選択された状態にして下さい。
その後検索ボックスに「vrm」と入力し、VRM_IMPORTERを有効にしてください。(チェックがついていればOK)
![Blender01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481979/f4f4b52f-577f-4f04-3040-000ece78f583.png)

同様に検索ボックスに「cats」と入力し、Cats Blender Pluginを有効にしてください。
![Blender12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481979/4bcf01cd-4ade-8197-fba0-3d44db7cfb67.png)


### アバターの読み込み
コレクションを空に(キューブとかを消)した後、
Cats Blender Pluginを表示して、Vroidでエクスポートしたアバターを読み込んでいきます。
適当に画像で載せてるところをポチポチして、ImportModelを押していただき、読み込みたいvrmファイルを指定すれば、読み込めるはずです。
![Blender13.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481979/79d9eb30-d388-9532-0115-b120293de31d.png)

![Blender14.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481979/78506f12-a4e5-a086-f463-bd09ed2314b4.png)

### フルトラ対応
そのままCats Blender Pluginを使ってボーンのフルトラ対応を行います。
Fix Modelの右にあるレンチマークを押して、全てにチェックをつけた状態でOKを押します。
その後、Fix Modelボタンを押してください。
![Blender15.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481979/72335aaf-4fbb-00c1-087b-b88737404dc6.png)


### Clothを利用するにあたって、不必要なボーンの削除
スカートは物理演算で処理するため、そのために設置されたボーンは不必要です。
Armatureを選択し、編集モードでスカート用のボーン(画像参照)を削除してしまいましょう。
![Blender16.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481979/de3b6c22-3d39-29ad-92c6-42ee46c1ad95.png)


### Clothで揺らしたい部分の分離と細分化
オブジェクトモードに戻ってBodyを選択し、編集モードに入ります。
Clothを適用したい面を選択後、「メッシュ＞分離＞選択」で分離してください。
今回、蝶々結び部分は分離してません。(紐が一本ではないなどの説明が面倒なので)
![Blender17.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481979/252824e2-5a47-257d-7252-ad6b66e213c1.png)


これによってスカート部分がBody.001として分離されたので、このメッシュを細分化します。
編集モードでスカートのメッシュを全選択し、辺→細分化を行います。
私は分割数2で行いました。(個人的にはこれ以上細分化すると、存在が迷惑なレベルの負荷になるかと思われます)
![Blender18.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481979/5dc0d152-98ae-a366-6b34-5234d46124c1.png)


### 不必要な頂点グループの削除
オブジェクトモードで「Body.001(スカート)」を選択し、頂点グループからChestとSpineを除くすべてを削除してください。
「Body」の頂点グループは触りません。
![Blender19.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481979/1bd4ba7a-2a12-4d32-5718-e82c616087bd.png)

余談ですが、実は今回**腰紐部分でスカートを固定し、それ以下はClothで処理する**ことを目標としています。


### 不必要なウェイトの削除
腰紐部分で固定するため、スカートのウェイトは腰紐にだけ残します。
下記4枚の画像を参考に、Chest・Spineそれぞれの頂点グループから、ウェイトを一部消してください。

①Chest編集前　
![Blender20-1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481979/c1fd27e3-42f2-7d66-2753-67269c5bdfcf.png)

②Chest編集後
![Blender20-3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481979/4ddfa02a-d1f9-592c-d8df-aa6d2193ddee.png)

③Spine編集前
![Blender20-2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481979/50d228f7-a0e1-9f8b-671a-0fd96f69db65.png)

④Spine編集後
![Blender20-4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481979/c5b3635f-b1b0-0647-9aa4-7288d51d0f01.png)


### スカートの座標系
**この確認をすっ飛ばすと、UnityでClothを適用した瞬間布が大爆発する可能性があります。**
オブジェクトモードでスカートを選択し、**拡大縮小が1：1：1になっているかを必ずチェックしてください。**
もしなっていない場合は「オブジェクト>適用>拡大縮小」を行ってください。
![Blender21.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481979/bf9c842e-dd69-f155-a73d-f603a18cac9d.png)

服・アバター自作勢向けの余談ですが、Blenderのアーマチュアが適用された状態でUnityのClothを適用すると崩壊・大爆発し、ボーンとClothの共存を諦めた方は、拡大率1：1：1じゃないと崩壊するかもって公式ブログがちゃんと教えてくれています。
私みたいにClothで服作った後、8時間もUnityにブン殴られた挙句ふて寝しないように。
本当に言いたいことは、意図しないClothの変形をボーンによって抑えることができる(はず)ということです。勉強中。

### FBXファイルの出力
下記画像を参考に出力してください。Blenderから一旦解放されます。
![Blender11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481979/3b8df900-a77f-8343-a92c-6501692c169f.png)



# Unity編

### プラグイン(アセット)のインポート
VRCSDKを入れた後、[100の人さん](https://twitter.com/esperecyan)が提供してくださっている、最新版の[VRM Converter for VRChat](https://booth.pm/ja/items/1025226)をダウンロードし、
「VRM Converter for VRChat-〇.〇.〇 + UniVRM-〇.〇.〇」をインポートしてください。
(今回はダイナミックボーンについて触れませんが、使用する方はVRCSDK→Dynamic Bone→VRM Converterの順でのインポートを推奨します。)


### VRMのインポート(によるマテリアル生成)
**一番最初にVroidで書き出したモデルを読み込み、VRM Converterで変換**を行うことで、VRChat向けのマテリアルを生成していきます。
先ほどBlenderで書き出した.fbxファイルは、まだ使用しません。

まずは下記画像の方法で、.vrmアバターを読み込んでください。
![Blender22.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481979/efc36eb3-eaa2-a594-07da-242b38f6d1e9.png)

Assetsに「アバター名.prefab」が生成されたら、それをシーンにドラッグ&ドロップしてください。
その後、そのアバターを選択した状態で、画像のように「Duplicate and Convert for VRChat」を実行します。
![unity2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481979/5557c11e-5936-ade1-985f-ea8e4cd4d49f.png)

これによって「アバター名(VRchat).Material」というフォルダが生成されたら成功です。
確認したら、シーンに居るアバター2体は削除してください。

### FBXのインポート
AssetsにBlenderから書き出したfbxファイルをドラッグ&ドロップし、生成されたfbxファイルを選択します。
InspectorビューでRigタブをクリックし、**AnimationTypeをHumanoidに変更してApplyボタンを押してください。**
![unity4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481979/aacfd33c-15c2-03ff-0174-6b99927069f4.png)

Applyを押して処理が終わったら、そのfbxファイルをドラッグ＆ドロップしてシーンに読み込んでください。
おそらく酷い見た目になっていますが、次項で直すので気にしないで大丈夫です。
スカート部分である「Body.001」を「Cloth」という名前に変更しています。(説明の為なので、しなくてもいいです。)
![unity3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481979/971358ea-c367-a59b-3d9f-435fdaf7b100.png)



### マテリアルの差し替え
Bodyを選択し、Inspectorに表示されたマテリアルを「アバター名(VRchat).Material」内にある同名のマテリアルへと全て差し替えてください。
Clothにも同様の作業を行います。(こっちは一つだけでいいはず)
![unity5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481979/ed24ef95-6c8c-7e4f-3546-654611dd8df0.png)


### Clothコンポーネントの適用
ここまでの作業で疲れている方には申し訳ないのですが、ここからが地獄です。
手を動かす量が多いので、一度保存して休憩を挟むことを推奨します。

シーンからClothを選択し、InspectorビューのAdd Componentボタンから、Clothを適用します。
![unity6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481979/c8ac16c2-b8da-6477-2f82-ab640b6c66bb.png)


### Constrainsの設定
Max DistanceとSurface Penetrationの2項目があり、ウェイトを塗る感覚で扱えます。(今回はSelectだけで塗っています。)
Constrains(制限)とある通り、どれぐらい変形できるかを決めるための項目であり、どのように変形するかを決める項目ではないです。
今回、この2項目を設定している間は、アバターのScaleを5:5:5程度に拡大することを推奨します。
1:1:1だと非常に見ずらく、設定しづらいです。
**以下2項目の設定が出来たら、次の項目に進む前に必ずScaleを1:1:1に戻してください。**

**・Max Distance**(0~1)
頂点が初期地点からどれぐらいの距離動けるか、上限を決めます。
Blender編で記述した通り、今回は腰紐部分で固定するので、その部分を0(Clothの影響を受けなくし、ボーンで制御)にするのは絶対です。さもなくば重力に従ってスカートが落下します。
膝がスカートに衝突する部分から下は、比較的大きめの値を取ると良いと思われます。![unity7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481979/b5c127c7-79a8-d342-2881-10396b910235.png)

**・Surface Penetration**(0~1)
間違った説明をします。
今回のロングスカートに限って言えば、面がどれぐらい変形できるか、上限を決めます。
参考画像を以下に記載しますので、お好みで設定しましょう。(後述するStreching Stiffnessは1、Bending Stiffnessは0.7かつ、Self CollisionとInter Collisonが設定済みの状態で撮影しています)

###### ▶Surface Penetration=0(全部赤)
![unity9-4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481979/6fdf94c8-59c7-147f-dc20-27dcd1e44cae.png)

###### ▶Surface Penetration=1(全部緑)
![unity9-2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481979/1551de5f-e247-2580-c4de-fbc9264eaed4.png)

- 私の設定
赤=0、黄=0.7、緑=1です。
![unity10-1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481979/0dc43274-e521-cdb9-5fb6-920fb9fc6d25.png)




### SelfCollisionとInterColision
**Constrains設定時にアバターを拡大した方は、必ずScaleを1：1：1に戻してください。**
物理演算の結果、布を貫通する布が生まれます。ここではそれを改善します。
結構重くなってしまう項目ですが、特にロングスカートでは設定せざるを得ないです。
**※やり直しが効かないことが多いため、設定前にアバターを複製し、バックアップとしておきましょう。**

まず、ここまでと同じ要領で、下記画像のように一定の高さ以下にSelfCollisionとInterCollisionを設定します。
Selectで選択し、"Self Collision and Inter Collision"にチェックしたら、続けて必ず次の項目を設定してください。
![unity10-4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481979/1ae8500a-90da-d02b-0fcb-c7f8bd519ef0.png)

画面右下にあるSelf Collision Distanceを0.15に設定します。
設定するためのボックスが見えない場合は、Sceneビューで緑色になっているスカートのパーティクルを、適当に選択してください。
この項目を設定しないとスカートが大爆発します。
**衣服自作勢向けにですが、数値の基準は画像のように、SelfCollisionとInterCollisionの設定された衝突判定用のパーティクルが重ならないサイズです。**
![unity10-3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481979/77f8b4a4-e06c-4803-83fc-86d45bd80dd2.png)


### Clothコンポーネントの各値について
各値について認識や、個人的な所感を書きつつ、設定は最後にまとめて公開します。

**・Streching Stiffness**(0~1)
0に近づくほど「縮みやすく、伸びやすい布」になるイメージです
伸びも縮みも必要ないと思うので、0.9～1を推奨します。

**・Bending Stiffness**(0~1)
0に近づくほど「ねじることができるようになります」
今回のスカートでは、皺の数にかなり影響を及ぼします。(0に近づくほど、皺が細かく多くなる。)

**・Use Tethers**
公式マニュアルでは、「動いているクロスのパーティクルが固定されたパーティクルから、遠くに離れ過ぎるのを防ぐ制限を適用します。」とあり、固定された頂点の周囲の頂点を、少し控えめな挙動にしてくれるようです。今回はチェックをつけていますが、おそらくMax Distanceを完璧にに設定できる方は必要ないです。私は無理。(要検証)

**・Use Gravity**
重力の影響をうけるかどうかです。今回はチェックをつけます。

**・Damping**(0~1)
1に近づくほど、動きが強く減衰されるようになります。

**・External Acceleration / Random Acceleration**(0~∞)
布に一定、もしくはランダムに風を当て続けるための項目です。
今回は0に設定しますが、一定であれば旗とか、ランダムであれば嵐の表現などに使えるかと。

**・World Velocity Scale / World Acceleration Scale**(0~1)
キャラクターの動きに合わせて布を変化させる項目です。
Velocityはその時点での速度、Accelerationはその時点での加速度を参照して、布の動きを計算します。
*※VRChatでは頻繁にテレポートという名の超高速移動をするため、この2項目は0を推奨します。*

**・Friction**(0~1)
摩擦係数です。0にしてます。

**・Collision Mass Scale**(よくわからん)
Clothの頂点に付いた判定用パーティクルのサイズを変えてくれるのだと思いますが、特に触ってないです。

**・Use Continuous Collision**
チェック必須だと考えています。判定の安定性が向上します。

**・Solver Frequency**(1~∞)
秒間あたりにどれぐらいClothの計算を行うかです。
Unityで上げすぎると負荷が高くなり、下げすぎるとCloth周囲に変な三角メッシュが現れます。
ただVRChat上だと変化がないように感じたため、120とかで固定されてるかもです(要検証)
120でゆっくりした動きには十分対応できます。素早い動作をする場合には480以上が妥当とのこと。

**・Sleep Threshold**(よくわからん)
この値以下の細かすぎる動きを無かったことにできます。裾とかが小刻みにプルプルし続けるのを防いでくれるはずです。

**・今回の設定**
![unity11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481979/93173d68-6fb5-461e-98c4-15140d7f8286.png)


### コライダーの設定について
**この項目については、身長・体のパーツの大きさに大きく影響される**ため、
本当は動画にしてイメージを共有したいところなのですが、スペック不足の為申し訳ないです...！

代わりにパンツが見えないよう全身黒タイツにされた我が子と、
数枚の写真がヒントになればと思います。
お腹周りのテクスチャについては貫通に勝てなかった為、テクスチャを消去し Shader の Rendering Type を Cut out にしています。

**・正面**
![unity13-2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481979/0236ab54-5565-3591-0697-278da8da09ef.png)
**・側面**
![unity13-1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481979/4371b682-55a3-7f32-6ebe-7bcf5090772f.png)
**・階層**
全てSphere Colliderで、[Cloth]と名前に書いてあるものがそれです。
このように必ず空のオブジェクトを作り、その中にSphere Colliderを加えましょう。
後にも記載しますが、**この空のオブジェクトは、Colliderの設定後必ずオフに**してください。
![unity13-3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481979/1d333af6-6504-f787-793f-246a0686de5f.png)
**・Clotht上での設定**
Element10と11は、後ほど記載するためここでは隠しています。
![unity13-4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481979/6070393e-4cfa-7113-95d7-fbb35cb6fe8d.png)
**・各コライダーの数値**
![unity13-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481979/2a03233d-a182-166c-df76-e13f53f84a6f.png)

近い体型であればある程度流用できるかもです。
先ほど「階層」で紹介した画像と一緒に見ていただけると幸いです。

|名前(何の階層内にいるか)|Radius|x|y|z|
|-----|-----|-----|-----|-----|-----|
|HipL(Hip)|0.092|-0.03|0.536|0.0192|
|HipR(Hip)|0.092|0.03|0.536|0.0192|
|SpineL(Spine)|0.085|-0.03|0|0.01|
|SpineR(Spine)|0.085|0.03|0|0.01|
|Chest(Chest)|0.073|0|-0.001|0.0123|
|UpperLegL(Left Leg)|0.085|0.0134|0.0008|-0.0042|
|LowerLegL(Left knee)|0.1|0|0|0|
|FootL(Left ankle)|0.08|0.01|0.0265|0.136|
|UpperLegR(Right Leg)|0.085|-0.0134|0.0008|-0.0042|
|LowerLegR(Right knee)|0.1|0|0|0|
|FootR(Right ankle)|0.08|-0.01|0.0265|0.136|



### スカートを手で持つためのコライダー
だいたいこんな感じで、中指の先にあるボーンに設定します。
普段は赤く囲ってある部分を(0,0,0)にしておき、
アニメーションオーバライドで(1,1,1)になるように設定すると、
トリガーを引いている間(FIST)のみ、スカートを持つことが出来るようになります。
**※ColliderそのもののON/OFFは、何故かClothに関連付いていると効かないため、
このように親オブジェクトのScaleを変化させることでしか対応できないかと思われます。**
何を言っているかわからない方は、「VRChat アニメーションオーバーライド」などで検索すると良い記事がいくつか出ると思います。
![unity14-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481979/a76ead77-fd8d-7284-3c4c-cd569e3255dd.png)

親オブジェクトのチェックを外したり、
![unity15-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481979/14caddf8-a306-e70e-b0f5-a4ec62f00af6.png)

Cloth側にコライダーを設定してあげることも忘れずにしましょう。
![unity15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481979/ea2ca2e7-5384-ecf8-caf7-848d75d7ed2a.png)

### 手動でのClothリセット機構
最初に紹介した弱点にて、
「計算がローカルで行われるため、自分の画面では綺麗でも、他者視点では崩れている可能性がある。」としましたが、
このような、**スカート(Cloth)を1フレームの間OFFにするアニメーションを作り、それをアニメーションオーバーライドでEmoteに設定する**ことで、Emoteによるリセットが可能になります。
ちなみにこちらも何故か、**Cloth Componentを切るアニメーションは効かなかった**為、親オブジェクトをOFFにしましょう。
![unity16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481979/b3cfe580-e0f7-2c1b-5232-f286b31ee198.png)



### (番外編)Clothリセット機構
今回のスカートに適用すると重すぎるので使っていませんが、最初に記載した弱点のうち２つは、[せしおんさんの機構](https://twitter.com/sesion_noises/status/1160166526772662277?s=20)がかなり改善して下さるため、負荷の低いClothであれば導入を推奨します。(念のため[DropBoxのリンク](https://www.dropbox.com/s/cxq80r5gdig0lbf/VRChat_AutoClothResetter.unitypackage?dl=0))

# さいごに
### 上手くいかなかった方・あまりにも面倒になった方へ
Twitter([@falmaka](https://twitter.com/falmaka))か、Discord(ファル・マカ #1965)までご連絡下さい。
Discord使って画面共有して頂きつつであれば、記事よりは分かりやすく説明できるかと思われます。(暇があればですが...！)

### 上手くいった方へ
お疲れさまでした！！！
存分にVRChat内で清楚ムーヴを楽しんでください◎◎◎
もしもこんな記事に感謝をして頂けるのであれば、[欲しいものリスト](https://www.amazon.jp/hz/wishlist/ls/18F6AAL8HSLQJ?ref_=wl_share)があるので、何卒...！