見出し画像

【VRC向け】きれいで低負荷なClothを作る為の最低限の前提知識。

ラケシア

8月6日追記

VRCのUnity2019環境移行時において、
不幸な仕様変更が重なった結果、
Clothが使い物にならなくなりました。

https://twitter.com/IKEA_ToS/status/1423399049420365828?s=20

画像8

自身のClothの出来栄えや(余程重くしない限り)負荷に関係なく、
ワールドや他プレイヤーの存在によりFPS自体が下がると、
Clothがスローモーション再生したかのように
ふわふわウネウネした動きになるということです。

早く元の仕様になることを祈っています。

追記:諦めましょう。


前書き
現時点でClothを"やり込む"には覚悟が必要という話。


まずはじめに。
Clothには膨大な愛と、気が狂う程度失敗の繰り返しが必要となります。
強い心をお持ちください。

また、現時点(2021年8月1日)でClothを触るくらいなら、
PhysicsBone実装に備え、ウェイトペイントやボーン配列の練習をした方が良いと思われます。
Clothは相手から触れないことから、需要も間違いなく低下します。
(触る方法はありますが、私でも面倒くさいと感じる程度の難易度です。
それが出来るならPhysicsBoneに苦労することはないでしょう)

負荷についても、VRChat公式が開発し、VRC向けに最適化されているPhysicsBoneの方が軽いだろう、と想像するのは難しくありません。

12月24日追記。
Unity2019からはPhysXがCPU処理からGPU処理に変わったため、グラボ未搭載ではない限り、Clothはめちゃくちゃ軽くなりました。
たぶんPhysicsBoneより軽いです。

2022年1月7日追記。
最適化前提の話です。

特に、
「○○ちゃんの服キレイだね☆」
「Cloth使えるんだぁ。すごいねぇ!」のような、
他の人から褒められたい的な承認欲求の為にClothを触ろうとするのは、
本気でおすすめしません
精一杯努力したところで、少しでも欠点や欠陥が見つかると、先人現人たちが生み出す偏見により、
「Clothは○○(欠点)だからなぁ~(笑)」の一言で釈明の猶予もなく切り捨てられる。そういうこともあります。
(私自身そういう場面に数十回程度は居合わせています)

商業シーンプロの世界Clothが殆ど使われていないという時点で、
扱えるようになるまで相当の期間や工数が必要なのだろうというのは、
ご想像いただけるかと思います。


それでもClothを触りたいという強い意思を持てた方は本編へ。


本編

まずはこちらをお読みください

説明書に載ってない本当のClothコンポーネント ~VRChatで使うClothコンポーネント~

とりあえず、最低限やって欲しい、認識しておいて欲しいことから、しょうもない事まで、適当に書いていきます。

既知のバグについて

まずはこれを読みましょう。
Unity(2018) Clothハマりどころトラブルシューティング

Clothは直らないバグ(仕様)と常に向き合うことを強いられます。
まずはこれらに対してある程度の理解を示すことが必要です。
無理ならClothは諦めましょう

ちなみに筆者が2020年10月に問い合わせたバグ(Unity5時代から存在するもの)についてUnityが記載したのは2021年になってから。
UnityはClothをまともに触れてすらいない可能性があるので、
Unityに問い合わせるくらいならコレ読んでください。

Clothの負荷を減らすための4つの方法

魔法か? というくらいに簡単なのでぜひ実践してください。


・Sleep Thresholdを1にする。

非情に残念なことに、多くのVRC向けCloth関連の記事でコレについて調べてみると「よくわからん」とか「意味がない」的な記述が多いです。

Clothは誰もが扱えない欠陥品ですが、意味が無いものは存在しません。

とりあえず、理屈を知らなくてもいいので1にしておきましょう

ざっくり言うと、目に見えるか怪しいレベルの動きや僅かな振動、
いわゆる"微動"を内部的に無効化するものです。

どうせ動いているか判別がつかない程度の演算を無効化するだけなので、1にしてても動きの見た目は変わりません。

ちなみに1より大きい数字も入力できますが、1000000とか入力しても変化がなかったので恐らく機能していません。

0.11~0.99と入力しても0.1との違いを感じ取るのは無理でした。
おそらくBoolです。0がoffで1がon。
過去にUse Continuous CollisionがFloatになっていたこともあるので、あながち間違いではなさそうですね。

ていうか負荷に直結するパラメーターだから入れ得なんですよ。
この考えに行き着くことなく脳死してるなら目を覚ましてください。

デフォルトで0.1とか入力してあるUnityに中指を立てておきましょう。
そもそもの悲劇の原因。


それでは、ご唱和ください。

アナタの恋人Sleep Threshold 1

三度の飯よりSleep Threshold 1

日本の首都はSleep Threshold 1

……よろしいですね?


・Use Continuous Collisionを無効にする。

