Portfolio - Technical Art

My technical art portfolio showcases tools that I developed for various game and animation productions to speed up the workflow in production and automate any redundant work.

I primarily work in Maya and Unreal Engine, some unpublished exploratory work is also under active development in Blender and Houdini.


Pipe Generator (Maya)

Developed for Moonshot Games - Unannounced Project

Pipe generator addresses the problem for hard surface modeling artists who need to create many pipe-like models for their work.

To do it manually, the artist would have to create a cross-section, and manually extrude segment by segment. These pipe-like structures usually have some contour nearby to follow, therefore, it is best to derive a pipe using edges on other mesh.

Pipe from Cross Section

This tool creates a pipe using a cross-section. The user first selects a pipe cross section in the UI, then selects a set of continuous edges to extrude along. The tool will then extrude a pipe using the cross-section without altering the original cross-section pattern.

Pipe from Edge

This tool can also automatically create circular pipes along selected edges. The user specifies the desired sides and radius of the pipe, selects the edges, and the tool automatically generates such a circular pipe. Alternatively, for faster iteration, the user can freely adjust these parameters without generating a new pipe as long as they don’t change their selection.

Match Normal (Maya)

Developed for Moonshot Games - Unannounced Project

Select a set of polygon components (which can be a mix of edges, vertices, or faces) and adjust the pivot of the object so that these components belong to the average normal of all the components. For example, when selecting a ramp face on this object and applying this tool, the pivot is then updated to the normal direction of the face. This tool is frequently used by 3D artists to manipulate objects more efficiently in 3D space.

Gear Creator (Maya)

Developed for Xwift

Create a gear based on given amount of teeth using a simple GUI.

Random Mesh Generator (Maya)

Developed for Xwift

Randomly fill a space of certain dimension with user-specified mesh. I even developed a GUI for it.

Of course, you can generate all the primitives, it is a lot of chaos, but also a lot of fun.

Does not have practical use in production, usually used as a pressure test to see to what extent it will break Maya or the tool I am developing.


Pipe UV (Maya)

Developed for Moonshot Games - Unannounced Project

Single Seam & General Use

Pipe UV automatically unwraps a pipe or a segment of a pipe onto a pipe texture sheet, where ten different pipe textures span a specific V value range in the UV space. The artist only needs to select a seam (that is, a set of continuous edges) on the pipe, specify the index of which pipe texture they want to unwrap to, and Pipe UV automatically unwraps the pipe (or pipe segment) into the designated V range.

Multiple Seams

Pipe UV can unwrap along multiple seams on the same pipe, effectively separating the pipe into multiple UV shells that span the same V range. This is an instrumental technique for artists to add details to larger pipes by overlapping UV shells.

Auto-save user preferences

PipeUV automatically saves the user’s preferences for the V values, so the changes made by the user will be remembered even after the user restarts Maya. It also offers an easy way to import and export default V values, allowing the artist to quickly switch between templates if needed.

Match UV Shell (Maya)

Developed for Moonshot Games - Unannounced Project

Match UV Shell helps match the UVs on two similar but not perfectly matching shells to form a precise match, allowing the artist to overlap UV shells without causing seams or visual artifacts. It will intelligently match only the parts of the UV shell that are overlapping, and does not deform any part that is unique to one shell or the other. For example, the upper part of the larger shell in this demo was not manipulated, but the lower part matched perfectly with the smaller shell.


Decal Manager (Maya)

Developed for Moonshot Games - Unannounced Project

Place Decal

Decal Manager is an improved automatic decal workflow that helps 3D artists place decal planes precisely onto objects. Oftentimes it is very difficult for 3D artists to place decals with the correct rotation, not to mention on a mass scale. Place Decal allows the user to select a face that the decal will adhere to, then place the decal plane perfectly flat on the face. The tool also allows the user to place many decals using different scales, and the scaling factor can either be adjusted universally or by axis.

Adhere Decal

Adhere Decal is a very easy tool for the user to deform any decal plane using the object’s geometry. It will then raise the decal plane a very minimal amount of y-displacement to avoid clipping into the mesh. The user can simply select the object, then select all the decals that they want to adhere to, and press the button. For the artist’s convenience, Adhere Decal was also made into a shelf button.

Duplicate Hypershade Shading Group (Maya)

Developed for Moonshot Games - Unannounced Project

Duplicate Shading Group addresses an issue: when selecting a material in Maya’s HyperShade window and “duplicate shading network”, it does not duplicate the connected shading group of the material. Duplicate Shading Group adds a “Duplicate” button in the marking menu of HyperShade and will copy the connected shading group when the user selects the material.


