3D Graphics Projects/Consulting/Investigations
This page documents projects that I have done outside of the my current work, typically because I want to investigate an algorithm/technique, or I have seen something in a 3D demo/app/game and need to know how it works. Some projects have been done at the request of people I know in the industry.

They are listed in no particular order. Some of these projects a on-going, some are never ending, while others have been completed.

Scene Graph
This project has gone through a number of revisions over the years, usually to add new technology to its architecture, to improve its implementation, etc. It currently consists of a scene graph which supports: Billboards, BSPs, LODs, various Geosets (some portions of the SceneGraph's design came from SGI's Performer product), switches, various traversal mechanisms, view frustum culling, viewports, terrain following, and loading from various formats (GEO, AC3D, PLY, Heightmaps and DEM.) It also includes libraries for animation behaviors and real-time communications via shared memory, TCP/IP, UDP, and data files.

Click Here to see the project page. This includes a comparison of results from a delauney triangulation and ROAM for terrain rendering in the scene graph.

The above terrain was read in from a height map, generated from a DEM file. The shadows/lighting were added at load time, cutting down the run-time costs. A simple desert texture is applied and a sky dome was added.
Real-Time Modeling Tools
This project consists of multiple tools developed for a real-time modeler called GEO. The tools include automated polygon reduction, terrain loading (DEM, DTED, SRTM,) ambient occlusion, shadow texture generation, lofting, delaunay triangulation, curve generation, DXF loading, 3DStudio loading, polygon strip generator, tick mark tooks, and a complete stand-alone real-time animation tool.

Carbon Graphics, developer of GEO, ships one of these plug-ins as part of its base modeler.

Click Here to see more information about the plug-ins.


Realistic Shading and Shadowing tools developed for GEO.
Real-Time Heightmap Shadows
This project's goal was to develop accurate real-time shadows for height map based visualizations. It differed from terrain shadowing algorithms in the need for accurate shadows from multiple lighting angles.

Heightmap visibility is computed using multi-threaded CPU based visibility solvers, or a CUDA solver. Generation of the shadows at run-time is done using texture mapping, or GLSL shaders.


Real-time Heightmap Shadows
OpenSceneGraph
For a project I am working on, I needed a full featured GEO Loader for OpenSceneGraph. The loader needed to be able to load GEO files, including Text Nodes, Clip Regions, and Animation Behaviors. This project involved developing this completely new loader for OSG.

Click Here to see more information about the project.


GEO Loader for OpenSceneGraph.
Ambient Occlusion
This project investigated the ambient occlusion algorithm and developing a GPU accelerated version of the algorithm. The Ambient Occlusion algorithm has become popular in the last few years and it is easy to see why. The algorithm has the ability to give images the soft lighting of a global illumination solution without the expensive processing.

Click Here to see more information about the Ambient Occlusion project.


A rendering of the Ambient Occlusion term of a PLY file.
Large Model Visualization
This project involved developing technologies to allow interactive visualization of extremely large models. 3D scanners, and reverse engineering products generate model files that contain millions of polygons. As these models are manipulated, they must be visualized. This project's focus was technologies which required little or no precomputation, allowing the models to be updated repeatedly without delays for preprocessing.

Click Here to see more information about the project.


Turbine blade, 1.7 million polygons.
Progressive Meshing
If you look at some of the other projects on this page (triangle stripping, ROAM, scene graph), you will see that it is only natual that I would take the time to develop progressive meshing technology. Years ago, when I worked for Coryphaeus, Auto-LOD generation was our holy grail. Now, progressive meshing appears to offer a good solution to the problem.

This project involved two phases. Phase 1 was an implementation of a View Independent Progressive Meshing algorithm, working on large polygon count models. The Phase 1 algorithm would only consider the geometric impacts of the collapses in the metric. Phase 1 included a mesh generator which produced a progressive mesh file, and a progressive mesh file viewer.

Phase 2 involved developing an improved algorithm which included support for material attributes in the metric, loading models from 3D Studio and GEO files, and finally a plug-in for GEO.

Update: Project page updated with support for display on Nintendo DS.

Click Here to see the project page.

