2022年1月15日土曜日

Unity Clothの基礎知識

  Clothの最適化を調べると詳しい人が書いてくれた記事が出てくる。しかし、その記事は古いものであったり、言葉が汚かったり主観的であったりするため読んでいて気持ちのいいものではない。

    そこで、そのような記事等を参考にしながら僕(keipii)が得た知見をつらつらと書き連ねていく。

 これからも、実験や各種情報などによって随時更新していく予定。

 まず頭に入れてほしいのは完全無欠の完璧な設定を出すことは不可能であること、トライアンドエラーの塊であること。

用語

  • パーティクル:Clothコンポーネント配下にある頂点の呼び方。
  • NvCloth:nVIDIAが提供するClothシュミレーションエンジン。Unity2018以前ではPxClothを使用していた。

各種パラメータ

Unity DocumentationとNvCloth Documentationを出来る限りかみ砕いた説明。
()内は憶測。
  • Stretching Stiffness:伸びやすさ(隣り合った頂点が動ける距離の制約)
  • Bending Stiffness:曲がりやすさ(1つ飛んで隣り合った頂点が動ける距離の制約)
  • Use Tethers:テザー制約の適用、メッシュが伸びすぎるのを防止する
  • Use Gravity:重力加速度の適用
  • Damping:減衰係数、大きくすると揺れの収束が早くなる
  • External Acceleration:外部から一定に加えられる加速度(恐らくNvClothのWind simulation)
  • Random Accelaration:外部からランダムに加えられる加速度(恐らくNvClothのWind simulation)
  • World Velocity Scale:ワールド空間でのオブジェクトの速度がパーティクルに与える影響
  • World Acceleration Scale:ワールド空間でのオブジェクトの加速度がパーティクルに与える影響
  • Friction:コライダーとの摩擦係数
  • Collision Mass Scale:頂点の質量
  • Use Continuous Collision:衝突判定の精度が上がるが、計算量は2倍になる
  • Use Virtual Particles:バーチャルパーティクルによって衝突判定の密度を上げる
  • Solver Frequency:演算の頻度で単位はHz、計算量は比例して増加する
  • Sleep Threshold:Sleep(演算がされない)状態になるための閾値
  • Capsule Colliders:カプセルコライダーの設定
  • Sphere Collider:スフィアコライダーの設定、テーパーカプセル(後述)の設定
  • Virtual Particle Weights:バーチャルパーティクルの位置、バーチャルパーティクルは周囲の3頂点から生成される
  • Constraints:パーティクルごとの制約、後述
  • Self Collision/Inter Collision:頂点同士の衝突判定

Cloth Constraints

  • Max Distance
    • パーティクルが移動できる距離(半径)0~∞。(単位はm)
    • パーティクルがMax Distanceで設定した値に達するまではBlenderで言うところの頂点グループによる制約を受けない。
      • Max Distanceが0の場合は常に頂点グループによる制約を受ける
      • 例として、Max Distanceが0.1の場合はパーティクルが10cm動いた場合に初めて頂点グループによる制約を受ける
      • NvClothを用いているUnity2019.4.xにおいてCloth Componentのオンオフをした場合、頂点グループによる制約を受けた後にClothの演算が始まる。
  • Surface Penetration
    • 恐らくNvClothに存在しないUnity独自の機能。
    • 直訳すると表面浸透、パーティクルがメッシュにどれだけめり込めるか0~∞。(単位はm)
    • パーティクルが侵入できない領域を指定する。
    • この制約の中心ははMax Distanceを2倍し、そこからSurface Penetrationの分オフセットした位置に依存している。(下記、原文ママ)
PhysX only allows us to use sphere shaped separations constraints, so actually per each mesh vertex we configure a sphere of radius equal to twice the value of max distance constraint centered at twice the max distance constraint plus surface penetration value along the negative direction of the normal. [5] 
    • 上記の理由により、Max Distanceが∞の場合Surface Penetrationも無限となるためパーティクルが存在できなくなり、NaNとなる。

Self Collision/Inter Collision

  • Self Collision
    • 同一オブジェクト内の周囲のパーティクルとの衝突判定
  • Inter Collision
    • 複数のClothオブジェクトのパーティクルとの衝突判定
    • 計算の反復回数が増える
  • 計算量が増大するためパフォーマンスに非常に大きな影響を与える

