Well, if you've come here you should already know that my name is Steven Leigh, and I'm a programmer.
I finished my double degree in IT and Mathematics on the 21st of June. My GPA was:
My main passion in programming is 3D Graphics and/or real time simulation. In recent months, I've been spending all day working at Sauce Software as the lead web developer, and then coming home and spending 6hrs programming and learning about graphics before eventually dragging myself to bed.
I've worked as a web developer at Sauce for 18 months, 6 of those as the lead developer. Working at Sauce has allowed me to gain significant skills in managing projects and making decisions which affect the running of over 100 client companies. I've also defined some project processes that are now being used for new projects.
Most of my professional experience has been based in the web industry, though in 2005-2006, I worked for a year as an application developer for Dialog, where I helped support, maintain and developer a HR Application called "AXiOM". This was a part of QUT's "Cooperative Education" program, and lasted 12 months.
While these professional jobs were very helpful and interesting, my main passion has been the programming I do at home in my spare time. These are available for perusal by clicking the links at the top of the page.
In Semester 1, 2008 I completed a Real-Time 3D Fluid simulation, which solves the Navier-Stokes equations in real time. The project was implemented in C++, OpenGL and Cg. It simulates the fluid or gas entirely on the GPU, which is fast enough to be used inside a game.
On the right are a few videos showcasing the end results of this simulation. It could be inserted as a node in a scene graph quite easily, with minimal recoding required.
The smoke is rendered using a simple raycasting technique. It will only perform the raycast on visible portions of the fluid volume, and the fluid blends in appropriately with its surroundings.
Small steps have been made in making in react to light properly, though this is currently limited to a directional light.
These videos are also available at http://au.youtube.com/xwipeoutx85.
If the videos on the right do not capture your attention enough, click here.
Controls
Space: switch between camera mode and inject mode Q: Quit G: Perturb to a circular vortex G: Inject Gridded Ink [ and ]: Change X Size ; and ': Change Y Size . and /: Change Z Size (inject mode) Click+Drag: inject smoke (colour depends on button pressed) (camera mode) WASD + Mouse: Move around
Note: This is still in development
This started off as my first dabbling in DirectX programming. I started with a few tutorials to learn the basics, then went on to develop a simple and easy to manage game engine from that.
However, as things always seem to when dabbling, it grew and grew. As I went, I refined and refactored clunky pieces of code and decided to make a goal of creating a 3 dimensional version of Arcade Volleyball
The prime purpose of the game was to provide a showcase of skills that I have developed, and also my capacity for learning - most of the techniques employed here have been gleaned from reading journal papers, and going through tutorials - reworking them to work properly within the game engine.
A scene graph is used to organise the objects in the scene. It is completely heirarchical, and objects can be added and removed from the graph quickly and easily.
The scene graph is capable of loading in models in both .x format (using DirectX native functions) and .3ds format (using a custom developed file parser). These readers preserve material properties and groups. The skeleton and the walls are both in .3ds format. The Monkey head representing the light is in .x format.
All lighting in the scene is per-pixel, using the Blinn-Phong model. This takes material properties, lighting and camera/model/light positions to calculate the ambient, diffuse and specular light values for the surface. The ball in this demo uses Blinn-Phong lighting.
Objects can have normal maps applied to them, which replaces the supplied normals of the mesh, allowing higher detail for objects with little extra calculations, and less polygons. The walla, ceiling and floor in this demo uses normal mapping techniques.
Anisotropic lighting has also been implemented. This uses a diffuse and specular map to give the model a wider range of views, while simultaneously cutting down on calculations (although a texture lookup is required). For this version, material properties are still taken into consideration, so a red brushed metal ball can use the same map as a blue ball. The head of the skeleton (the big ball) uses anisotropic lighting.
Shadow mapping is a widely known technique for displaying shadows on the screen. A general limitation is that the standard technique only allows for spotlights in 1 direction, not point light sources (omni-directional). Omnidirectional Shadow Mapping has been employed on some of the objects in the scene.
Collision detection and response has been implemented for planes and spheres, and there has been beginning steps made for ellipsoid collision detection.
All objects (except the monkey head) in the game implement this collision system. The ellipsoid collision on the skeleton is slightly buggy, and can cause the player to get stuck in the wall.
If the videos on the right do not capture your attention enough, latest snapshots can be found here.
Controls
WASD+mouse - move the skeleton around Space - jump Q - encourage the ball to go up 1 - turn shadow mapping on or off (this will probably double your performance) LMB + WASD/space/c/mouse - move light around (monkey head is the light) MMB + WASD/space/c/mouse - move camera around RMB - throw a ball B - release a crazy stream of balls ESC - quit
Well, when I did this back in 2005, I never thought I'd be putting it in a portfolio, but here it is. This was all done as part of the graphics subjects offered at QUT.
The spheres shown obey simple AI wander and chase behaviours, and the shading for the bump mapping was produced using Cg
The graveyard scene shown was implemented using a scene graph. The hanging skeleton is in D-H notation, and swings from side to side as time goes on.
Beyond that, the demos are relatively straight-forward. Since a picture is worth so many words, I'll let them do the rest of the talking for me.