A Progressive Mesh application showing a 3DStudio model at full resolution and reduced to 10% of the original resolution.
Texture Atlas Generation
The Texture Atlas Generation project involved developing an algorithm to automatically produce a texture atlas, by unwrapping a model and packing it into a single or multiple textures. The tool can load a model and produce a complete texture atlas of the model in a few seconds.

Click Here to see more information about the project.


A portion of an automatically generated texture atlas.
Terrain Studio
The Terrain Studio project is the culmination of many other terrain projects. The goal of this project is to take technology developed in previous projects, and to develop a single terrain manipulation environment. Currently it supports loading terrain from DEM, DTED, and SRTM files. It supports the display of VPF (Vector Product Format) coastlines and political boundaries. It also features color height map displays and XML based colormap loading.

It is an on-going project.

Click Here to see more information about the project.

Colored Height map display of 6 contiguous DEMs in the Terrain Studio Application.
Iterative TIN Generation
This project involved developing an iterative TIN generation algorithm for terrains read from DEM files. The ability to control the triangulation, limiting the error and polygon count made the algorithm worth investigating. The applicability to terrain simplification was another reason. The project also involved using the graphics board GPU to compute the error metric.

Click Here to see more information about the Iterative TIN project.

A TIN generated via the Iterative TIN algorithm, for a DEM file of Denver.
Vector Product Format (VPF)
Vector Product Format (VPF) from NIMA is a good source of global vector data. This project involved parsing the VPF format to extract vector data, and generating a vector feature library to support LOD, simplification, and rendering of the data.

Click Here to see more information about the VPF project.

VPF of North American Coastlines, Political Boundaries, and Depth contours.
Subdivision Surfaces
Subdivision surfaces have become a primitive which has generated quite a bit of interest in the industry. Much of this interest can be attributed to the fact that they are compact geometric representations of smooth surfaces. This project investigated implementing Loop's subdivision surface algorithm.

Click here to see the project page.


A cutaway view of a torus produced after a couple levels of subdivision.
Real-Time Renderman / Renderman for Cg
This project involved mapping Renderman to a real-time architecture using OpenGL and Cg. The idea was to map as much of Renderman, specifically the shaders, to Cg shaders which can then run in a single pass in real-time. The project used the first release of Cg and early programmable graphics hardware.

Click Here to see the project page.

A Renderman procedural shader running in real-time, displaying the legendary Pixar beach ball, shaded on the Nvidia Shaderball!
Active Surface Definition (ASD) / Continuous Active Terrain (CAT)
ASD is one of the first real-time continuous LOD techniques, made popular by the fact that it is included in SGI's Performer. One nice attribute of this technique, with regards to terrain, is that it doesn't require a regularly sampled height field to work. Instead TINs can be used as the source to generate the ASD LOD levels. This project included developing a ASD viewer, and building ASD LOD levels from terrain input.

Click here to see the project page, including an animation of the ASD morphing terrain.

A morphing level of detail, generated from a height field, displayed using ASD.
Delaunay Triangulation
DEM terrains (and heightmaps) are a nice source of terrain data, but the regular sampling is not optimal if we aren't using a dynamic tessellation routine like the ROAM algorithm. To reduce the non-essential triangle count, this project put together an implementation of delaunay triangulation. Multiple simplification algorithms/metrics were also developed. One metric to simply reduce the number of vertices which added little or nothing to the terrain definition. Another metric to guarantee the preservation of features such as the coastline.

Click here to read more about this project and for more images.

A section of DEM terrain, which uses 16% of the original vertices while still maintaining feature definition.
ROAM Terrain Rendering
Real-time Optimally Adapting Meshes

This project was a an implementation of the ROAM algorithm, originally published by Duchaineau, and made popular by a number of game engine folks. The goal is to reduce the number of triangles necessary to render the terrain.

This stand-alone implementation consists of a split-only implementation, which means the merge and split queues were not implemented. Instead the scene is re-tessellated every frame. The merge and split queues were planned but as many "side-projects" go, they haven't made it yet. Split-only implementations fall apart with dense terrain tessellations. Another limitation to ROAM is that it requires a regular grid terrain, so it can't support TINs.