メッシュの形状、トポロジー

  • パーティクルの数は2000以内に収めるのを推奨する
  • メッシュに鋭角を作らない
  • Unityで自動的に三角形のポリゴンに分割されるが、Clothは辺に沿って折れ曲がる挙動をするので細かいところはBlenderを使って手動で三角ポリに割るのを推奨
  • Clothを適応するメッシュには厚みを持たせず、ペラペラのままにする

Clothコンポーネントの設定

パラメータの設定

ふつうのスカートの場合、これを基準に微調整をするといい感じになるはず
ただし、以下のパラメータは画像のまま設定する
  • Use Tethers
    • パラメータの解説を参照
  • Use Gravity
    • パラメータの解説を参照
  • Use Continuous Collision
    • パラメータの解説を参照
  • Use Virtual Particles
    • パラメータの解説を参照
  • Solver Frequency
    • VRCにおいては90の倍数が望ましいため
  • Sleep Threshold
    • 閾値の最大が1
また、以下の値は触らない
  • Virtual Particle Weights -> Element 0,Element 1,Element 2
Virtual Particle Weights -> Sizeは3に設定する。理由はパラメータの解説を参照

Cloth Constraintsの設定

    Max Distance:0
ピンク  Max Distance:0.07
オレンジ Max Distance:0.2
     Max Distance:0.3
     Max Distance:0.4

一番上のMax Distanceは0にしないと無限に落ちていく
Max Distanceが0のところのみ頂点グループHipsにウェイト1を乗せている
プリーツ、末端部分のMax Distanceを落とすことでまくれ上がらなくなった
Surface Penetrationは特に設定していない
設定する際、Constraint Sizeを0.01くらいにすると作業がしやすい

Self Collision/Inter Collisionの設定

 計算量が増大し、パフォーマンスに影響が出るため設定していない

Collidersの設定

Tapered Capsule Colliderを使用している
Tapered Capsule ColliderはSphere Colliders -> Element -> First,Seecondを設定すると生成できる
画像内のコライダーの配置は
  • CCL_1:Hips
  • CCR_1:Hips
  • CCL_2:Left leg
  • CCR_2:Right leg
  • CCL_3:Left leg
  • CCR_3:Right leg
となっており、それぞれFirst、Secondに参照させている
配置は改善の余地あり
Capsule Colliderと違いColliderに隙間ができないため引っかかるような挙動が無くなる

未検証

  • 貫通しない多重Cloth
    • 一番効率的なメゾットはそれぞれの層にClothコンポーネントを当て、Inter Collisionを設定することだが、計算量が増える
    • そのため各層に対してコライダーも層のように設定する
  • 安定した挙動でつまめるスカート
    • Frictionを大きくし、Capsule Colliderで実装する

サンプル画像

参考文献

[1]Unity Documentation
[2]【VRC向け】きれいで低負荷なClothを作る為の最低限の前提知識。
[3]説明書に載ってない本当のClothコンポーネント ~VRChatで使うClothコンポーネント~
[4]NvCloth Documentation
[5]UnityAnswers

2021年2月10日水曜日

VRChatで使ってるヤツ

 プレイ編

OVR Advanced Setting

VRゲームをやるなら必須といえるヤツ
いろんな便利機能があるっぽい
スペースムーバー的なやつしか使ってない

XSOverlay

VRゲーム上に色々な情報を表示できるヤツ
時間、バッテリー残量、PCパフォーマンス、デスクトップ、ソフトウェアキーボード等
日本語に対応してるほか、有志が日本語キーボードっぽいのを配布してくれてる
デフォルトのバインドが使いにくかったっからSteamで公開されてたバインドを使ってる
VRChatの上に表示するから写真には写らなくてよい

K2EX

kinectでフルトラをするときに必要なヤツ
ボクの環境は最新版でうまく動作しなかったため1.5.6を使ってる
kinectのドライバとかインストールしてくれるから少しPCの知識があるだけで使えるかも
kinectの性質として、回転したりふつうの立ち姿から離れたポーズをを取ると死

ClownfishVoiceChanger

きまぐれでボイチェンするときに使ってるヤツ
無料で、UIが使いやすい
他のボイチェンを使ったことがないから比較はできない

OBS Studio

動画とるヤツ
多分一番有名な録画ソフト
StreamCameraを出して、ウィンドウを録画するのに使いがち

自転車の給水ボトル

VRChat中に水飲むのに使ってるヤツ
倒してもこぼれないし、慣れてれば見なくても飲める
哺乳瓶でお酒飲んでる人もいる

※2/17追記

トラックパット付きワイヤレスキーボード

どこでも文字打てるヤツ