まずClothの動きそのものは変化しません。
コライダーは突き抜けにくくなりますが、そもそも腰トラが吹き飛んだら大体破綻するので意味がありません。
ここまで言うと暴論でしょうが、少なくとも演算負荷は下がります。
ちなみに有効にすると演算負荷は2倍です。
コライダーを設定していなくても2倍です。

もし、これが無いとClothがコライダーを突き抜けてしまう、といった問題が発生しているならば、メッシュを作り直すか、
Stretching, Bending, Damping, または、External Accelerration等。
数字と、殴り合いをして和解を目指した方が良いでしょう。
地力も上がります。
ご自身の脳への負荷も上がるかもしれませんが……。


・Solver Frequencyの数字を特定の値にする。

結論から言うと90180270にしてください。
勘の良い方は90の倍数になっているから450や900でも良いのだろうと思ってしまうかもしれませんが、300以上の数字にすると負荷が増え方の割に動きが綺麗になりにくくなります。割に合わないので、おすすめしません。
また90の倍数である理由はVRChatにあります。
以下はNVIDIA公式のドキュメントからの引用。

As a rough guideline, a dozen cloth instances with 2000 particles each and a solver frequency of 300Hz can be simulated in real-time as part of a game.
https://docs.nvidia.com/gameworks/content/gameworkslibrary/physx/guide/3.3.4/Manual/Cloth.html

It is common to set this value to a multiple of the fps target for the application.
https://docs.nvidia.com/gameworks/content/gameworkslibrary/physx/nvCloth/UsersGuide/Index.html

ざっくり言うならば、
頂点数は2000Solver frequencyを300で動かすことを想定して作られてるよ。
Solver frequencyは動かすアプリのfpsに合わせてね」という感じです。

もし、あなたのClothが300より高い数値にしないと、ブルブル震えっぱなしになるというのであれば、
それはメッシュ形状に問題があり、
Cloth Particleが荒ぶっている高負荷な状態なので作り直しましょう。

・Virtual Particle Weightsのサイズを3にする。

デフォルトだと9になっていますが、何も意味がないです。
Unity2018限定のバグです。

画像4


・Sleep Thresholdを1にする。

大事すぎることなのであと10回くらい書きたい。


Max Distanceについて

Max Distanceをウェイトと表記している方が一定数いたので、解説します。
これはそもそもウェイトではなく頂点が初期位置から移動可能な距離のことです。
したがって上限は1でも2でもありません。100でも10000でも設定出来ます。
単位はUnit Scaleです。大抵の場合は1mになっています。
基本的に体長2メートル超や、Clothの始点が胸元や首元ではない限り1.5を超えることはほぼ無いと思って良いでしょう。

・MaxDistanceを10000メートル(実質的な無制限)にした際と、未設定(黒い点)/Unconstraintedにした際の違いについて。

ウェイトの影響を受けるか否かです。
正確にはMaxDistanceで設定した移動距離の上限に到達しない限り、ウェイトの影響を受けることはありません。
つまり、距離制限の存在しない未設定(黒い点)ならばウェイトの影響を受けないということになります。

DB向けに作られた衣装にClothを適応したりすると、スカートの裾がやたら跳ね上がったり、謎のうねりや、慣性が逆向きに働いたりするのはだいたいコレ(ウェイト塗り)のせいだったりします。
ウェイトをCloth向きに塗り直しましょう。

10月17日追記:NvClothはClothコンポーネントがOnになった瞬間の形状からClothが動き始めます。
つまり、Onにした瞬間ウェイトの影響を受けるようになりました。
意図的にClothをOn/Offするような(リセット)アニメーションを入れていると、場合によってはClothが局所的に伸びたりします。
ご注意ください。


Cloth爆発。Cloth蒸発。

8月5日追記:Unity2019にて、こちらの仕様は消えました。

Clothをやっているとよく見かける嘆きの一つです。

まず原因ですが、Clothコンポーネントを適用したメッシュは、
RootBoneに指定されているオブジェクトのTranceformに依存します。

着せ替え元のボーンのScaleが狂っていたりすると、着せ替え先のArmatureに移植した際にScaleが変わるので……。

画像5

爆発したり。

画像6

収縮して、蒸発したように見えたり。

Cloth衣装を着せ替える時は、root先の数字が狂わないように順序立てて行うことを心がけましょう。
またはRoot先となる空オブジェクトを元のRoot先(大抵はHips)の配下に作成し、(Constraintが使えることが条件になりますが、)そちらでScaleを調整する等の対策をしましょう。

Clothが爆発or収縮する原因のほぼ全てが、
Root先のScale / Armatureが1,1,1ではないことに起因します。
これらの性質を扱えば、スカートの丈の長さを調整したりも出来ます。
シェイプキーが使えないClothならでは、の手段です。


