Blender Add-on Free Blender 4.2+

NuniAvatarToolkit

Remove faces hidden under clothing, find and fix skin poking through outfits, clean out unused data, and run pre-export checks. The prep work of avatar editing, gathered into a single Blender sidebar tab.

9 tools in one tab Select and review before deleting PC / Quest reference ranks GPLv3
Illustration of the sidebar layout, not an actual screenshot. The add-on UI is in Japanese.
Features

Avatar prep, all in one tab

The nine tools below appear as panels in the "Avatar Toolkit" tab of the 3D Viewport sidebar. Anything that deletes or changes data first selects or lists its targets, then asks for confirmation before it runs.

Hidden Mesh Removal

Ray casting finds body faces completely covered by clothing and never visible from outside. Faces are selected and highlighted first, so you can review them before deleting. The body is backed up automatically right before deletion.

Unused Data Cleanup

Clears out empty vertex groups, shape keys with no effect, unused UV maps, color attributes and material slots, and loose vertices/edges in one go. Scan first to see the counts, then delete.

Mesh / Material Merge

Joins meshes with a pre-check that warns about lost shape keys and mismatched armature or UV setups. Also merges duplicate material slots that point to the same material.

Stats / Pre-export Check

Shows polygon, material slot and bone counts with reference ranks for PC and Quest, and lists problems such as NaN/Inf coordinates, unapplied scale or rotation, non-manifold edges, bones with no weights, and collection layout issues.

Texture Relink

When an imported avatar shows up purple/pink because its textures are missing, this searches a folder you choose and relinks the images. If several candidates match, it lists them instead of guessing.

Armature Align

Translates one Armature so that a chosen bone (Hips by default) matches another Armature's rest position. Handy for overlaying two versions of the same avatar, such as barefoot and high-heel builds.

Bone Weights for Merging

Assigns every vertex of an accessory to a single bone at weight 1.0, so it keeps following that bone in Unity and VRChat after you merge it into the avatar body.

Clothing Fit

Within a vertex group you specify, pushes only the clothing vertices buried inside the body out to the body surface, and saves the result as a shape key. Set it back to 0 to restore the original shape at any time.

Poke-through Check

Detects body faces sticking out past the clothing surface in the current pose and selects them in Edit Mode. It only inspects; nothing is deleted or deformed.

Setup

Installation

Install the ZIP directly in Blender. There's no need to extract it.

Download the ZIP

Get NuniAvatarToolkit-1.0.0.zip from BOOTH and keep it as a ZIP file.

Install from Disk

In Blender, open Edit > Preferences > Add-ons, click the "∨" menu in the top-right corner, choose Install from Disk, and select the ZIP.

Enable the add-on

Tick the checkbox next to "NuniAvatarToolkit" in the list.

Open the "Avatar Toolkit" tab

Press N in the 3D Viewport to open the sidebar. A new "Avatar Toolkit" tab holds all of the tools as panels.

Requires Blender 4.2 or later. Automated tests are run on Blender 4.2.0, 4.3.2 and 5.2.0 for Linux and Blender 5.2.0 for Windows. To update, disable the add-on, install the new ZIP the same way, and enable it again.
The add-on's interface is currently available in Japanese only. In this guide, buttons and fields are given in English followed by the on-screen Japanese label in parentheses, e.g. Select Hidden Faces (隠れた面を選択).
How to use

Tool guide

Listed in the same order as the sidebar panels. Click a tool to see its steps and notes.

1. Hidden Mesh Removal 隠れメッシュ削除

Rays are cast outward from every body vertex to find vertices and faces fully enclosed by clothing (or, optionally, by the body itself) that can never be seen from outside.

  1. Set Body Mesh (ボディメッシュ) to your body object.
  2. In the Clothing Meshes (服メッシュ) list, click "+" to add a slot for each clothing object that covers the body.
  3. Adjust Samples (サンプル数), Offset Ratio (オフセット比率), Detection Mode (判定モード) and Safety Margin (安全余白) if needed. Safety Margin shrinks the deletion area by 1–3 steps inward from its edge, so holes are less likely to show when the avatar moves. Medium (中) is recommended for most cases.
  4. To protect areas that facial shape keys may reveal, such as the inside of the mouth or around the eyes, create a vertex group and set it as Excluded Vertex Group (除外頂点グループ).
  5. Run Select Hidden Faces (隠れた面を選択). Blender switches to Edit Mode and highlights the faces judged hidden. Nothing is deleted at this point. Check them visually and adjust the selection by hand if needed.
  6. When you're satisfied, run Delete Selected Faces (選択した面を削除) and confirm the dialog. A hidden, independent copy of the body is saved to the AMT_Backups collection just before deletion.