アバター製作編

Blender、Photoshop、Illustratorはもはや言わない

BitActionSwitch

ExpressionMenuを作ってくれるヤツ
一つのメニューに付き一つのパラメータを使用して、アニメーションの重ね合わせができる
僕はこのツールで服とかの出し入れをざっくり作って、アニメーションをいじってる
出現アニメーションを設定できるから楽
ExpressionMenuの構造がわかってないと難しいかも

SkirtSupporter、LonghairSupporter

スカートとかロングヘアの設定をやってくれるヤツ
DynamicBoneを自分で設定するときに使う
当然微調整は必要だけど、めっちゃ楽になる
このツールの作者さんが書いた「こうしてDynamicBoneはやさしくなった」っていうやつめっちゃいい

VRCAvatarEditor

表情のアニメーションが作りやすいヤツ
Boundsとかシェーダーとかの管理がしやすい


2021/04/13追記

AddPreSuffixTool

指定したオブジェクトと、その子オブジェクトに接頭語や接尾語つけてくれるヤツ
衣装のボーンの名前管理するのが楽になる

BoundsUnificator

Boundsを一括で設定してくれるヤツ
たまにメッシュ消える問題解消

VRCHierarchyHighlighter

Hierarchyにアイコン付けたり色分けしてくれるヤツ
ダイナミックボーンとかスキンドメッシュとかにアイコン付けてくれる
Hierarchyがとても見やすくなる

2021年2月9日火曜日

DynamicBoneのパラメータ

バージョン1.2.2現在のパラメータ

DynamicBone

Root

物理演算を適用する場所

Update Rate(触ったことない)

シュミレーションのフレーム数

Update Mode(触ったことない)

知らん


Damping

ふわってなるやつ
大きいとふわふわする

Elasticity

ボーンの向きを戻すための力
大きいとゴムっぽくなる
小さいと戻りにくい

Stiffness

曲がりやすさ
大きいと曲がらない
小さいとめっちゃ動く

Inert

移動したときの揺れ具合
小さいと揺れる。というかおいていかれる
大きいと移動で変形しない

Friction

DynamicBoneColliderとの摩擦

Radius

DynamicBoneColliderと当たるとこの半径
球体で表示される

End Length

延長線上にボーンが追加される
End Offsetと併用できない

End Offset

指定分だけオフセットしたところにボーンが追加される
End Lengthと併用できない

Gravity

重力っぽくボーンにかかる力
負の値にすると下向きにかかる

Force

ずっとボーンにかかる力
負の値にすると下向きにかかる

Colliders

このボーンがどこのコライダーにあたるか決める
Sizeで個数を指定し、Elementに任意のDynamicBoneColliderを指定する

Exclusions

ここで指定したボーン以下は演算されない

Freeze Axis

指定した座標上にしか動かないようにする

Distant Disable(触ったことない)

遠かったら物理演算無効化

Reference Object(触ったことない)

どのカメラから離れたら物理演算を無効にするか

Distance To Object(触ったことない)

どのくらいの距離で物理演算を無効化するか

各Distrib

カーブで徐々に変化するようにできる

DynamicBoneCollider

Direction

高さの軸

Center

オブジェクトの中でコライダーの位置変えれる

Bound

Insideだと対象のDynamicBoneがコライダーの中に入らない
Outsideだと外に出ない

Radius

コライダーの半径

Height

コライダーの高さ

2020年1月6日月曜日

トレサスMAシャーシの新調

正月休みが終わり、仕事や学校が始まり憂鬱になっている人も多いのではないでしょうか。
そんなかまだ冬休みをヌメヌメと過しているkeipiiです。

さて、新年早々ツイッターを見ていたらFFさんが投稿したとある動画が目に留まりました。
そうです。ミニ四駆です。
そもそもボクは、一個前の記事の彼が現れるまでミニ四駆をがっつりやっていました。
そんなレーサー魂に再び火が付いたわけです。
とはいっても、これから始まる一人暮らしにお金がかかるため、ミニ四駆にお金をかけれません。
ということで、うちにあるもので何とかしようとおもい、ミニ四駆を引っ張り出してきました。

で、引っ張り出したのがこのマシンです。
このマシンは、2018年のジャパンカップを戦ったボクの相棒です。
見てわかる人もいると思いますが、トレサスマシンです。
ミニ四駆にサスペンションをつけることに意味があるのがといわれれば、あります。
まあ、提灯の方が制動力があるので、わざわざサスペンションに時間をかける必要はないです。ロマンです。
メカメカしいのかっこよくないですか?