ちなみにUnity2019になったらこの仕様はなくなります



"World Velocity Scale"および、
"World Acceleration Scale"の上限値は
1が最大ではない。

2でも3でも10000でも使える。実用的か否かはさておき。

画像2

残像の黒い影がすさまじい。

ある意味で無負荷のパーティクルが出来ますが、
こんなもの使わずパーティクル使いましょう。


Clothの負荷が上がってしまう根本的な理由。

まず一番挙げられるのは頂点数。次点でSolver frequencyの値。
両方とも大事な要素ですが、
そもそもな話、Clothは現実世界にある布の動きをある程度模倣して作られているものであるということです。
なので、物理的にありえない構造をしているものや、大量に鋭角があったり、表面積のバランスが崩れていたり等、結果的にリアルの布構造から遠くなればなるほど演算負荷は増えやすくなる傾向にあります。

同じ頂点数で作ったPlane(板)とCube(立方体)をCloth化するとわかりやすいでしょう。

演算負荷の増加は、1回あたりの演算結果に大幅なブレを生じさせます。
まずは柔らかく、リアルに近い布構造を作ることを心がけましょう。

画像6

左がスカルプトで適当に作ったもの。右が約一年前に製作した頒布品です。

三角面化をモデリングの時点でしている理由は、
Clothの折れ方は辺に依存するからです。
Unity側で勝手に三角面化されると、Clothの挙動が想定していなかったものになることがあります。
なので、手動で三角面化するのをおすすめします。(強制ではありません)


Colliderを突き抜ける方向をコントロールする。


コライダーに挟まれたメッシュはより小さい方のコライダーに向かって貫通します。

メッシュが貫通する方向を制御出来ると、Clothが破綻したり、コライダーにめり込んだりしても、移動エネルギーやMaxDistanceの距離制限の範囲外に行った時に、元の形状に戻すことが出来ます。

何言ってるかわからない?
私も説明の仕方がわからない。
動画とかDiscordの画面共有でしか説明できませんねコレ。

SphereとCapsuleの使い分け。

手に仕込むコライダーはCapsule
胴体に仕込むコライダーはSphereにしましょう。

画像6

手に仕込むコライダーをSphereにしない理由ですが、
球体とカプセルどちらが滑りにくいでしょうか。
理解できれば次へどうぞ。

Capsule Colliderを沢山設置して擬似的に繋ぎ合わせても必ず隙間が生まれます。
その隙間にCloth Particleが入り込むと負荷と破綻のリスクが上がります。

連結しているSphere Colliderは1つの大きいコライダーのような扱いになるので、Capsuleを複数設置するよりも、Sphereを連結した方がClothParticleがめり込んだり、荒ぶったりすることによる負荷は増えません。

慣れてしまえば設定するのもCapsuleより楽です。




後書き(愚痴)

なぜこの記事を書くに至ったのかについて。

これは最近になって始まったことではないのですが、ツイッター等でClothについて情報を漁っていたりすると、思わず物申したくなるようなことが多々転がっています。
Clothに対する世の中の理解度があまりにも低いと。
実際のところ、Clothに関しては以前から間違った、ないしは古すぎる情報が多く出回っているので仕方のないことだとは思います。

私自身Unity公式や、そこらの商業クリエイターよりも圧倒的にClothを使っていると自負していますが、実際まだ研究中でしかなく。
もしあなたが
「Unity公式? あいつらClothのことなんて全く分かってねえよw」と堂々と言える程度のレベルでないのだとしたら、
そもそもCloth沼の入り口にすら立てていないということを、まず噛み締めて欲しいと思います。
当然、その程度の人たちの解説記事や設定なんて頼るべきではないし、
自身が持っている偏見をすべて捨ててから挑んで欲しい。

なぜ?

あなたに始祖(初めて極めた者)となってもらうくらいの気概を持って欲しいからです。

NvClothに至っては、Unity内外問わずブログレベルの解説記事すら存在しません。
世界中で誰一人として触っていない故です。
PhysXがUnreal Engine5に見捨てられたのは記憶に新しいですね)

画像7

所詮は宗教戦争のようなものだろうと思うのも自由だし、
筆者のことが気に食わないから、Clothの評判を意図的に下げるようなものを作るも結構。
ただ、Clothで良いものを作りたいと思うのなら、相応の気合覚悟を持って望んで欲しいと筆者は切に願います。


総評。
走れない車はスクラップ。
動かない家電は粗大ゴミ。
中にはそれらを使いこなす職人、技師もいるのでしょうが、
一般人からすれば使えないものはゴミです。

つまりClothはゴミ。


そんなゴミと一緒に添い遂げたい人は次回の記事でお会いしましょう。

画像にあったCloth数値の設定は自由にご利用ください。
最適化した結果の数値なので、それをパクりだと言うつもりはありません。
むしろ最適化の為にパクってください。