Wednesday, December 3, 2025

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, too. This has consistently been the hardest part of the process.
Finally, I updated the heartbeat sound effect. This week was mostly about quality assurance, and fortunately there was not a lot left to do!

Thursday, November 13, 2025

Common Art Interactive Experience Stage 4 - First Bake - 'B' Stage

This week, I was mostly focused on creating a polished experience. First, I added a menu, with some pre-selection animation for the menu items and a fade-in/fade-out effect.
I updated the blueprints in the game to work with controllers, and set up the Sneak animation for the killer.
Finally, I made an ending sequence after the killer hides the old man's body.
I also added a lot of sound effects - the menu sounds, the updated footstep sounds for the sneak animation, the impact sound during the murder, the murmurs of the old man, the maniacal laugh of the killer, the schizophrenic voices in his head, probably a few more. Overall, this week was a lot easier than prior weeks and all I really needed to do was look for areas to improve things. Oh, and I touched up the lighting a little. I will focus more attention on the lighting next week since the menu and sounds are now working. Here is a video of the current state of the game, make sure to turn sound ON to hear the new audio!

Thursday, November 6, 2025

Week 11 - High Res Meshing - 'C' Stage

This week my responsibility was to level up the lighting and work on the audio some.
I completely re-did the lighting this week. I aimed for much more nuance, better contrast, and more distinct color zones. I think the work really paid off and gave Richard's awesome shaders a chance to shine. I even added a flicker effect to sell the dark, moody amosphere. With the sounds and effects Richard added, it really feels good.
In order to achieve this, I had to overhaul my lighting tool again - now it has the ability to choose the type of light, to place any number of lights along the cylinder, and to control all kinds of light settings. For example, the light intensity is now set with Candela units, and there is a way to control attenuation radius and shadow hardness.
In addition to the lighting, I updated the rigs to prevent the flipping that was happening in the head earlier. It turns out, Maya doesn't do the math the way I thought it did... and I have no idea why it defaults to doing it wrong! I just had to set the interpolation type on the Parent Constraint to "shortest" and it worked as expected. Most of my work on the rig is not visible, since I spent a bunch of time improving the code and updating the generator with the ability to color the controls. This was a lot of work, but it isn't visible in the engine.
Finally, I worked on adding some sound to the game: the rain sounds, footsteps, creepy horror sting, and heartbeat effect. Richard added the hum of the lights and the flickering noise.

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.


Here are some of the custom shelf tools I made.

"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

 


My first attempt - I didn't realize the printer was using regular paper this time.

















Some photos of the screen during the print process.























Here is the layout in the Cricut Maker program.









Some photos of the process - this time with the right paper. Thanks for the extra paper, Mark!



Left one on Nitin's desk.



And one at the door to Cheryl's office. 





















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.

Here is how it looks in Substance Painter. 



And here it is in Unreal.














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...