This implementation was replaced with the implementation that was used in the Scene Graph. (Another split-only implementation.)

ROAM tessellation - Looking up a mountain in the upper right corner. Eye point and view frustum displayed as overlays.
Horizon Mapping: Fast Terrain Lighting

This project was originally a quick lighting and shadow computation engine for DEM grids. With the advent of programmable graphics hardware, the project was extended to do horizon mapping in a fragment program, providing greatly improved shadow definition. Hard and soft shadows are supported at a minimal cost.

Click here to read more about this project and for more images.

Chagrin River Valley - Cleveland, Ohio DEM file rendered using fragment programs and horizon mapping.

Lofting/Skinning/Surface Reconstruction
This project involved developing a new version of a lofting (also known as skinning and/or surface reconstruction) algorithm. Lofting involves generating triangular meshes which connect contours of different size, shape, and location producing a skin stretched over those contours.

This project also involved developing a plug-in version of the algorithm for the vis-sim modeler Geo.

Click here to read more about this project and for more images.

Red contours with a blue triangular mesh generated by the lofting algorithm. Notice the difference in the sizes, and number of segments that make up each contour.

Quad and Triangle Stripping
This project was to work on efficiently generating triangle and quad strips from a set of individual quads and triangles given to the stripping engine. The Stripping engine's purpose is to generate strips as fast as possible (so it can be done at load time), rather than taking the time to generate the theoretically optimal solution. It does a fairly effective job. The picture to the right is of a rather simple case, stripping a terrain file, but it shows what it can do.

Some may ask why waste the time, now that hardware can do 25 million triangles per second. To get the full throughput of a graphics chip, the less work it has to do, like transforming an extra million vertices or so, the better off you are. The less data you have to shuttle across the bus, the better also.

For most real world scenarios, it would be better to generate the strips off-line then load the models already stripped. The short-coming being that you can't support dynamic geometry scenarios this way.

PLY Loading - To test the stripping engine better, I wrote a PLY file loader so I could get access to nice big datasets, like Happy Buddha, that aren't as regular as terrain. As can be seen in the image to the right, and the statistics beneath it, the algorithm stands up to a more realistic dataset. I'm sure the dataset could be done with a more optimal set of strips, the algorithm performed quickly and reduced the vertex transform count by 1.7 million vertices (>50%.)

Quad strips generated from a DEM file. No special assumptions made, the loader just dumped quads into the strip engine then let it find the nice long full terrain wide strips. Alternating colors are used to show the different strips.

Buddha loaded from PLY, 1.1 million triangles. The left image is the shaded lit original file. The right image is the color coded display of the triangle strips (alternating colors to show the strips.) The stripping version resulted in an average of 4.6 triangles per strip, resulting in approximately 1.7 million less vertex transforms per render.

Inverse & Forward Kinematics
This project involved implementing an interactive Inverse Kinematics solver. The chosen algorithm was Cyclic-Coordinate Descent (CCD). It implements the CCD algorithm, dampens angle changes per iteration, and records them for forward kinematics. It provides different interpolation algorithms for the forward kinematics display.

Click here to read more about this project and for more images.

Demo of a 3 jointed arm. The blue circle shows the maximum reach of the arm, and the yellow cross hair is the target point. The graph at the bottom is of the joint angles interpolated over time.
Real-Time Blob Visualization - Aka Lava Lamp
This project takes just about every kind of short cut to make blob rendering run at real-time. It only uses OpenGL for displaying the image in a GLUT window. The blob system is sampled, in a unique way, for each pixel (well, actually every other pixel, and alternates with each row, producing a checkerboard sampling), then shaded using a pseudo-depth gradient shading algorithm. The program is multi-threaded.
High Level Architecture / RTI
In a slight departure from all of the other 3D projects shown on this page, this project involves developing a simulation application framework for integrating with the DMSO HLA/RTI1.3-NG. For those not familiar with the HLA, it is an architecture for developing distributed simulations. A specific use is visual simulation. This project will be joined with the SceneGraph to drive visual simulations of on-going simulations.

For more information, on this project Click here.

Unless otherwise noted, all of these projects were done using C++ and OpenGL. I will post more of my projects as I get the chance. glenn@raudins.com