ということでシャーシをよりパワーアップさせて新調しようと思います。
そのためにはまず今まで使っていたシャーシにどんな加工をしていたのかを確認します。
ということでばらした画像がこれです。
見るからにおかしいのはシャーシとモーターカバーとサスアームですね。まあ、トレサスなのでそこまで複雑な構造はしていません。


で、この画像はシャーシのアップです。
目立った加工は赤で囲った部分ですね。
今まで使っていたシャーシはフロントがごっそり削られています。
ただ、剛性がガッツリ下がるので、新しいシャーシではここをもっと残しましょう。
あとは、アームの支点になるカウンターギアの部分ですね。
ここはこれ以上どうすることもできないので仕方がないですね
あとは軸受けをはめる部分ですね。
ここの精度が低いのでここも改善しましょう。(作る人の腕次第だけど)

ということで加工が終わったところです
ギアカバーもすこし改善したのですが、まあ、適当でもいいでしょう。
ということで、加工箇所を見ていきます。

フロントです。
とはいってもカウンターギアの壁をとっぱらって、ターミナルの横に溝を掘り、干渉する部分を削っただけです。
詳しいことを言わなくても写真あるだけでだいぶわかりやすいですね
一つ注意点としてはターミナルの横の溝が広すぎるとターミナルが付かなくなることですね。
もう少し細かい写真も撮りたいのですが、マイクロスコープができないので悪しからず
 これ以上近づくとピントが合いませぬ。
やる人はこの画像を見て頑張ってください。

で、リアです。
リアも基本的にフロントと同じですが、サスアームが干渉するので下の方をくりぬいてあります。

フロントにもリアにも言えることなのですが、軸受けを入れるところの矢印のココ
軸受けの奥の方VSシャーシのよく抜けるところです(わかりにくい)
ここは絶対にとらないでください。
旧シャーシの方ではここを切り取っていたため、うまいこと元の位置に戻りませんでした。
まあ、サスアームの支点が精度低かったってのもあったんですかね?

んでまあ、サスアームはスーパーXのリアステーを加工したものです。
手元にあったのがカーボンのやつだけだったので画像はカーボンバージョンになっています。
画像の通りなんですけど、カーボンの場合はFRPのやつと比べて穴が少ないので赤いところに1.5mmのスペーサーを埋め込むための4mmの穴を追加します。
後々の精度に影響するのでここは出来るだけ垂直に穴をあけてください。
んで、いい感じに角を取り面取りをしてください。

そして、この赤丸のところに他のシャーシからとってきた軸受けはめるところを接着します。
この時適当な軸受けを入れてビス止めして接着するといい感じです。
んで出来たものがこちらです。
今完成してるマシンから外したものの写真を撮っているのでいろいろついています。

んで、フロントアームなんですが、リアのと同じで大丈夫です
ボクは弓プレートで作っていますが、どうにもシャフトの位置がシビアです。
なんででしょうね。

そして、さっきからカウンターギアのところに視点を持ってくるといっていますが具体的にはこうなります。
プレート、カウンターギア、プレートという感じで貫通します。
当然カウンターギアのシャフトはこんなに長くありません
なのでボクはモーターピンをリュータにつけて2.0mmより気持ち細くなるまで削り、そこから程よい長さに切断しました。
このピンが長くても短くてもうまくいかないので気を付けてください。

さて、そんなこんなでシャーシの加工とかを適当に済ませたわけですが、基本的には支点を決めて干渉する部分を削っていく感じですね。
ショックアブソーバーはボールリンクマスダンパーのアレです、アレ。(名前が出てこない)

そして、スペーサーとかでクリアランスを調整してターミナルやらモータやらをつけてローラーとかを付けたら完成です。
この記事は自分用のメモ帳なので、参考にできる記事ではありませんがトレサスを作ろうとしている奇特な人の手助けになれば幸いです。
サスマシンの作り方について知りたいことがあればこの記事へのコメントや、ツイッターのDM、リプで聞いてください。

ということでYoutubeチャンネル登録、Twitterのフォローよろしくお願いします!

Unity Clothの基礎知識

  Clothの最適化を調べると詳しい人が書いてくれた記事が出てくる。しかし、その記事は古いものであったり、言葉が汚かったり主観的であったりするため読んでいて気持ちのいいものではない。     そこで、そのような記事等を参考にしながら僕(keipii)が得た知見をつらつらと書き連...