Ice-like Shader (Unreal Engine)

Developed for Moonshot Games - Unannounced Project

An ice-like shader with adjustable snow and glitter on the top. Some parts are blurred intentionally to avoid leaking confidential contents.

Textures by Philip Klevestav.


Xwift Auto Reload (Maya)

Developed for Xwift

Automatic toolkit deployment framework that re-deploys and reloads all the code in a repository to MAYA_SCRIPT_PATH.

It does so in two steps:

  1. Copy the repository from development path and overwrite the older code repo in the MAYA_SCRIPT_PATH.
  2. Parse all the script files under MAYA_SCRIPT_PATH and automatically reload all the scripts.

Essentially, this automates the need for the user to manually reload updated code in the script editor. This also gives the user freedom to develop in a version controlled environment, and not have to store their code in MAYA_SCRIPT_PATH.

Xwift Asset Manager (Maya)

Developed for Xwift

A simple asset manager that can save the user’s selection into a library and easily import into other scenes in Maya.

It creates a local library folder in the user’s computer, and uses JSON to log any properties of the asset.

UI Asset Manager UI

We can hit import and import a simple ball that I saved before.

The tool will save your selection in the scene, if nothing is selected, it will save the entire scene as one asset.

Import Ball Import Ball

Of course, we can import a lot of balls that I saved before. Asset manager can easily take care of more complex stuff.

Import Ball Import Balls

The entire library is saved in a folder in the user’s local drive, and can be easily migrated to other computers.

File Hierarchy File Hierarchy

All the properties about the asset are saved in their corresponding json file. More properties and custom properties can be easily passed into the asset manager by adding a new argument.


Xwift Shelf (Maya)

Developed for Xwift

A Python 3 Maya shelf that supports sub-items, labels, and custom icons. It is a modified and improved version of Bindpose’s Maya Shelf, but integrated with auto reload for a seamless toolkit deployment system.

Xwift Shelf is currently open source, download and documentations are available at: xwift.hongjunwu.com.

Xwift Shelf Xwift Shelf

Xwift Save-it! (Maya)

Developed for the production of Dazzle! at University of Washington Animation Research Labs

Modified from a legacy implementation of the tool, Save-it! is a simple tool that saves the current scene into a folder that is automatically versioned and logged.

By plugging in the playblast tool API, the user can do the following in one button press:

  1. Save the iteration of the Maya Scene.
  2. Playblast the animation into AVI, with one version that has padding and one that only has the frames in active timeline.
  3. Automatically transcode the AVI playblast into MP4.

Because the resulted MP4 video files are so much smaller (up to 100x comparing to uncompressed AVI), keeping a lot of iteration history hardly takes any storage space.


Zoetrope (Maya)

Developed for the production of Dazzle! at University of Washington Animation Research Labs

A workaround to make Maya 2017 render Arnold when connected remotely.

Maya 2017 is not properly optimized for remote rendering work and often miss referencing when sent to a renderfarm when using a remote computer.

This workaround uses command line to force Arnold to render a frame using CPU, which works around the renderfarm problem.

Maya 2020 has fixed this problem for remote rendering, but we used this tool in a Maya 2017 film production to ensure our shots gets rendered properly.


Playblast Pro (Maya)

Developed for the production of Dazzle! at University of Washington Animation Research Labs

Automatically playblast the animation in the scene while adding the following features to improve the pipeline:

  1. Playblast in full resolution (Default 1080P)
  2. Hide all the controllers and rigging related elements in the viewport.
  3. Stamp the frame number, date, and scene name onto the video for easier reference.
  4. Additionally, it can be called by Save-it! using API to stamp the version number onto the video.
  5. Transcode the uncompressed AVI video to MP4 using FFMPEG to reduce the size by up to 100x.

Animation Tweener (Maya)

Developed for Xwift

A simple animation tweener that will tween the selected keys in the graph editor by a certain amount using a slider.

Animation Tweener Animation Tweener

Fix Broken NURBS (Maya)

Developed for the production of Dazzle! at University of Washington Animation Research Labs

In our production we used NURBS surfaces instead of NURBS curves to make our rig controllers so it would be easier for animators to select the controls they want.

However, sometimes the surfaces are not properly refreshed and appears broken. This is a tool to fix this issue.


Light Manager (Maya)

Developed for Xwift

A simple light manager with GUI that allows the user to create and turn on/off different types of lights in the scene.

Create Light Create Light

It can also manage lights in the scene, and turn on/off the lights using a tick of a box!

Manage Light Manage Light