Notes

  • Always review before deleting, so you don't remove faces that only appear with shape keys (blinks, eye movement, mouth open) or with alternate outfits toggled in-game. Take extra care with Include Own Mesh as Occluder (自身のメッシュも遮蔽物に含める), which makes areas like the mouth interior more likely to be selected.
  • Modifiers that change vertex count, such as Subdivision Surface, Mirror and Boolean, are temporarily disabled while the pose is evaluated. If the vertex count still doesn't match, you'll get a warning that the rest positions were used instead.
  • Processing runs as a modal operation: progress is shown in the status bar and Esc cancels. Avatars with many vertices × samples can take a while.
  • Meshes in excluded collections or hidden in the viewport can't be evaluated. Shared or linked bodies are analyzed only, never selected or deleted.

Python API (for scripts and AI agents)

From Python inside Blender, call the public function NuniAvatarToolkit.run_hidden_mesh. It accepts object names or Blender objects.

import NuniAvatarToolkit

result = NuniAvatarToolkit.run_hidden_mesh(
  body="Body",
  clothing=["Tops", "Jacket"],
  action="SELECT",  # ANALYZE / SELECT / DELETE
  safety_margin="MEDIUM",  # NONE / SMALL / MEDIUM / LARGE
)
print(result)

ANALYZE returns results without changing anything, and SELECT selects the faces after the safety margin is applied. DELETE deletes those same faces, always creating a body copy in AMT_Backups first. The return value is a JSON-serializable dict with face indices, counts and the backup name.

2. Unused Data Cleanup 不要データ一括削除
  1. Set Target Mesh (対象メッシュ) to the object you want to clean.
  2. Tick the items you want removed (all are enabled by default).
  3. Run Scan (スキャン) to see how many candidates were found. Nothing is deleted yet.
  4. Review the results, then run Delete (削除を実行) and confirm the dialog.

Notes

  • Vertex groups referenced by modifiers or shape keys, UV maps and color attributes used by the nodes of assigned materials, and shape keys driven by drivers are protected. Edit Mode changes are synced before candidates are evaluated.
  • Shared, linked and library-override meshes are rejected before anything is changed.
  • If modifiers whose material indices can't be verified remain, such as Solidify, Bevel, Wireframe or Geometry Nodes, removal of unused material slots is cancelled. Apply the modifiers on a duplicate first, or untick Unused Material Slots (未使用のマテリアルスロット) and process the other items only.
3. Mesh / Material Merge メッシュ/マテリアル統合
  • Join Selected Meshes (選択メッシュを結合): make the target object active, select every mesh to join, and run. The confirmation dialog lists anything to watch out for, such as shape keys or differing armature/UV setups. Note that Blender's standard Join drops shape keys from objects other than the active one.
  • Merge Duplicate Material Slots (重複マテリアルスロットを統合): in the active object, combines slots that reference the same material and removes only the duplicates (with a confirmation dialog). Unused slots unrelated to duplicates are kept.

Notes

  • Merging duplicate slots is cancelled if modifiers that depend on material indices remain, such as Solidify, Bevel, Wireframe or Geometry Nodes, including ones hidden in the viewport. Apply them on a duplicate first.
  • Meshes shared with other objects or linked from a library aren't processed. If the join target is a shared mesh, the join is cancelled to protect unselected objects.
4. Stats / Pre-export Check 統計/書き出し前チェック
  1. Put the whole avatar (body, clothing, armature, etc.) in one collection and set it as Avatar Collection (アバターコレクション).
  2. Run Diagnose (診断を実行) to see the results as a list.

