引っ張り変形シェーダー
~VRChatのアバター向け lilToon 改変シェーダー~
引っ張り変形シェーダーは、lilToonをベースに「引っ張り変形(Pull Deform)」を追加したVRChat向けシェーダーです。
VRChat上でタイツやストッキングなどの布を実際に掴み、引っ張った方向へメッシュを変形させることができます。
引っ張り変形シェーダー
引っ張り変形ができるlilToon改変シェーダー
セットアップツールでギミックを生成
このシェーダーでできること
メッシュを掴める 『引っ張り変形(Pull Deform)』機能
PhysBoneを利用して掴んだ位置を取得し、掴んだ位置からメッシュを引っ張るように変形できます。
※PhysBone用のボーンは必要ありません
いろいろ引っ張る
アイデア次第でなんでも引っ張れます。
導入方法
マテリアルに引っ張り変形シェーダーを設定し、セットアップツールでVRChat用ギミックを生成します。
引っ張り変形シェーダーを導入する
シェーダーの設定から、PhysBone・Custom Render Textureを使った引っ張り変形ギミックの生成、VRChatでの確認までを順番に説明します。
導入手順へ →導入手順
引っ張り変形シェーダーをアバターへ導入し、VRChatで実際に掴んで引っ張れるところまでセットアップします。
1. 引っ張り変形のセットアップウィンドウを出す
Unity上部メニューから StudioMaron → Pull Deform System → Setup を選択し、セットアップウィンドウを開きます。

2. セットアップするアバター、メッシュ、マテリアルを選ぶ
対象のアバターをセットします。
メッシュが自動検出されるので、セットアップ対象のメッシュを選びます。
マテリアルが自動検出されるので、セットアップ対象のマテリアルを選び、シェーダーを引っ張り変形シェーダーに変換します。
3. セットアップするボーンを選び、ギミックを生成する
ボーンを指定し、ウィンドウ下部の生成ボタンを実行します。必要なPhysBoneやCustom Render Textureなど、引っ張り変形に必要なアバター側のギミックが生成されます。
4. VRChatへアップロードして試す
アバターをVRChatへアップロードします。
アクションメニューに追加された引っ張り変形ギミックを有効にし、対象部分を掴んで引っ張ってみましょう。

5. その他 / 注意点
タイツ用と手袋用など、引っ張り変形ギミックを2個以上使う場合はギミックIDが重複しないようにしてください。同じIDを使用すると状態が干渉します。
シェーダーパラメータ説明
引っ張り変形シェーダーの各パラメータを説明します。lilToon本来のパラメータについては説明しません。

| パラメータ | 説明 |
|---|---|
| 引っ張り変形を有効化 | 引っ張り変形を有効にします。 |
| CRTテクスチャ | セットアップウィンドウによってCRTがセットされます。 |
| CRTパラメータ | セットアップウィンドウによってボーン数などのパラメータがセットされます。 |
| CRT設定をコピー/ペースト | CRTテクスチャとCRTパラメータを別のマテリアルにコピーする機能です。 |
| 強さ | 引っ張った距離に対して、メッシュをどの程度変形させるかを調整します。値を大きくすると、同じ引っ張り距離でも変形量が大きくなります。 |
| 伸び部分を透明にする | 引っ張られて伸びている部分を、変形量に応じて透明に近づけます。タイツや薄い布など、伸びることで薄く見える表現に使用できます。 |
| マスクテクスチャ | 引っ張り範囲をUVでマスクします。白が有効、黒が無効 |
| 距離制限 | 引っ張り開始位置から指定範囲内だけを引っ張ります。 |
| 距離減衰の閾値 | 距離制限の開始位置です。 |
| 減衰の幅 | 上記の閾値+減衰の幅以内の頂点だけを引っ張り変形します。 |
| 法線制限 | 引っ張り方向と頂点法線の向きに応じて変形の影響を制限します。 |
| 減衰の閾値 | 法線制限の減衰開始の角度です。 |
| 減衰の幅 | 上記の閾値+減衰の幅が変形範囲です。 |
| プレビュー | 上記のパラメータを使ってドラッグ&ドロップで変形のシミュレーションができます。 |
| 想定半径 | プレビュー上のみ有効。太ももの半径を指定し、変形シミュレーションできます。 |
引っ張り変形 Tips
VRChat上で掴んだPhysBoneの『掴んだ瞬間の位置』と『現在の位置』をカスタムレンダーテクスチャ経由でシェーダーに渡し、モデルを変形させる機能です。
引っ張り変形の仕組み
PhysBone用のボーンは必要なの?
引っ張り変形では、アバターに専用のボーンを用意する必要はありません。
セットアップウィンドウに登録したボーンと同じ位置にダミーオブジェクトを作って、PhysBoneを自動設定します。

