SkillAgentSearch skills...

Skinner

Skin export / import tools for Autodesk Maya

Install / Use

/learn @AKEric/Skinner

README

Table Of Contents

Overview

Skinner is a tool for Autodesk Maya designed to make "exporting and importing skin weights on polygonal mesh fast, easy, and full featured". Having both a consumer-facing UI and scriptable API, it can be fully integrated into a professional production pipeline regardless of industry.

At high level, the Skinner tool works by exporting & importing SkinChunk data, discussed below.

Donate For Usage

As of Feb 2023, Skinner has been open sourced. But the developer would still appreicate any donations you'd like to provide!

Two options:

  • https://paypal.me/akpavey
  • https://www.buymeacoffee.com/akeric

Suggested donation rate:

  • Student / Hobbyist / Indy dev : Free! (but if you want to donate, I won't turn you down)
  • Any other production : $25 a user.

Disclaimers

By using/installing Skinner you're accepting all repsonsibilities for its usage, and release me from all liability: See the License.

I have a full time job, this is a side project: I will attempt to address all issues outside of work hours to the best of my abilities.

Export Features

  • Can export based on any combination of mesh/joint/vert/transform selection : It’s all converted into per-mesh SkinChunk instances for storage.
  • Can export as many mesh/verts (as SkinChunk data) to a single .sknr file as needed.
  • Exports both the current worldspace positions/normals for the provided SkinChunk verts, and (as of 1.1.0) the pre-deformed positions/normals (via intermediatObject query). This allows the export to be done without needing to set the asset to the bindpose.
  • Can ‘set to bindpose’ before export, or not. Generally not needed, but optional.

Import Features

  • Can import from multiple .sknr files at the same time & merge the data: If there is same-named SkinChunk data in multiple .sknr files, the ones saved 'most recently' win the merge.
  • Can import onto any combination of mesh/joints/vert/transform selection. They’re all converted into mesh:vert chunks for import.
  • Robust logic tree when importing: If the tool can't load in weights based on 1:1 'vert count/vert order' (100% matching topology), it will 'fall back' to an algorithm of your choice to do the work, referred to as the ‘Fallback Skinning Method’ (FSM): It can either be ‘Closest Neighbors’ (a custom algorithm designed for this system, discussed below) or a more basic ‘Closest Point’. Via the API (discussed below), you can even add your own custom 'closest point' function these call on.
  • Options to build missing influences (joints), parenting them into existing hierarchies with parent-matched names, or build the joint hierarchy from scratch preserving the original transformational values / attrs / rotate order.
  • Can either set to bindpose & unbind pre-existing skinning first, or append to the current skinning (in any pose) on import (see next bullet).
  • Option to 'Import Using Pre-Deformed Shape Positions: This allows for skinning to be loaded onto an asset that is in some deformed pose, without needing to set it to bindpose first. But there is an option to 'Set To Bindpose' if desired, but generally isn't needed.
  • Can import weights applying a ‘vert normal filter’ that aids in keeping ‘stretching’ verts at bay if there was overlapping mesh during export.
  • High level import logic path, regardless if you’re importing onto multiple mesh, or some vertex selection:
    • Does a leaf mesh name match a SkinChunk name?
      • Yes
        • Does the SkinChunk only have a single influence joint?
          • Yes : Skin to that one joint 100%
          • No
            • Does it have the same vert count/order as the mesh?
              • Yes : Import by 1:1 vert IDs
              • No : Use that SkinChunk’s point cloud and import by the ‘FSM’.
      • No
        • Can a single SkinChunk be found with the same vert count/order as the mesh? (presuming this option is set)
          • Yes : Import by 1:1 vert IDs.
          • No : Generate the UberChunk, using its point cloud, import by the ‘FSM’.

Other Features

  • Supports duplicate mesh names in the Maya scene during import (the tool converts everything to long/absolute paths for import purposes).
  • Supports duplicate mesh names in the Maya scene during export, but a .sknr file can't store data for mesh with duplicate names (but you could store different .sknr files for each).
  • Supports Maya’s linear, dual-quat, and weight-blended 'Skinning Methods': What state its in during export will be the state applied during import.
  • Not so much a feature, but an FYI: Skinner only suppots skinCluster node's who's 'Normalize Weights' value is set to 'Interactive' (1): It does not support 'None' (0), or 'Post' (2). If Skinner encounters such a non-conforming skinCluster, it'll prompt the user to 'auto-convert' it to 'interactive' before the operation is done (v1.0.14). If the user cancels, no work is done. Basically: skinCluster.normalizeWeights = 1.
  • Not UV dependent (other skin tools on the market operate on UVs).
  • Full featured backend API (fully docstringed with Py3 type hint notation) ready to be plugged into your pipeline code.
  • Verbose and robust results printed to the Script Editor / returned by the API for your own pipeline’s consumption.
  • Full integration into your teams version control software.
  • Introspection/printing of data in the custom .sknr file format (binary pickled Python data).
  • Automated debug test suite you can run to confirm everything is working.
  • Speed : Based on testing/profilling against Maya’s Deformer Weights system, while it appears to export at roughly the same speed, it can be up to 5-10x faster on import, and provides substantially more options / ease of use.
  • Verbose docstrings for all classes, methods, and functions, to be used with Pythons help function.

Usage Examples

  • Integrate into a rebuildable asset pipeline:
    • After skinning is performed on your 'SkeletalMesh'/'DeformedMesh' scene, export that Skinner data to disk.
    • Update mesh poly counts, names, etc in your ‘StaticMesh’ scene.
    • Via your pipeline code, When you regenerate your SkekeletalMesh from the StaticMesh, the Skinner tool handles all the mesh name changes, etc, loading weights onto matching mesh names where it can, and interpolating weights for new mesh / renamed mesh.
  • You have good arm skinning in sceneA, and want to copy it to only a section of an arm in sceneB:
    • In sceneA, select just the verts you want to copy the skinning data on (could be on multiple mesh), and ‘export temp’.
    • In sceneB, select just the verts you want to copy the skinning data on (could be multiple mesh), and ‘import temp’.
  • You want to copy skinning off sceneA to sceneB, but you know that sceneA has many joints that sceneB doesn’t:
    • That’s ok, just make sure you have ‘build missing influences’ checked during import, and the missing joints will be created/parented into the hierarchy for you.
  • You’re copying skinning from one pair of ‘skinny jeans’ to a pair of ‘MC-hammer pants’: After you do, you transform the hip joints, and there are many ‘stretching verts’ between the legs, where the parachute-pants overlap. No problem, reimport with the ‘Vert Normal Filter’ enabled to resolve this.
  • You want to copy the weights between two mesh, that are the same topology, but different names, no problem: Make sure “Load by vert count/order” is checked, and it’ll transfer the weights 1:1.
  • You can generate a ‘weight depot’ on a server: Update your Skinner export pipeline code to export a .sknr file per mesh to the server, with the filename * <leafMeshName>_<vertCount>.sknr during export. You’ve authored custom wrapper import code that for each mesh, see if it can find a name match in the .sknr files : If it does, load that data. If it doesn’t, find all the vertCount matches : For those matches, check and see if the vert order matches, and if so, load that data, regardless of name mismatch.
  • Something it doesn’t do? Let me know for improvement.

Why this tool

Having built holistic art -> engine pipelines for multiple studios (Visceral/EA, Sledgehammer Games/Activision, 31st Union/2K), part of which include fully procedural rigging solutions and rebuildable static mesh -> skeletal/deformed mesh pipeilnes, one of the biggest areas that is missing in that rebuildable-asset pipeline-subset is a solid/repeat

View on GitHub
GitHub Stars203
CategoryDevelopment
Updated22h ago
Forks28

Languages

Python

Security Score

85/100

Audited on Mar 19, 2026

No findings