この記事はVRChat Advent Calendar 2020の17日目の記事です。ツールとそれが何をしているか、それからMax Distanceの設定パターンを少し紹介1します。
VRChat向けに作ったツールなので、Unity 2018.4.20f1を前提としています。VRChat自体には依存していないので他にも使えるはずです。たぶん。
きっかけ
先日、こんな記事2を書きました。これを読めばClothコンポーネントの仕組みは完全に理解できたはずです。理解したら使ってみたいですね。しかし。
- じゃあ具体的にどうすればいいの?
- 計算したくない。
- パラメーター多すぎ。
- 標準のエディタ使いにくい。
色々と問題があります。とりあえず動くようになると嬉しい人も多そうです。そして何より、自分が楽をしたいですね。そんなときUnityではC#を書きます3。
そうしてできたものがこちらになります。マニュアルも用意したBooth版(有料)もあります。
ツールができること
手作業でやっていたことを自動化するツールになります。いつも何をやっているかを整理して4種類の機能を作りました。
- コライダー設定
- Max Distanceの設定
- その他パラメーター調整
- よくあるミスを防ぐ
1. コライダー設定
Humanoidの各関節にSphere Colliderを追加し、2個組でClothコンポーネントに設定していく作業です。スカートであればHipsと左右のUpper Leg、Lower Legで4組5個、ロングスカートになればFootも増えて6組7個になるので何度も設定するのはそれなりの手間です。
ボーンはAnimator.GetBoneTransform
からすぐ取れるので、Sphere Colliderがなければ追加し、あればそれを参照するだけです。CenterやRadiusはアバター毎に調整することになるので自動化は見送りました。
Advanced Modeで細かくいじれるようにしました4。
2. Max Distanceの設定
Clothといえば出てくるこれは最も自動化したいところでした。編集UIの扱いづらさは言うまでもなく、どんな値を入れていいのかわからないということも多いでしょう。
Max Distanceは頂点が動ける範囲を指定します。その最も重要な役割5は布のどこかを固定する6ことです。固定するということは頂点の動ける距離を0にすることになるので、Max Distanceを0にする部分を作ります。ツールではメッシュ上端7からある程度8下までを固定しています。
また、頂点が動く範囲を制限して制御しやすくすることもできます9。とはいえ、ただいたずらに設定してもコライダーの動きについていけずに貫通したりします。そこで2パターンの算出方法を用意してみました。
2.1 Spreading Constraint
スカートの広がりをもとに算出する方法です。スカートが捲れ上がったときにHipsのコライダーを乗り越えてしまうタイプの破綻を防ぐことを意図しています。Advanced Modeでないときはこれが適用されるようにしました。脚のボーンにウェイトが載っていない場合にうまく作用します。
例えば80度までしか広がれないようにすれば、上のGIF画像10のような破綻を下のGIF画像のように防ぐことができます。
2.2 Inside Constraint
足のコライダーへの食い込み距離を基準として制限し、コライダーを突き抜けないように設定します。脚のボーンにウェイトが載っている場合にうまく作用するはずですが、あまり広がらなくなります。実はあまり使っていません。
3. その他のパラメータ調整
デフォルト値はあまりにイケていないので適当な値を入れてあげます。ツールでは破綻しにくい、制御しやすいパラメーターを入れるようにしました。Inspectorからの入力自体の手間は少ないので、こだわる人は自分で好みの値を入れてくれるはずです。
4. よくあるミスを防ぐ
わかりにくいハマりどころを潰したいのと、実装を簡単にするためのエラー表示機能です。
4.1 頂点数チェック
頂点数が増えると計算負荷が増えます。ツールを使った影響で重たいアバターが増えて欲しくはないので、上限を設けました。ただ単に頂点数を数えているだけです。
4.2 Transformチェック
Clothコンポーネントとそれに設定されたTransformが初期値でないと意図しない挙動が起きたりします。特にScaleはすべてのパラメーターに影響を与えるので1であるべきです11。TransformやRotationはエディタがうまく動かない原因になったりします。
おわりに
「いかがでしたか?」と特に主張したいことはありませんが、Clothを使いたい人に少しでも参考にしてもらえれば幸いです。
ツールはまだまだ完成ではなく、今後もアップデート12を続けていく予定です。
「使った」報告やバグ報告はどこからでも歓迎です。これら13が開発の原動力になります。
-
Unity拡張の実装上の細かいところは書いていません。調べればたくさん出てきますので。 ↩
-
煽りタイトルですが、本当に書いてないのであながち間違いではないのです。 ↩
-
ちなみにBlenderならPythonです。大体なんでもできます。楽しいですね。 ↩
-
このひどいUIをなんとかしてくれ! ↩
-
最近セットアップするアバターはこれだけで済ませています。 ↩
-
固定してなければどこまでも落ちていきます。Colliderがあっても大抵はずるっとすり抜けて落ちていきます。 ↩
-
最初はHipsボーンでしたが、アバター、衣装で差がありすぎるので変更しました。 ↩
-
衣装に合わせて調整するように説明書に書きましたが、
誰も読んでいないようです。 ↩ -
勘違いされがちですが、Max Dixtanceの範囲は0~1ではありません。0~∞の範囲で適切な値を導出しなければなりません。 ↩
-
GIF画像はイメージとしてBlenderで簡単に作ったものです。 ↩
-
ArmatureからRoot BoneまでのScaleも影響しているようです。今後のアップデートで対応を検討しています。 ↩
-
とBoothの売上ももちろん。 ↩