top of page

COMPUTER ANIMATION PROJECTS

Mass-Spring Collision System

jello_eZXB9kOFQT.png
jello_4EKGSQsDjR.png

Tech: C++

I wrote collision management and mesh deformation systems to simulate the movement of a jello cube in space. The cube is moved by a user-specified force-field, and deforms when it hits a surface.

- Technical Details Below -

The cube simulates a mass-spring system, with each uniformly distributed vertex an infinitesimal mass connected to other masses by a set of springs. Springs along edges give the cube its natural shape, while springs connecting points at diagonal angles resist extreme shearing and distortion, and springs spanning two edges each resist extreme folding. Internal Hooke's law forces are calculated based on these springs, which give the cube its elasticity and ability to deform.

Collisions with the box walls are detected with standard AABB vertex collision checks. When a vertex has escaped, it's pulled back by a spring via the penalty method.

Internal spring forces, external force field forces, and penalty forces are used to calculate acceleration at a given time step. This program supports using either forward Euler or RK4 to calculate position at a given time step.

Joint Keyframe Interpolation

mocapPlayer_bqF5COUKwy.png
mocapPlayer_D9sbRXUIcs.png

Tech: C++, CMU Motion Capture Database

I wrote a keyframe interpolator for joint angles in 3D animation.

The program reads complete motion-captured animations from CMU's motion-capture database. Based on a user-specified parameter, it drops a certain number of frames from the animation. Joint angles from missing frames are then interpolated between the two nearest "key frames".

Two demo videos are linked above, showing a number of interpolation methods. In each, the green skeleton uses the original, unaltered motion, while red uses interpolated frames. 20 interpolated frames are present for every pair of keyframes.

- Technical Details below -

CMU motion capture data specifies joint angles with XYZ Euler angles. The crudest form of interpolation this supports is just linearly interpolating between the Euler angles in the neighboring key frames.

Euler angles can also be converted to quaternions, which can be spherically linearly interpolated for smoother angular motion.

Both Euler angles and quaternions can be interpolated using Bezier curves. For any pair of neighboring keyframes, a Bezier curve that smoothly transitions from one to the other is formed. The control points of this curve are placed with the next curve in mind, ensuring that transitions around keyframes are smooth.

Inverse Kinematics System

IK_fAgiUeCCSU.png
IK_dRGBJ78a0R.png

Tech: C++, Eigen, ADOL-C

I wrote an inverse kinematics system that updates both the rig and the skin of an arbitrary model when an IK handle is moved.When a handle is moved, other parts of the body are moved in anatomically correct fashion, automatically.

- Technical Details Below -

Updating of the rig is as follows. A computational forward kinematics function is defined in the code. This function calculates a transformation matrix for every joint on the given frame, and uses them to update the IK handle positions accordingly. This function is automatically differentiated using ADOL-C. The resulting Jacobian is used to solve the Tikhonov regularized inverse kinematics function for the resulting angle change in each joint. Non-handle joints are then updated accordingly.

The skin is updated using linear blend skinning. The FK function is used to calculate transformation matrices for all joints on the given frame. Each vertex has a transformation matrix calculated, the linear blend of matrices from all joints that affect it weighted appropriately.

Game Engine Systems

CharacterControl-win32d3d9_9PDkps9suK.png

Role: Physics, AI, & Graphics Programmer

Tech: C++, Direct3D, Maya, Python, HLSL

I created a suite of systems for the PrimeEngine, a C++ based game engine. This engine was originally developed by Artem Kovalovs, a principal programmer at Naughty Dog.

My additions include graphical optimization, physics collisions, low-level mesh modification, and AI pathfinding.

While the engine previously supported basic rendering and animation, these additions are wholly original, written by me directly into the engine's core code.

CharacterControl-win32d3d9_hWMXVmsaQ5.gif

Rendering Engine

sphere.png
firefox_wL2pZEZBRt.png

Role: Graphics Programmer, Web Programmer

Tech: JavaScript, WebGL, GLSL

I developed an online low-level rendering engine in WebGL.

It supports UV mapped textures, dynamic phong shading, and free camera movement.

I wrote the entire program, including all shaders, core engine code, and web page integration.

© 2024 by Aaron Gormley

bottom of page