Kevin Chang - Portfolio

Coding Project - Gravity



Worked with a team as a member of the Student Game Developers at UVA to create PC game 'Gravity' in OpenGL and C++. Similar to a 2D version of Mario Galaxy, where the player is subjected to various gravity fields, from gravity wells that pull characters in, mouse clicks that provide a local gravity push, and levels that have varying strenghts and directions of gravity. We even had a sound guy create custom technosonic music for the game.  [Gravity.zip]


Physically Based Animation Project - Fluid Simulation



Smoke Simulation (C++, openGL) - Made a fluid simulation project that simulates smoke using the Incompressible Navier-Stokes equations. The smoke uses a staggered 3D Mac grid for the advection step for velocity, density, and temperature, and solves it using a semi-lagrangian approach. Uses the conjugate gradient algorithm to solve the system of linear equations for the smoke pressure step. Also includes buoyancy forces so smoke travels up when it is warmer and falls down when it is colder or more dense. Finall, vorticity confinement is included to help with the averaging which causes the smoke to lose its swirling effects. Finally an object is placed in the volume to interact with the smoke, in this case a mini ceiling below the top of the smoke volume.

Additional Features / Optimizations - The fluid solver utilizes the main diagonal preconditioner to help speed up the pressure solve step of the simulation. The smoke is rendered using a basic openGL window with the density value used for the alpha value of the smoke grid. The user can use the mouse to move the interactive emitter located at the bottom of the volume, and use keyboard inputs to emit smoke, temperature, and velocity upwards in the volume.




Video Demo - Here is a video demo of the fluid solver as presented in the CIS 563 - Physically Based Animation course I took in the Spring 2009 semester at Penn.


Physically Based Animation Project - Cloth Simulation



Physically Based Clothing Simulation (C++, openGL) - Created a cloth simulation project that used three different integration methods: Euler, Midpoint, and Runge-Kutta. The person was modeled using cylinders so intersections could be handled using particle-cylinder intersection tests. The tests track for cloth "collisions" where the particles are close to the cylinder as well as penetration, for when the cloth enters a cylinder as a result of the integration timestep being too large. When colliding, the particles are given a repulsion force so the particle will be kicked out, and penetrations are handled by moving the particle back out of the cylinder and applying similar repulsion forces.

Spring Network - The cloth uses a network of bend springs, shear springs, and stretch springs. These help to give it the look and "bounce" of real clothing, and adjustments to the springs can lead to different types of fabric.



Coding Project - Thornton Hall 3D Tour



Created a 3D tour of the inside of Thornton Hall, the main building of the engineering school at UVA, in a team of three using openGL in C++. Camera behaves like the free-look camera used in Counter-Strike.





























Animation Project - Behavioral Animation



Group / Individual Behavior (C++, openGL) - Implemented the individual and group behavioral animation for vehicle-like walking agents. The individual agent behaviors are seek, flee, arrival, departure, avoid, and wander. Seek, flee, arrival, and departure are all based on a goal position as specified by the user. Avoid creates objects on screen that the agent will avoid when it senses a possible collision. Wander generates a random direction vector that the agent follows.

Group behaviors include separation, alignment, cohesion, flocking, and follow the leader. All of these behaviors are determined by whether other agents and objects are within a neighborhood radius.

























Graphics Project - Room Editor & Raytracer



Scene Graph (C++, openGL) - Created a scene graph room editor that can create various objects for the room, including a desk, chair, floor lamp, file cabinet, and computer monitor. Nodes store all of the object's information including object type, rotation, translation, scale, and whether it is the currently selected node. Can also load in .obj files and specific "extrude" and "surface revolution" files. The scene graph can select, add, delete, and clone nodes and their children. Selecting is done in prefix order, with the root node being the "room" (walls and floor). A demo of the room editor is available here: [Scene_Graph.zip]

Camera - Uses a free moving camera similar to those found in most first person shooters to fly around the scene.

Lighting - Uses a point light that can be moved around the scene.

Texturing - Textured the floor and computer monitor using SOIL (Simple openGL Image Library) including mipmapping of the textures.

Raycasting / Raytracing - Can raytrace the current scene and generate a bmp output image. Raytracing features for the objects include an additional point light for multiple shadows, object transparency, reflections, and refractions. Uses bounding boxes around the objects to speed up raytracing.

     

Animation Project - Particle System



Fireworks / Sparks Particle System (C++, openGL) - Implemented a fireworks particle system which uses the Euler integration method for calculating velocity and position. Upon reaching the maximum height, the fireworks explode and fire out rings of spark particles. The sparks have a preset life value and bounce off the ground upon impact.

























Animation Project - BVH Player



Character Animation (C++, openGL) - Programmed a BVH Player application that animates a character using forward kinematics. Can also move joints using inverse kinematics using quaternion and Euler angle representations for calculations. Application plays animations using keyframed interpolation and can blend between two separate animations.

























Animation Project - Curve Editor



Curve Editor (C++) - Implemented a curve editor for B-Splines, Hermite Curves, and Bezier Curves in C++. Can show or hide control points for each curve as well as edit and drag interpolated points. [Curve.zip]





























Animation Project - Walk Cycle



Walk Cycle - Created a walk cycle animation for a character using MotionBuilder. Set up four poses for each step, including a strike, cross, lift, and plant step pose. Created an animation consisting of three complete walk cycles with a time shift in the second cycle, which you can see here.[Walk.avi]. Also blended two preset animations together so that it transitions from animation one to animation two without any pops. [Blending.avi]
























Other Projects


Pacman Wars (Python, Pygame) - Wrote a Space Invaders type game with Pacman characters and the mighty red ghost as the hero using Pygame Sprites in Python. Exported as a windows .exe using Py2exe. [Pacman_Wars.zip]








Raytracer - Implemented a raytracer with a partner that included spot, point, and directional lights, shadows, transparency, and reflections.







Non-Photorealistic Rendering (C++, openGL) - Added silhouette outline and texture to create non-photorealistic "cartoon" rendering effect.  [NPR.zip]







Rubik's Cube (C++, openGL) - Implemented a Rubik's Cube with user selected N x N x N dicing, user controlled moves, cube scramble, auto-solve, and save and load functions.  [Rubiks_Cube.zip]







Tank Game (C++, openGL) - Created a multiplayer tank shooter game with rotating turret, bullets and bullet collisions, and first-person, third-person, and level overview camera angles.  [Tank.zip]







Contact Information