What it checks

  • Evaluated polygon and material slot counts, bone and shape key counts, with PC and Quest reference ranks (Excellent to Very Poor, e.g. 【PC: Excellent / Quest: Good】)
  • Vertices with invalid coordinates (NaN/Inf), including every shape key and Basis
  • Negative or non-uniform scale and unapplied rotation on meshes and Armatures, including delta transforms
  • Number of non-manifold edges
  • Bones that carry no weights from any mesh (nothing is deleted; PhysBones and other references can't be judged from mesh weights alone, so check these by hand)
  • Collection layout: meshes placed directly under the collection instead of in sub-collections, contents inside excluded or hidden collections, objects linked to multiple collections, zero or two-plus armatures, collections still using default names such as Collection, and empty sub-collections

Category names (Outfit, Accessory, etc.) don't matter. A flat layout with no sub-collections produces no layout warnings. Ranks are estimates based on the PC and Quest criteria of VRChat's Avatar Performance Ranking System.

5. Texture Relink テクスチャ再リンク

When you open an avatar's FBX or .blend file bought on BOOTH, textures sometimes go missing and the model shows up purple/pink. This tool finds those missing images in a folder you choose and relinks them.

  1. Set Search Folder (検索フォルダ) to the folder containing the texture files. Subfolders are searched too.
  2. Run Relink Missing Textures (欠落テクスチャを再リンク).
  3. A report lists the result for each image: relinked, skipped because of multiple candidates, not found, and so on.

Matching order

  1. Exact match between image name and file name
  2. Match ignoring extension, letter case and Blender's duplicate suffixes such as .001
  3. Partial name match
  4. If several candidates tie at the same level, nothing is relinked to avoid picking the wrong file; the candidates are listed for you to handle manually

Notes

  • It only relinks to files that actually exist in the folder. If you don't have the texture files, this can't fix it.
  • Images whose datablocks were never created during FBX import are out of scope. UDIM, image sequences, movies, packed images and images linked from another .blend are left untouched.
  • Each candidate is decoded as an image before the path is changed. Broken files aren't counted as success, and the original path is kept so you can retry.
6. Armature Align アーマチュア位置合わせ

Two versions of the same avatar (say, barefoot and high-heel) can have different rest-pose bone positions even when both objects sit at (0, 0, 0). This translates the whole target Armature so that the chosen bone's rest-pose world position matches.

  1. Set Reference Armature (基準Armature) to the Armature that stays in place. A "Hips"-like bone is picked automatically, and you can change it.
  2. Set Target Armature (対象Armature) to the Armature you want to move.
  3. Run Align (位置を合わせる). The target Armature is translated so the chosen bone lines up with the reference.

Notes

  • Only location (translation) is matched. Rotation and scale stay as they are.
  • The rest pose (bone layout in Edit Mode) is used, not the current pose.
  • Meshes parented to the target Armature move with it. Meshes linked only through an Armature modifier don't, and a warning is shown.
  • It won't run while the Armature is in Edit Mode and asks you to switch to Object Mode. If constraints or drivers prevent a clean translation, the changed channels are restored.
7. Bone Weights for Merging 統合用ボーンウェイト

Before merging an accessory into the avatar body, assign all of its vertices to one bone at weight 1.0, so it follows that bone rigidly in Unity and VRChat after the merge.

  1. Set Target Mesh (対象メッシュ) to the accessory mesh you want to merge.
  2. Set Armature (Armature) to the Armature it should follow.
  3. Choose the bone to follow under Bone (ボーン).
  4. Run Set Merge Weights (統合用ウェイトを設定).
  5. Select the target mesh and the destination mesh that uses the same Armature modifier, make the destination active, and run Join Selected Meshes (選択メッシュを結合).

Notes

  • Existing weights for bones of the same Armature are removed from the target mesh, and only the chosen bone gets weight 1.0. An Armature modifier is added automatically if missing.
  • For safety, meshes with an Armature modifier pointing to a different Armature than the destination, meshes with Bone Parent set, and linked meshes that can't be edited are not processed.
  • Shared meshes, targets whose mesh data alone is linked, and non-deform bones (use_deform=False) are rejected before any weights are removed. Make shared meshes single-user first, and pick a deform bone to follow.
8. Clothing Fit 服メッシュフィット

Outfits made for another avatar often let the body poke through. Limited to a vertex group you choose, this pushes clothing vertices that are buried in the body out to the body surface and adds the result as a shape key. Unlike shrink-wrapping the whole garment, you can target just the area that needs fixing, such as the chest or hips.

  1. On the clothing mesh, create a vertex group covering the area to fit. Weight values act as fit strength, so feathering the edges toward 0 avoids visible steps.
  2. Set Body Mesh (ボディメッシュ) to the body and Clothing Mesh (服メッシュ) to the garment to deform.
  3. Choose the vertex group from step 1 under Target Vertex Group (対象頂点グループ).
  4. Adjust Offset (オフセット), the distance to float above the body surface, and Max Search Distance (最大探索距離) as needed.
  5. Run Fit and Create Shape Key (フィットしてシェイプキーを作成). A shape key (named AMT_Fit by default) is added to the clothing at value 1.0.

Vertices already outside the body are left alone and only buried ones are pushed out, so the garment's silhouette is preserved.

Notes

  • Because the result is a shape key, setting it to 0 restores the original shape, and you can dial the effect down with the slider.
  • If a shape key with the same name exists, it's overwritten after a confirmation dialog. Change Shape Key Name (シェイプキー名) to keep separate keys per area.
  • The Armature is treated as being in rest pose during the calculation, and the original pose is restored afterwards.
  • Vertices farther than Max Search Distance are skipped. To fit clothing that's far off, raise the value or set it to 0 for no limit.
  • The clothing must be a local, single-user mesh. Existing absolute keys, self-referencing relative keys, muted keys, or keys whose slider range excludes 1.0 stop the run instead of being changed silently.
  • Clothing modifiers that change coordinates or topology, such as Displace, Shrinkwrap, Mirror and Subdivision, should be disabled or applied on a duplicate first.
9. Poke-through Check 貫通チェック

Finds body faces sticking out past the clothing surface and selects them in Edit Mode. It only inspects; nothing is deleted or deformed.

  1. Set Body Mesh (ボディメッシュ) to your body object.
  2. In the Clothing Meshes (服メッシュ) list, click "+" to add a slot for each clothing object that covers the body.
  3. Adjust Max Search Distance (最大探索距離), Detection Threshold (検出しきい値) and Detection Mode (判定モード) if needed.
  4. To protect parts that are meant to be exposed, such as the face, hands and feet, create a vertex group and set it as Excluded Vertex Group (除外頂点グループ).
  5. Run Check Poke-through (貫通をチェック). Offending faces are selected in Edit Mode, and the face count and maximum protrusion are reported.

Notes

  • The check uses the current pose. Poke-through comes and goes with the pose, so put the avatar in the problem pose first (the opposite of Clothing Fit, which calculates in rest pose).
  • Body vertices with no clothing within Max Search Distance are treated as uncovered and skipped. If skin at necklines or cuffs is falsely flagged, lower it; if poke-through under thick clothing is missed, raise it.
  • Detection Threshold is a tolerance so faces that merely touch aren't flagged. If lots of tiny faces get selected like noise, raise it.
  • Fix what you find by inflating the clothing with Clothing Fit, or by trimming body faces with Hidden Mesh Removal.
  • Bodies using a shared mesh are rejected (sharing on the clothing side is fine).
Notes

Before you start

Please read this before using any tool that deletes data.

Save or duplicate before deleting

Always save your file or make a copy before running a delete operation. Deletions can be undone with Ctrl+Z, but that undo history is gone once you reopen the file or quit Blender.

Review visually before you delete

Hidden Mesh Removal and Unused Data Cleanup can remove faces or data that aren't visible now but may become visible later, through shape keys or outfit changes. Use the exclusion options and check the selection or scan results with your own eyes before deleting.

Unsupported setups stop before any change

When a tool detects something it can't handle safely, such as shared, linked or non-editable meshes or a modifier stack whose result can't be guaranteed, it stops before touching your data and tells you why. Clothing Fit and Armature Align also restore the previous state if they fail partway.

VRChat ranks are for reference only

The ranks in Stats / Pre-export Check are estimates based on VRChat's Avatar Performance Ranking System. Material slots are counted per slot, even when several slots share one material. VRChat may change its criteria, so check the official VRChat documentation for the latest values before making final decisions.

License

License

This add-on is released under the GNU General Public License v3.0 (GPLv3). A LICENSE file is included in the ZIP.

You're free to modify and redistribute the code under the terms of the GPLv3. Blender add-ons that use bpy must be under a GPL-compatible license.