Script to convert shape key vertex animation frames into armature poses, with bones assigned per vertex

Summary

My current project requires the digital archival of vertex animation. I have exported the vertex animation frames in the Collada DAE format as shape keys, and imported that model into Blender.
For compatibility with other software, these shape keys must now be converted into armature poses, and afterwards exported from Blender in keyframed actions.

Goal

A pose library containing vertex animation frames stored in a “pseudo-armature” consisting of a bone for each vertex.

Theorised Work-flow

  • If no object is selected, select the first object with shape keys
  • For the selected object:
    • In the Shape Keys properties, disable “Relative” and “Always show the current Shape for this Object”, and enable “Apply shape keys in edit mode”.
    • Create a vertex group for each vertex.
    • In Edit mode, assign each vertex to its related vertex group.
    • Create an empty for each vertex, with the following properties:
      • Location, Scale: 0/0/0
      • Parent: Mesh (Vertex)
      • Size: 0
    • Create a bone for each vertex, with the following properties:
      • Head, Location, Scale: 0/0/0
      • Tail: 0/0/0.00001
      • Display: Hide
    • In the armature properties, set bone display mode to “Stick”.
    • In pose mode, apply a “Copy Location” constraint to each bone, targeting its related empty.
    • Parent mesh to armature deformation with empty groups.
    • For each shape key:
      • Enter Edit Mode.
      • Select the shape key twice to move mesh and armature location.
      • In Pose mode:
        • Select the armature’s bones.
        • Add a new armature pose.
    • Disable each bone constraint.
    • In the Shape Keys properties, disable “Apply shape keys in edit mode”.

Naming Conventions

  • Vertex Groups, Empties, Bones, Constraints
    “v” + padding (only if vertex number total is greater than 9, by character length of vertex number total) + vertex number

  • Armature
    object name + “_v”

  • Pose
    Selected shape key name

Example Project

Conclusion

Does a script or add-on like this exist? And if not, I hope to find assistance in creating one.

Thanks for reading.

Here is an example project that demonstrates the work-flow outlined.
Example Project (64.6 KB)