LegWeaver
Unity エディタ拡張です。VRChat アバターの下半身に合わせて、厚みのあるタイツ・スパッツ・サイハイソックスのメッシュを Blender で生成します。
足のマテリアルを置き換えるのではなく、肌の上に別のメッシュとして重ねます。
使い方
- メニュー Tools > LegWeaver を開きます。
- 「アバター」にアバターのルート(シーン上のオブジェクト、または .prefab)を指定します。
.prefab を指定した場合は、シーンに配置してから適用します(アセット自体は変更しません)。
- 種類・色・デニールなどを指定して「生成」を押します。Blender がバックグラウンドで動き、数十秒で終わります。
ボディを選ぶと、次の場合にウィンドウで警告します(生成はできますが、仕上がりに出ます)。
- 腰から太ももの上、または膝から下の肌が途中までしか無い(衣装が隠す所を省いた作りのボディ): 肌の無い所には作れないので、
肌の切り口の少し内側で、まっすぐに切りそろえた筒になります。
- 脚の色がほかの肌と大きく違う(テクスチャにタイツや靴下が描かれている): 透ける生地では描かれた物が透けて見えます。
生成物:
- ボディメッシュのオブジェクトの下(ボディがアバターのルートにある場合、拡大率が軸ごとに違う場合、骨組みの中にある場合はルートの下)に
Tights_30D などの衣装オブジェクト
(必要なボーンだけを複製したアーマチュアと SkinnedMeshRenderer)を追加し、Modular Avatar の Setup Outfit で着せます。
ウェイトとシェイプキーはボディから引き継ぎます。ボディと一緒に表示・非表示が切り替わるので、脚を別の下半身に切り替える
アバターでは、その間は衣装も隠れます。
- ボディのシェイプキーの値を写し、MA Blendshape Sync で以後も同期します。
- 「シュリンク系シェイプキーを 0 にする」(既定でオン): 衣装用に肌を縮めて隠すシェイプキーを生成前に 0 にします(衣装を脱いだ状態)。
名前ではなく形で判定します(三角形の面積が 5% 未満になる、内側へ縮んで面積が 40% 未満になる、または最長の辺の 2 倍かつ 10 mm 以上引っ張られる頂点が 10 個以上)。
- 不透明なデニール(既定は 80D 程度以上)では、Avatar Optimizer があれば AAO Remove Mesh By Box をボディに追加し、
タイツに完全に隠れる肌をアップロード時に削除します。端から「端からの余裕」の距離までの肌は残します。
ただし、奥まで届く細長い三角形は、全頂点が余裕の 4 分の 1 以上内側なら削除します(関節を曲げたときのはみ出し対策)。
- メッシュ・マテリアル・テクスチャは
Assets/LegWeaver_Output/ に保存します。
衣装をやめる(外す)
ウィンドウの「作った衣装」に、そのアバターに作った衣装が並びます。「外す」を押すと、衣装のオブジェクトと、そのために体に加えた
肌の削除を外し、0 にしたシュリンク系シェイプキーを元の値に戻します(Undo で戻せます)。作ったメッシュやマテリアルのファイル
(Assets/LegWeaver_Output/)は消さないので、要らなければ自分で消してください。
衣装のオブジェクトを Hierarchy で直接消しても、アップロードの時に、その衣装のための肌の削除は自動で外します(脚の肌が消えたままには
なりません)。ウィンドウには「片付ける」が出るので、押すと残った削除の部品も消せます。衣装を EditorOnly にした場合も同じです。
衣装を非表示にしただけの場合は、メニューで後から表示する衣装のこともあるので、肌の削除はそのまま行います。
2.1.1 以前に作った衣装は「作った衣装」に出ません。その場合は、衣装のオブジェクトと、ボディに追加された
AAO Remove Mesh By Box を自分で消してください。
必要なもの
- Windows。Blender を自動で探す処理が Windows 向けで、macOS・Linux では動作を確認していません(対応しません)。
- Blender 5.x 以降(インストール版。確認済み: 5.2)。Windows に記録されたインストール済みプログラムの情報(アンインストール情報)から自動で探し、見つからなければ
C:\Program Files\Blender Foundation\(と C:\Program Files (x86)\Blender Foundation\)の下を探します。見つからないときは、インストールするか、ポータブル版(zip を展開したもの)の blender.exe を指定してください。
ポータブル版などはウィンドウで blender.exe の場所を指定すると使えます。生成は Blender に同梱の Python で動きます。
Blender 4.x 以前には対応しません。 生成は Blender 5.0 で入ったジオメトリーノード(Mesh to SDF Grid、SDF Grid Offset、
SDF Grid Laplacian、SDF Grid Boolean、Grid to Mesh)に強く依存しているので、4.x 以前では動きません。4.x 以前で使いたい場合は、
この部分も GPL で公開しているので、ご自身で書き直してください(作者は対応しません)。
- サポートの終わった版は使えません。 Blender(各版は次の版が出るまで、LTS は 2 年)と同梱の Python のどちらかが、
サポート終了の 90 日前を過ぎると生成できなくなります(180 日前から警告)。場所を自分で指定した場合も同じです。
終了日はツール内の表で判定し(通信はしません)、ツールの更新で表も更新します。表にない新しい版は警告付きで使えます。
- Humanoid のアバター。
- 必須: VRChat SDK(Avatars。確認済み: 3.10)、NDMF(確認済み: 1.14。下着の下の肌の追従とそのプレビューに使います)、lilToon(確認済み: 2.4。同梱のシェーダーの土台です)。
- 必須: Modular Avatar(確認済み: 1.18。衣装をアバターのボーンに統合します)。
- 任意: Avatar Optimizer(不透明な衣類の下の肌の削除に使います。無ければ肌を残します)。
- サポートの表にある最新の版も、いずれ使えなくなります。そのときはツールを更新するか、
Editor/BlenderSupport.cs の表を自分で更新してください。
デニールの扱い
| デニール | 正面の不透明度 | 外観 |
|---|
| 15 | 22% | 極薄 |
| 20 | 30% | 薄手 |
| 30 | 45% | 半透明 |
| 40 | 60% | 半透明 |
| 60 | 82% | ほぼ不透明 |
| 80 | 95% | 不透明(肌を削除) |
| 200〜1000 | 100% | 厚手(裏起毛相当) |
透け具合はメーカー各社の表から決めた値です。布の厚みは公表値が無いため推定値です(20D 0.15 mm 〜 110D 0.5 mm、裏起毛の 1000D 相当で 3 mm)。
デニールのスライダーは 5〜1000 の対数目盛です。厚い布ほど足指の間を大きく埋めます。
衣装の扱い
- 衣装を考慮(既定): 肌にぴったり沿って着ている薄い物(素体の下着・パンストなど)の上に重ねて履きます。
その物の肌からの高さだけ布を離し、縁はなめらかにつなぎます。スカートのように肌から離れている衣類は覆いません。
自動判定(体以外のメッシュごと):
- ウエストより下の部分の半分以上が、腰・脚の肌から 10 mm 以内にある(スカートは腰回りしか触れないので外れます)。
- 腰(股関節より上)を覆っている(靴下・靴は外れます)。
- 肌からの高さの中央値が 4 mm 以下(ズボンのように浮いた物は外れます)。
- 太ももの上部で止まっている(ドロワーズ・ブルマーのように太ももまで届く物は外れ、タイツの上に穿く物として扱います)。
太ももまで密着して覆う物(スパッツなど)は、タイツの下に着る物としては扱いません。
ウィンドウに検出したメッシュが並ぶので、1 つずつ対象を切り替えられます。
- 覆わない物(靴下・靴・ズボンなど、タイツの上に着る物)の下では、布がその内側に収まるように浮きを抑えます(0.4 mm 内側、最低 0.3 mm)。
布そのものは残すので、衣装をオフにしてもタイツに穴は開きません。
- 高さは肌から 25 mm までを測ります(フリルや、お尻の割れ目をまたぐ部分も覆うため)。
布どうしが交差して折れた所は、後で形から見つけてならします(下の「崩れの自動修正」)。
- 不透明なときは、タイツに完全に隠れる部分を肌と同じく AAO で削除します。
- その上の布は下着のウェイトを引き継いで下着と一緒に動き、さらに最大 2.5 mm 余分に離します。
- 下着の包み方(半透明): 半透明のタイツで下着の上に重ねるとき、次の 2 つは両立しないため選べます(不透明では常に内側に収めます)。
- 下着を内側に収める(既定・おすすめ): どの姿勢でも下着がタイツから出ないよう、下着の高さの分だけ布を持ち上げます。
ぴったりした普通の下着(多くのアバターの素体の下着)ならこちらです。
- 股の見た目を優先: フリルやリボンなど肌から大きく浮いた下着で、股を下から見たときに布が重なって崩れて見えるときに使います。
浮いた部分の持ち上げを抑えるので、その部分が少しタイツから出ることがあります。
- 肌のみ: 他のメッシュは考えず、肌に沿わせます。
肌の写し(半透明)
半透明のタイツ(とフェイクサイハイの上部)では、既定で「肌の写し」を使います。
- 不透明のときと同じく、布に覆われる肌を AAO で削除します。
- 代わりに、布と同じ形のメッシュ(
<名前>_Skin)に体の UV と体のマテリアル(輪郭線なしの複製)を付けて、布の内側に描きます。
見た目は元の肌と同じで、布と同じウェイト・シェイプキーで動くので、どんな姿勢でも肌が布から出ません。
- 布の面ごとに、真下の体の三角形の UV を使うので、体の UV の継ぎ目をまたいでもテクスチャが乱れません。
- 下着など下に着ている物の上(と、そのすぐ周り)は写しを作らず、肌も残します(下着が透けて見えるように)。
- 写しは布と同じ深さにあるため、写しの方を奥へわずかにずらしています(Offset +1)。
- ウィンドウの「肌の写し(半透明)」でオフにすると、肌を残して布だけを重ねます。
実物の構造
実物のタイツで編み方が違う部分を、布を平面で切り分けて別のマテリアルで描きます(境目は実物と同じくくっきりした線になります)。
寸法は脚の長さ(股関節〜足首)に対する比率なので、体格が違っても同じように合います。ウィンドウの「実物の構造」で個別に切り替えられます。
| 部分 | 位置・大きさ | 見た目 |
|---|
| ウエストバンド | 上端から脚の長さの 3.5%(サイハイは上端の帯) | 濃い帯 |
| パンティ部(タイツのみ) | ウエストバンドの下からランガードまで | 少し濃い |
| ランガード(タイツのみ) | 太ももの付け根から膝までの 20% の位置に、脚の長さの 3% の幅 | 濃い帯 |
| つま先の補強 | 足首からつま先までの 70% より前 | 補強: 濃い/サンダル: ほとんど目立たない/ヌード: なし |
| かかとの補強 | カップ(U 字): 足首の少し下の水平な上端・土踏まずの手前の前端・丸めた角で囲む。Y ヒール: 足首の後ろから足裏へ斜めの線 | つま先と同じ |
| つま先の形 | まっすぐ: 指の上を横切る線。包む形: 両脇へ回り込むトウキャップ形 | — |
| マチ(中心の縫い目・タイツのみ) | 前・後ろ・前後から選ぶ。腰の中心線に沿う細い帯(脚の長さの 0.6%)。股の最下点まで | 濃い線 |
| ひしマチ(タイツのみ) | 股の最下点を中心にした菱形。半幅は腰の幅の 2 割×「大きさ」、前後の半分の長さは半幅×「縦横比」 | 少し濃い(綿の当て布ではなく同じ編み地) |
半透明では、各部分の被覆率を 1 − (1 − c)^k(パンティ部 k=1.6、帯 3、補強 2.2、サンダル 1.3、縫い目 3、ひしマチ 2)にし、色を少し暗くします。
マテリアルは使う部分の数だけ作ります(最大 8 つ。2 層式は裏地を加えて 9 つ)。
お尻の割れ目と細い溝
- お尻の割れ目では、布を奥まで沿わせず、実物のタイツのように割れ目の上を渡します(体のお尻の部分を半径 40 mm で閉じた面の上に載せます)。
下着がある所では、その下着の面より外に置きます。
前側(股)は沿わせたままです(渡すと股の下で布が裂けたように見えるため)。
- 細い溝では、布を向かいの肌までの半分より外へ出しません。体の中心線も越えません(向かい合う壁の布が交差して黒いひだになるのを防ぐため)。
- 半透明の布は、先に奥行きだけを書き込んでから描きます(カスタムシェーダーの先行パス)。布が重なって見える所(股を下から見たときなど)で、
三角形の描画順による濃淡のまだらが出ないよう、一番手前の層だけを描きます。
崩れの自動修正と品質検査
- 布の面の向きが、その下の肌の向きから 60 度以上ずれた所(折り返し・溝で立った面)を、場所によらず形で見つけ、
周りの布の高さに揃えてならします(直らない所は肌に寄せます)。各頂点の本来の高さ(下着の上など)より下げることはしません。
- 生成のたびに、尖り(面どうしが 100 度以上折れた所。体自体がそう折れている所は除く)・浮きすぎ・針のように細い三角形・
裾以外の穴を数え、場所とともに Blender のログに出します(修正ではなく確認用)。
- Blender の処理は、通常 60 秒・高品質 90 秒で打ち切ります(10〜600 秒の範囲で変えられます)。
質感
「質感」で布の表面の見え方を選べます(綿素材はありません)。標準(lilToon の既定のまま)/マット/セミグロス/光沢/サテン(ウェット)/トゥーン(段のある影と硬いハイライト)。
lilToon の影・反射(つやの強さ)・リムライトの設定で作ります。角度で濃くなる性質と伸びによる透けはそのまま効きます。
引っ張られた所の透け(不透明・PC 版のみ)
「引っ張られた所の透け(不透明)」を 0 より大きくすると、不透明のデニールでも、膝を曲げたときの膝の前・足首を曲げたときのかかとやつま先など、
姿勢で布が引っ張られた所だけ肌が透けます。立った姿勢では完全に不透明です。
- 姿勢に応じた透けのカスタムシェーダーを使うので PC 版のみです。肌の写しを使います(下着の下も写しで覆います)。
- デニールが高いほど弱く(80D で 0.86 倍)、200D 以上では透けません。2 層式・フェイクサイハイでは使えません。
柄(タイツ)
「柄」で、脚に編み込む柄を選べます。柄の部分は濃く編んだ扱いで、半透明の所では透けにくく、不透明の所では色だけが変わります。
- バックシーム: 脚の後ろの縫い目。足首の少し上からウエストまで。
- ドット / 猫: 脚(ランガードより下、足首まで)に並べます。フェイクサイハイではソックス部に入ります。
- 「柄の色」「柄の濃さ」(透ける所での濃さ)「柄の大きさ」を調整できます。
- 脚の座標(UV1)に合わせたテクスチャ(2048×2048、部分ごと)を生成し、lilToon の 3rd テクスチャで重ねます。
柄は脚の周りの角度で並ぶので、細い所(足首)ほど小さくなります。
ソックス(サイハイ・ニーハイ)
- サイハイソックス: 上端の位置を脚の座標(0 = 股関節、1 = 膝)で指定します。
- ニーハイソックス: 上端の位置は 1 = 膝。膝の関節にかからないよう 0.9 以下(膝上)か 1.1 以上(膝下、既定 1.25)をおすすめし、
関節にかかる値ではウィンドウに注意を出します。作り方はサイハイと同じです。
- 口ゴム: 無地/レース(小さな穴の網目。穴から肌の色が見えます)/滑り止め(波線)。
- つま先・かかとの補強、柄、質感などはタイツと同じものが使えます。
手袋・アームカバー
腕にも同じ方式(体のメッシュをずらして布にする)で作ります。腕の座標は 0 = 肩、1 = 肘、2 = 手首です。
- 手袋: 長さ(手首/前腕/肘上のオペラ)、指(5 本指: 体の指に沿って包み、指のボーンで指ごとに曲がる/指なし: 指の付け根で切る/絵描き用: 薬指と小指だけを包み、親指は穴から出し、人差し指と中指は付け根で切る)。
質感に「綿」も選べます(手袋だけ。つやなし)。
- アームカバー: 上端の位置(腕の座標)。「手の甲まで」をオンにすると指の付け根まで覆い、親指は穴から出します。
- 手の指の骨(中指・人差し指の付け根、親指)は Humanoid の設定から取ります。無いアバターでは手の形から推定します。
包む(おばけのしっぽなど)
脚の代わりに別の下半身(おばけのしっぽなど)へ切り替えられるアバターのための種類です。選んだメッシュを、そのままの形でタイツの生地で包みます。
- 包むメッシュは自動で探します(ボディではない、脚や背骨ではなく腰から下のボーンで動く、腰より下にあって両脚の幅がある、
下が閉じていて開いた縁が上の方にしかない、の全てを満たすもの)。見つからない・違う物のときはウィンドウで指定します。
- メッシュの各頂点を、同じ位置の頂点の法線を平均した向きに「肌との隙間 + 布の厚み」だけずらします。頂点が 1 対 1 で対応するので、
ウェイトとシェイプキーをそのまま写し、包む物と完全に一緒に動きます(Blender は使いません)。
- 包んだ物は、包むメッシュのオブジェクトの子に置くので、そのメッシュと一緒に表示・非表示が切り替わります。
普通のタイツも同時に生成しておけば、脚のときはタイツ、しっぽのときは包んだ物が見えます。
- 生地は同じデニール・色のタイツの生地です。脚の形による伸びの透け・姿勢に応じた透け・柄は使いません。
その他のオプション
- グラデーション: 脚の上から下へ、「色」から「下の色」へ変えます(変わる範囲は脚の座標で指定)。
- 伝線: 編み目がほつれて肌が見える縦の線を、指定した本数だけランダムに入れます(「配置の種」が同じなら同じ配置)。
- 柄を入れる脚: 両脚/左脚/右脚(片脚だけ柄)。
- たるみ: 足首の周りと膝裏に、小さなしわの段を外向きに付けます(形状。細かい方がきれいなので高品質と一緒に使うのがおすすめ)。
- 股上の高さ: 「ウエストの高さ」(0 = 股関節、1 = 胸)で、ハイウエスト〜ローライズにできます。
フェイクサイハイ(タイツのみ)
1 枚のタイツで、太ももの境目より下をソックス部、上を素肌が透ける薄いストッキング部にして、サイハイソックスを履いているように見せます。
- 境目は脚の座標(股関節 0〜膝 1、既定 0.55)の位置で、布をきれいに切り分けます。
- ソックス部は「デニール」と「色」に従います(不透明なら、その下の肌だけを削除します)。
- ストッキング部は「上部のデニール」(既定 15D)と「上部の色」(既定ベージュ)の半透明です。下の肌は、肌の写し(既定)では写しに置き換え、写しをオフにしたときは残します。パンティ部とランガードもこの薄い素材で描きます。
- 「境目の帯」で、ソックス部の上端にサイハイの口ゴムのような濃い帯を付けます。
- 「境目の飾り」: レース(境目の上に半円の縁が並び、帯に網目)、波(ソックス部が波形に伸び上がる)、猫(脚の前に猫の顔。耳が境目の上に出る)。飾りはソックス部の色です。
- 2 層式とは同時に使えません。
脚の座標(UV4・UV1)
布の各頂点の UV4 に、脚に沿った座標を入れています(柄の土台)。
- x: 脚の骨に沿った位置。股関節 0、膝 1、足首 2、つま先 3(腰より上はマイナス)。
- y: 脚の周りの角度(回転数)。前が 0 で、外側が左右で同じ向きになるよう反転しています。左脚は 0〜1、右脚は 2〜3(片脚だけの柄のため)。脚の前をまたぐ面では 1 を超えて続けます。
- UV1 には柄のテクスチャ用に (y / 4, (x + 1.5) / 5) を入れています。
つま先
- まとめ(既定): 指をひとまとめに包み、指の間を布で埋めます(「足指の間を埋める」で幅を調整)。
- 5 本指: 体の指に沿って 1 本ずつ包みます。各指の布は体の指と同じウェイトなので、足の指のボーンがあるアバターでは指ごとに曲がります。
体の指が分かれていない(ミトン形の)足では、体と同じ形になります。
- 足袋型: 親指だけを別に包み、ほかの 4 本はまとめて包みます。体の指が分かれていない足では「まとめ」と同じ形になります。
親指サック
足の親指だけを覆うサックです。タイツの下に着て、爪による伝線を防ぐ補強として使う物で、肌との隙間は 0.3 mm 以下で作ります
(上に重ねるタイツの内側に収まります)。親指の付け根まで覆い、口はほかの指との境目に沿って切ります。
体の足の指が分かれていなければ、指先の内側を親指として切ります。
先に親指サックを作ってから透けるタイツを作ると、タイツ越しにサックが見えます(タイツの肌の写しをサックの上には付けません)。
ガーター・レッグラップ(試作)
脚に付ける小物です。「タイツ・靴下の上に付ける」がオンで、先に作ったタイツ・スパッツ・サイハイ・ニーハイがあれば、その上に付けます(無ければ素肌の上)。
どちらも締まる物として、肌(またはその下のタイツ)との隙間は 0.3 mm 以下で作ります。
- ガーター: 脚を一周する帯です。帯の位置(脚の座標)と幅を指定します。「リボン」をオンにすると、帯の前の外寄りに
リボンの結び目(2 つの輪・2 本の垂れ)を付けます。垂れは VRChat の揺れ物(PhysBone)で揺れます。
- レッグラップ: 脚にらせんに巻くリボンです。巻き始めと巻き終わり(脚の座標)、巻く回数、リボンの幅を指定します。
「交差させる」をオンにすると、逆向きのらせんも巻いて編み上げのように交差させます。
- 「アバターの靴下・レッグウォーマーの上にも巻く」(既定オン): アバター自身の脚の服の上からも巻きます。服を脱がせる切り替えをする場合はオフにすると、
服を脱いだ状態で肌(またはタイツ)に沿います(服を着たままでは服を突き抜けます)。
2 層式(フェイクタイツ)
実物には、厚手の裏起毛(1000D 以上)の裏地を肌色にして、薄い表地越しに素肌が透けて見えるようにした「フェイクタイツ」があります(例: 1200D で見た目 40D 相当)。
「2 層式(フェイクタイツ)」をオンにすると次のようにします。
- 形(厚み)と肌の削除は「デニール」に従います(裏地が肌を隠すので不透明扱い)。
- 同じ布に 2 つのマテリアルを重ねます。内側は肌色の裏地(不透明)、外側は「見かけのデニール」の半透明の表地です。
角度による濃さ・伸びによる透けは表地に掛かるので、伸びた部分ほど裏地の肌色が見えます。
- 裏地の色は、既定で脚の肌テクスチャの平均色を使います(「裏地の色を肌から取る」)。手動でも指定できます。
半透明のときは、lilToon の 2nd テクスチャを MatCap UV(カメラから見た法線)で読み、透明度を置き換えます。
布を斜めに通して見るほど暗くなる実物の性質(透過率 (1−被覆率)^(1/cosθ))をテクスチャに焼き込んでいます。
伸びによる透け
実物のタイツは、布が伸びた部分ほど編み目が開いて透けます。半透明のデニールでは次のように表現しています。
- 脚の太さ(足首付近の最も細い部分との比)が大きいほど伸びが大きいとみなします(太もも・ふくらはぎ)。
- 膝の前側も伸びた部分として扱います。
- 腰(パンティ部)と足先は補強部分として伸びなしにします。
- 伸び率 s のとき被覆率は c/s になるので、透明度に 1/s を掛けます。値は UV0.x に入れ、lilToon のアルファマスク(乗算)で反映します。
- 強さは「伸びによる透け」(0〜2、既定 1)で調整できます。
これは立った姿勢(Tポーズ)を基準にした固定の分布です。脚の曲げによる変化は、次の「姿勢に応じた透け」で足します。
姿勢に応じた透け(試作・PC 版のみ)
「姿勢に応じて透けを変える」をオンにすると、膝を曲げたときに膝の前が透け、膝裏や脚の付け根の折れ目が少し濃くなります。
Shaders/ の lilToon カスタムシェーダー(LegWeaver/Transparent)で計算します。見た目は lilToon の半透明と同じで、透明度の計算だけを足しています。
(このシェーダーは、奥行きの先行パスのため、オフのときも半透明の布すべてに使います。)
- 各頂点に「脚に沿った単位ベクトル」を接線として入れておきます。ブレンドスキニングは関節が曲がるほどこのベクトルを短くするので、
シェーダーはその縮み具合で各頂点の曲がりを知ります。生成時に脚(股・膝・足首)を曲げて、曲がりに対して各頂点の周りの面積がどれだけ伸びるか(係数)を測り、UV3.x に保存します。
- 透明度を「1 + 係数 × 縮み」で割ります。値は頂点ごとに求めて三角形の中で補間するので、三角形ごとの段になりません。
- Android(Quest)では lilToon を含むカスタムシェーダーが使えないため対象外です。
仕組み
- Unity: ボディメッシュ(今のメッシュとバインドポーズ)、Humanoid の脚・腰ボーンの位置、各頂点の脚ウェイトを書き出します。
FBX を経由しないため、元の FBX と prefab の違い(シェイプキーの値、差し替えたメッシュなど)の影響を受けません。
- Blender(
Editor/Blender/legweaver.py):
- ウエスト・裾などの平面でボディを切り、覆う範囲を取り出します。
- その範囲の頂点を、法線方向に「肌との隙間 + 布の厚み」だけ外へずらして布にします。各頂点は元のボディ頂点と同じウェイトになるので、
関節を曲げても布が肌と同じように動きます(三角形の内側に頂点を置いてウェイトを補間すると、ローポリの体ほど大きくずれるため)。
- 関節(ボーンのウェイトが混ざる所)はスキニングで隙間が縮むので、最大 2 mm 余分に離します。裾の近く(2.5 cm)は実物のゴムの帯のように最大 2.5 mm 浮かせます。
- 範囲を閉じた SDF(符号付き距離場)を外形の目安にし、それより少し(3 mm まで)沈んだ所(へそ・浅い溝)は外形まで持ち上げ、深く(6 mm 以上)沈んだ内部の形状は除きます。
細い溝は外側だけの平滑化で埋めます。
- つま先が「まとめ」のときは、足の指の付け根より前は SDF の面を使い(クロージングで指の隙間を埋める)、切り口の輪どうしを三角形でつなぎます。
「5 本指」のときは足先も体に沿わせます。
- Solidify(縁のみ)で布の端に厚みを付けます。内側の面は体で隠れて見えないため作りません。
- 各頂点がボディのどの点から来たか(指先は最も近い点)を記録します。法線はボディの滑らかな法線を使います。
- Unity: 記録した点からウェイトとシェイプキーを引き継いでメッシュを作り、アバターに追加します。
データの扱い
このツールは、Blender を探すためにインストール済みのプログラムの情報を読み、Blender とその Python を起動します。普通のエディター拡張より強い権限を使うので、信頼できるかをご自身で判断できるよう、開発用の検査コードを除くすべてのソースを公開しています(通信はしません)。
- このツールは通信をしません。アバターのデータは、利用者のパソコンの中だけで扱います。
- 生成の間、体のメッシュ(頂点・法線・UV・三角形)と下に着ている物の形を、プロジェクトの
Temp/LegWeaver/ の下の作業フォルダに書き出し、Blender に渡します。作業フォルダは、生成が終わった時だけでなく、キャンセル・失敗・ウィンドウを閉じた時にも消します(Blender を止めた直後で消せなかった物は、Unity を終了すると Temp ごと消えます)。プロジェクトを人に渡すときは Temp を含めないでください。
- 生成した衣装(
Assets/LegWeaver_Output/ のメッシュ・肌の写し・マテリアル)は、アバターの体の形・ウェイト・シェイプキー・マテリアルから作られます。生成物を配布・販売する場合は、元のアバターの利用規約に従ってください。フォルダ名にはアバターの名前が入ります。
- 指定した Blender と Python の場所、生成の打ち切り時間は、Unity のエディターの設定(EditorPrefs。プロジェクトの外の、このパソコンの利用者ごとの設定)に保存します。
- Unity のコンソールとログ(Editor.log)には、メッシュやシェイプキーの名前、保存先のパスが出ます。不具合を報告するときは、ユーザー名を含むパスや、公開したくない名前を伏せてください。
既知の制限
- 布の下の肌の削除(Avatar Optimizer)はビルド(アップロード)の時に行います。シーンでビルド前のアバターを見ると、布のすぐ下に残っている肌(足首や足の甲、指先の塗りなど)が、
布の上に小さな点として見えることがあります。アップロードしたアバターでは出ません。シーンで仕上がりを見るときは、NDMF のプレビューをオンにしてください。
- 「肌のみ」では、下着など肌から浮いている衣装がタイツを突き抜けて見えます。
- 半透明で下着の上に重ねたとき、股を大きく曲げる・ひねる姿勢で、下着が数 mm 布から出ることがあります(不透明では削除するので出ません)。
- 肌の写しは体のマテリアルを使うので、体のテクスチャが下着の下を塗っていないアバターでは、下着のすぐ周りは写しを作らず元の肌を残しています。
- 体のテクスチャに脚の柄(描き込まれたタイツなど)があるアバターでは、半透明のタイツ越しにその柄が見えます(肌の写しも同じ柄になります)。2 層式の裏地を「肌から取る」にすると、その色になります。
- 体のメッシュが膝などで終わっている(靴下などの衣装が脚を兼ねる)アバターでは、肌のある所までしかタイツを作れません(ウィンドウに注意が出ます)。
- 下着の高さに上限があるため、大きく浮いたフリルなどはタイツから少し出ます。気になるときは、その下着を「覆わない」にするか「肌のみ」を使ってください。
- 姿勢に応じた透けは、脚(股・膝・足首)の曲げだけを表現します。開脚・ひねり・腕の衣類は、立った姿勢での固定の分布(伸びる所が前もって透ける)だけです。
バージョン規則
版番号は SemVer(メジャー.マイナー.パッチ)に従います。Unity 2022.3 向けは 2 系(2.x.y)、Unity 6 向けは 6 系(6.x.y)です。
互換性として守るのは、次の物です。
- すでに生成した衣類が、そのまま動き続けること(アバターに入る
Runtime/ の部品のデータ、Shaders/ のシェーダーの名前とプロパティ)。
- ウィンドウの設定項目と、その意味。
- 依存パッケージ・Unity・Blender の対応範囲。
生成されるメッシュの形・頂点数・UV・ウェイトの細部は、互換性に含みません。同じアバターで作り直したとき、前の版と同じ物ができるとは限りません。すでに生成した衣類はアセットとして保存されているので、ツールを更新しても変わりません。変わるのは作り直したときだけです。
このツールは、アバターごとの専用の設定(プロファイル)を持たず、すべてのアバターを同じ処理で作ります。改良するときは、複数のアバターで作り直して結果を比べ、ほかのアバターへの悪い影響も確かめたうえで、影響の大きさに応じて取り込むかを決めています。そのため、ある改良が別のアバターの形を変えることがあり、版が変わると、前の版の出力とはほぼ一致しません。
これは SemVer の上では破壊的変更に当たりませんが、作者は「SemVer の規則をすり抜ける破壊的変更」だと考えています。そのため、生成される形が変わる変更は、下の表のとおりパッチではなくマイナーで出します。同じ形を作り直せることが必要な場合は、使った版を控えておき、その版で作り直してください(公開した版は後から差し替えません)。
| 変更 | 版の上げ方 |
|---|
| 生成される形が変わらない修正(画面・ログ・速さ・説明など) | パッチ(2.0.0 → 2.0.1) |
| 生成される形が変わる変更(改良・不具合の修正を含む)、種類・設定の追加 | マイナー(2.0.1 → 2.1.0) |
| 生成済みの衣類や設定が使えなくなる変更、対応環境の変更 | メジャー(Unity 6 への移行は 6.0.0) |
パッチの更新なら、同じアバター・同じ設定で作り直したとき同じ形ができます(Blender の版が同じ場合)。形が変わってほしくない場合は、
VCC(ALCOM)でマイナーの範囲を固定してください(例: 2.1.x)。
公開した版は、後から差し替えたり消したりしません。使う前に、その版の対応する Unity・依存パッケージ・Blender を確かめてください。
ソースコードのコメント
ソースコードのコメントは日本語です。英語が必要な場合は、翻訳ツールで訳してください。
商標と開発について
VRChat・Unity・Blender・lilToon・Modular Avatar・Avatar Optimizer・NDMF などは、各社・各作者の商標または製品名です。このツールはそれらの各社・各作者とは関係がなく、承認も受けていません。このツールについて、各社・各作者へ問い合わせないでください。
このツールは、作者が方針を決め、AI(Anthropic の Claude)が実装・確認・文書の大部分を行って作りました(開発体制は https://github.com/MerciaGrimauge/legweaver/tree/main/Design/development )。
サポート
機能追加や個別の技術サポートはしません。BOOTH で入手した場合は、BOOTH の決まり(ショップの義務)に従って、ダウンロードできない・中身が違うといった連絡には対応します(返事まで数日かかることがあります)。
ライセンス
Copyright (c) 2026 MerciaGrimauge。部分ごとにライセンスが異なります。詳しくは LICENSE.md(英語が正文)を見てください。
| 場所 | ライセンス |
|---|
Shaders/・Runtime/ | MIT(GPL ではありません) |
それ以外(Editor/ など) | GPL-3.0-or-later |
- このツールが生成したメッシュ・テクスチャ・マテリアルなどは利用者の物で、GPL の対象ではありません。
- 生成した衣類を使ったアバターをアップロード・配布・販売しても、そのアバターを GPL にする必要はありません(アバターに入るのは MIT の部分だけです)。
- 処理の説明(
ALGORITHM.md)などの設計書は、このパッケージには入っていません。ソースのリポジトリの Design/(https://github.com/MerciaGrimauge/legweaver/tree/main/Design)にあり、0BSD と MIT-0 のどちらかを選べます(表示も出典も要りません)。
- 各ファイルのライセンスは、先頭の
SPDX-License-Identifier で示しています。コメントを書けないファイル(.meta・.asmdef・package.json・文書など)は REUSE.toml で示しています。