top of page

Metahuman Animation Pipeline Tool

This project is a custom facial animation management tool for MetaHuman characters in Maya, built with Python and a Qt-based UI. The tool automatically scans MetaHuman facial controllers in the scene, generates a reusable control configuration, and exports per-frame animation data to JSON. At the same time, it captures a viewport screenshot and links it to each animation clip as a visual preview. On the import side, users can select an existing config and animation file to retarget the facial motion back onto a rig, with keyframes being rebuilt over the timeline. The goal of this tool is to simplify the process of testing, reusing and organizing facial animation, providing a more intuitive and efficient workflow for technical artists and animators.
Background
Software&Role
Software:
QtDesigner
PyCharm
Maya
Unreal Engine
Role:
Technical Artist: Tool
Date of completion: Nov 2025
UI Design - QtDesigner
Before building the interface, I sketched the basic user flow and split the tool into two clear stages: Export and Import.For the Export tab, I used a straightforward, single-column layout. At the top there are two path fields with browse buttons, corresponding directly to the core Python parameters: Generate Config and Export Animation Path. In the middle, I reserved a large QLabel as the Preview area to show the screenshot of the current animation. The Export button is placed alone at the bottom-right to act as the “end point” of the flow. I intentionally kept a lot of empty space so the sequence “choose paths → see preview → click Export” is visually obvious.
On the Import tab, the focus is on comparison and selection. In addition to the two path fields, I added three preview slots: three QLabel widgets for thumbnails and three QLineEdit widgets below them for file names. This creates a small “asset gallery” where the user can quickly compare multiple facial animation clips and decide which ones to import. The preview area sits in the center, with the Import button at the bottom, mirroring the layout logic of the Export tab to reduce learning cost.




PyCharm - Implementation
Scan_Controls
To implement exporting, importing and automatic screenshot capture, I split the logic into four modular scripts, each responsible for a single task and called from a central controller: Scan_Controls, Export_Animation, Screenshot, AnimationManager. The tool is built as a small, pipeline-oriented module set: one script to discover rig controls, one to bake animation, one to capture a visual preview, and one to drive the UI and call everything in order. By keeping each responsibility separated but well-connected through JSON files and clear function interfaces, the system stays easy to maintain, extend to other characters, and integrate into a larger Maya production workflow.

Gather Metahuman facial control name into a list
The later scanning logic does not hard-code any specific node names but relies on these patterns, which makes the script reusable across different characters and naming conventions.

Export_Controls


Pick the Playback Range
Using the current Maya playback range as the export interval. It also checks for end < start to prevent invalid or reversed frame ranges.

Collect All Controller Channel Value
The function initializes a global anim_data dictionary and then steps through the timeline frame by frame. The outer loop iterates over frames, while the inner loop iterates over controllers, matching the idea of “time driving multiple controls”.
PyCharm - Implementation
Screenshot
AnimationManager

Loads the .ui file created in Qt Designer via QUiLoader, utils connects all buttons, line edits, and preview widgets; on the Export tab it calls Scan_Controls and Export_Animation to export data and then Screenshot.render_png to create a thumbnail; on the Import tab it locates the corresponding PNG for the selected animation JSON and updates the three preview slots.













bottom of page