Wednesday, December 3, 2025
Common Art Interactive Experience A Stage
Thursday, November 13, 2025
Common Art Interactive Experience Stage 4 - First Bake - 'B' Stage
Thursday, November 6, 2025
Week 11 - High Res Meshing - 'C' Stage
Thursday, October 30, 2025
Week 10 - Protomeshing - 'D' Stage
This week was a very busy one. I barely slept! But I got a lot done.
My first task was to build a quality rig for the animators - a rig I could easily update and fix and iterate on. In order to accomplish this task, I turned to Python. Here is a screenshot of my VSCodium workspace.
I'm dividing my work into two Python modules, ns_maya_utils and basic_autorig. ns_maya_utils is a collection of rigging tools and utilities, and the math helper functions that make it possible. The math functions are implemented in fast and portable NumPy, because I need to learn NumPy and this seemed like a good time to start.
| 1590 lines of Python |
The rigging script is written in the Maya cmds Python API, based on my own original design. It consists of an IK/FK switching limb, used by the arms and legs, an IK foot, an FK Hand with Curl Assist, a simple Neck/Head FK control, and a novel implementation of the classic Ribbon Spline IK spine rig .
| Generating the rig. This gif is not sped up. |
Generating the rig takes less than a second. It uses the widgets and meta-rig objects in the file as input and generates a complete control rig as output. The control rig and the deform rig are separated so it can export cleanly to the game engine.
The rig's IK foot features an intuitive heel roll control and a switch to enter FK mode. It has a pole-vector controller to set the knee direction.
The hands feature an auto-curl feature for easier posing.
The rig is stable in extreme poses and resists flipping even when turned around and on its side.
Here is an isolated view of the spine rig. I present a novel approach to the Ribbon Spline torso rig. If you look closely, you'll notice there is no ribbon! Instead, I use two identical NURBS curves, offset slightly on the X axis and hooked to the same cluster deform nodes. Because they always move together, they produce the same overall shape as a ribbon - without the overhead of calculating the spans, or the UVs, or the follicle positions on the ribbon. There is no risk of a rig component poking out of the mesh and getting rendered on accident. Instead, I use only two curves and a clever series of nodes.
In Maya's node editor, you can see the method behind my madness. First, I take the position, and tangent from each curve with a pointOnCurveInfo node. Using the positions from each curve, I calculate the normal. Taking the cross product of the tangent and normal gets me the binormal vector. Together, these three vectors make up an orthonormal basis matrix - just the thing to plug into the Offset Parent Matrix of this transform node (which has been set to not inherit transform). This lifts the curve's transformations into a simple node that I can use for constraints. The joints are parent-constrained to these curve-pin transform nodes. Easy!
My goal was to work on the rig for three days, from Saturday to Monday. In the end, it took four days - from Sunday to Wednesday. I didn't get it to my animators as fast as I wanted, and I didn't have time to fill out all the features or test it extensively -- but because I have a solid foundation, I can easily iterate through different versions of the rig.
My second task this week was to update the lighting in the level. This proved very challenging, because there were a lot of mesh light cylinders in the scene from the level designer's blockout. Because I already had a lot of light cylinders in the scene, I decided to use Blueprints to build a tool to take advantage of them. My tool places lights on the cylinders and creates a control to direct them. It is easy to art direct and modify.
The tool was made with these blueprints (arranged in a sequence):
I won't go into the tiny details, but the overall idea of the construction script here is to take the bounding box of the blockout light and use it to transform and place a nicer light object that uses proper Unreal light objects instead of mesh lighting.
I was having a lot of trouble getting the RectLight to point at the controller using the Look At Function node, so I ended up building my own constraint with vector nodes. Look familiar?
Just as in the Maya rig, I took the displacement between two points, crossed it with a known orthogonal vector, and used the normalized displacement, known orthogonal vector, and cross product to construct an orthonormal basis matrix (Unreal unhelpfully and very confusingly calls it a "rotator" instead of a basis).
Here is the result in the level:
Thursday, October 23, 2025
Week 09 - Initial Block Out - 'F' Stage
This week, I was responsible for preparing the block-out mesh for basic animation. Once I received the is mesh, I used a default mocap skeleton as a base and placed the joints in the model by hand. During the process of placing the joints, I wrote some Python scripts in Maya to help me orient the joints and copy the transforms of the joints on the left to the joints on the right. Finally, I brought the model into Unreal engine and set up an IK retargeting system to place the character in the game using an adapted version of the default Quinn character's animation blueprint and transferred animations.
Here is the character skinning in Maya.
"Select" is merely a hierarchy selection tool, because it is tedious to go into the menu each time. The Orient tool orients the joints and automatically detects end-joints and orients them correctly to their parents. The Symmety tool enforces symmetry on joints by copying the matrix from the left joint, finding the right joint, and scaling the left joint's matrix by -1 on the X axis in order to create mirrored transforms. The Mirror tool is the same, except it creates the joints, too, setting the parents correctly in symmetry. FInally, the Reload tool forces Maya to read my Python module again. It assists me in developing my tools in a standalone way that is portable and easy to update.
Here are the tools in action. It gives the user a text box input for the Left and Right ID's and a choice between X, Y, or Z axis for symmetry.
Some screenshots from my VSCodium project. On the left is code for the UI, and on the right is code that the UI tool calls to do the rigging tasks.
Here it is in Perforce at //CLASSES/Cohort22/Classes/Art/CommonArt/Semester_01/InteractiveExperience/TellTaleHeart/Source/Characters/Killer/killer.fbx
Here is the Killer blockout character in the game environment.
Wednesday, October 8, 2025
Week 7: Make it Stick
Here is the layout in the Cricut Maker program.
And one for Nick.
And the last one is mine!
Monday, October 6, 2025
Week 7 Crate Textures
Doing a projection painting in Substance Painter to make up for my lack of sculpted shapes...
It looks like this.
Common Art Interactive Experience A Stage
This week I created a new material for the TV screens. I updated the skinning for the characters. I put a lot of work into the lighting, t...
-
This week was a very busy one. I barely slept! But I got a lot done. My first task was to build a quality rig for the animators - a rig I c...
-
Here is the finished illustration. I wanted to have a circular composition for this one, with the eyes radiating out of the image from the ...
-
The illustration looks like this in isolation... I think the colors are bad in the Photoshop file but I don't know why. Well, I am at a ...