複数箇所を同時に引っ張れる?
引っ張り変形では、1つのギミックにつき最大16本のボーンにPhysBoneを設定でき、同時に4つまでのPhysBoneの変形が適用されます。
ギミックを削除したいときはどうするの?
アバター直下に作成されたギミック本体とオンオフメニューを削除します。
プロジェクトに生成されたファイルも、フォルダごと削除して構いません

ギミックの負荷はどれくらい?
カメラを使うギミックで、アバターの周囲1mを再描画しています。Playerレイヤー、PlayerLocalレイヤーを見るカメラなので、範囲内のキャラクター描画は2回実施されます。
※大雑把ですが、1m範囲の鏡/ミラーがあると考えるとわかりやすいです。
右足を引っ張ると左足も少し引っ張られちゃう場合
距離制限の範囲を狭めることで解決するか、左右でマテリアルとギミックを分けることで解決してください。
※ギミックを分ける際はギミックIDを別にしてください。また、ギミックをオンにするメニューがそれぞれ生成されます。
ギミックIDの仕組みを教えて
Orthographicなカメラで、指定したFar距離を持つカメラだけに描画されるシェーダーを使って掴みのオンオフや位置情報を取得しています。
ギミック生成時にIDに応じてカメラのFar距離を変えて生成するので、ギミックIDが違うカメラには映らず邪魔をしません。
トラブルシューティング
まず確認するチェックリスト
- UnityプロジェクトにlilToonシェーダー(ver 2.3.4以上)が入っていること
- UnityプロジェクトにModular Avatarが入っていること
エラーが出る (Assets/_StudioMaron/PullDeformShader...)
・lilToonシェーダーがプロジェクトに入っていない
・Modular Avatarがプロジェクトに入っていない
可能性があります。

VRChat上で自分自身だけ引っ張れる。他人から引っ張ることができない
カメラ系のギミックなので、互いにフレンドじゃない場合などは無効になっている可能性があります。
Show Avatarをすることで解消するかと思います。
腕や足のボーンを対象にギミックを生成したが、上手く引っ張れない。
腕のボーンを対象にしてギミックを生成している場合、掴み時に腕のPhysBoneを掴んでいる可能性があります。(PhysBoneは結構当たり判定広いため)
アクションメニューでPhysBoneの可視化をして確かめてください。
Unityエディタ上でギミック確認したいが、ギミックを有効にすると画面が真っ黒になる
AVAPOツールがプロジェクト内に存在する場合に同様の現象が発生することを確認しています。
・Unityエディタ上でギミック確認したい場合はAVAPOツールは削除してご確認下さい。
衣装販売・アバター販売の方へ
引っ張り変形シェーダーを使用した衣装やアバターを販売する方向けの案内です。
販売者向けのライセンス案内
・個人ライセンス または チームライセンス を購入した場合、シェーダー本体はユーザー自身で購入するようにご通達ください。
・同梱販売可能ライセンス を購入した場合、引っ張り変形シェーダー本体も商品に同梱して衣装販売することができます。
※各ライセンスは販売する衣装ごとに買いなおす必要はありません。一度購入すればOKです。
衣装へ引っ張り変形をセットアップする
販売する衣装のボーンに対して引っ張り変形ギミックをセットアップしてください (アバターのボーンを参照しないように気を付けてください)
通常の衣装と同じように導入できる形で配布できます。
シェーダー本体以外の、生成したマテリアルやアニメーションファイル、セットアップ済みのギミックは、どのライセンスでも同梱販売が可能です。その場合、ユーザーにはシェーダー本体を別途購入するようにご通達ください。

セットアップ済みの衣装を出力する際の注意点
販売する衣装をunitypackageで出力する際、生成したギミック用のアセットも出力するのを忘れないようご注意ください。
※Assets > _StudioMaron > PullDeformShader > _Generate > PullDeform_○○フォルダのことです
PullDeform_○○のフォルダはご自身の衣装モデルのフォルダに移動してもOKです。

ギミックIDについて
引っ張り変形では、複数のギミックを識別するためにギミックIDを使用します。
同じギミックIDをもった人同士が引っ張り合いをすると干渉しますのであしからず。