mirror of
https://github.com/vrm-c/UniVRM.git
synced 2026-05-20 09:47:56 -05:00
130 lines
4.2 KiB
Markdown
130 lines
4.2 KiB
Markdown
# ClothWarp(仮)
|
|
|
|
これは UniVRM の cloth の開発版です。
|
|
|
|
## 概要
|
|
|
|
縦糸(Warp)を横に連結して四角格子(Grid)を作ります。
|
|
|
|
> 縦糸は従来の `SpringBone` とだいたい同じものです。
|
|
|
|
各四角格子にはバネによる横方向の拘束(フックの法則)と当たり判定(2枚の三角形) を持たせます。
|
|
|
|
これにより縦糸の間を `Collider`(球/カプセル) がすりぬけることを防止することができます。
|
|
|
|
## Components
|
|
|
|
設定置き場。布を構成する縦糸(Warp)と、縦糸を横に連結した四角格子(Grid)の2段階とする
|
|
|
|
### UniVRM10.ClothWarp.Components.ClothWarpRoot
|
|
|
|
各 particle にはVRM-0.X のように子孫を自動登録し Base 設定を適用する。
|
|
Base 設定を変更する場合は変える方を列挙設定できる。
|
|
Custom と Disable を選択できる。
|
|
|
|
- ゆれものの根元にアタッチする
|
|
- [x] 子孫に HumanoidBone がある場合にアタッチ不可
|
|
- [ ] 枝分かれ
|
|
- [ ] WarpRoot らからデフォルト以外の Warp を選び出す
|
|
- [ ] Center
|
|
- [ ] Scale
|
|
|
|
```
|
|
ひとつめの joint にアタッチする
|
|
| 子孫の Transform は自動的に登録される(デフォルト設定を適用)
|
|
| | 個別に無効化・カスタム設定をできるようにする
|
|
WarpRoot O=o=o=o=o
|
|
\
|
|
o 枝分かれも自動的に登録
|
|
```
|
|
|
|
| | MonoBehaviour | move | rotate |
|
|
| --------------- | ------------- | ------------------------- | ---------- |
|
|
| root | attach | 動かない | 回転する |
|
|
| particles[x] | | verlet 積分で慣性移動する | 回転する |
|
|
| particles[末端] | | verlet 積分で慣性移動する | 回転しない |
|
|
|
|
#### Settings
|
|
|
|
- [warp]verlet_center: 速度を算出する座標の原点(curernt-pvev は
|
|
- [warp]stiffness(剛性): 初期姿勢に戻る力
|
|
- [warp]force(Vec3): 下向きにすれば gravity
|
|
- [warp]dragforce(抗力): 減速率(1-dragforce を velocity に乗算する)
|
|
(current-current_center)-(prev-prev_center) に変わる)
|
|
- [particle]mode: base, custom, disabled
|
|
- [particle]stiffness(剛性): 初期姿勢に戻る力
|
|
- [particle]force(Vec3): 下向きにすれば gravity
|
|
- [particle]dragforce(抗力): 減速率(1-dragforce を velocity に乗算する)
|
|
|
|
#### 枝分かれの例外処理
|
|
|
|
- 枝分かれした particle は一番兄の particle の local 移動を複製する(独自の速度、衝突はしない)
|
|
|
|
### UniVRM10.ClothWarp.Components.ClothGrid
|
|
|
|
- 隣り合う Warp に横方向の拘束が追加される
|
|
- particle sphere の衝突のかわりに四角格子の三角形が衝突する
|
|
|
|
- [ ] デフォルト(WarpRoot から children[0] を選択する)以外の縦糸選択
|
|
- [ ] 三角形の厚み(法線方向の offset)
|
|
|
|
```
|
|
WarpRoot0 o=o=o=o
|
|
| | |
|
|
WarpRoot1 o=o=o <- 短い方の長さに合わせる
|
|
| | |
|
|
WarpRoot2 o=o=o
|
|
|
|
|
v
|
|
CloseLoop=true ならば WarpRoot0 と連結して輪を閉じる
|
|
```
|
|
|
|
#### Settings
|
|
|
|
- CloseLoop: 最後の Warp と 最初の Warp を接続して輪を作る。Warp が3本以上必要。
|
|
|
|
## Colliders
|
|
|
|
- UniVRM10.VRM10SpringBoneCollider
|
|
- UniVRM10.VRM10SpringBoneCollider.Group
|
|
|
|
を使う。
|
|
|
|
## Logic
|
|
|
|
### input phase
|
|
|
|
- current_position, prev_position が持ち越される
|
|
- {FromTransform}{位置を修正}{回転を得る} Update root position. each rotation.
|
|
|
|
### dynamics phase
|
|
|
|
- (if cloth){add force} weft constarint(横方向 ばね拘束)
|
|
- {位置を求める} 速度、力を解決
|
|
- {位置を修正} parent constraint(親子間の距離を一定に保つ。再帰)
|
|
|
|
### collision phase
|
|
|
|
- (if not cloth){位置を修正} particle(Sphere) x collider(Sphere or Capsule)
|
|
- (if cloth){位置を修正} cloth(Triangle) x collider(SPhere or Capsule)
|
|
|
|
### output phase
|
|
|
|
- {回転を修正} calc rotation from position(再帰) 👈 ここまで回転は出てこないことに注意
|
|
- {ToTransform} apply result rotation 👈 回転しかしない(伸びない)
|
|
|
|
## TODO
|
|
|
|
### Debug
|
|
|
|
- [ ] Debug 用の詳細な Gizmo
|
|
|
|
### 工夫
|
|
|
|
- [ ] Cloth の片面衝突
|
|
- [ ] 衝突時の velocity 下げ
|
|
|
|
### Optimize
|
|
|
|
- [x] 衝突グループ
|