Simply 3D

Math for computer graphics, made simple

Archive for the ‘Uncategorized’ Category

hello world

Posted by Andy on May 29, 2009

In my journey as a 3D graphics programmer, it seems I am continually learning, forgetting, and relearning a lot of the millions of fine details, particularly the finer points of the math.  I thought I should make a place where I can capture my moments of clarity, so that I can refer back to them later.  And why not put it on the web while I’m at it, so that others who are learning can have a look?

I’ve been doing 3D graphics programming for about 17 years, ever since the day in 10th grade algebra when we covered rectangular and polar coordinates.  Daydreaming during the lesson, I realized that you could use that math to rotate stuff.  On the way home, I imagined using the formulas to rotate a cloud of points in 3D space.  I went straight to my Tandy 1000 and fired up BASIC.

My first 3D program had a random cloud of pixels spinning in 3D space, projected head-on, orthographically.  In other words, it looked like a bunch of pixels swaying from side to side on the screen – but I knew what it represented.  Then two things happened.  First, I realized that if I drew lines connecting the points instead, I could make something more like a geometric shape.  I got some graph paper, plotted a triangular prism, and typed in the coordinates.  Second, almost as an afterthought, I started thinking about how to make it look “more 3D” – i.e. how to add perspective.

As I remember it, it only took me a few minutes to work out that if I wanted far away things to be smaller, that meant I should divide everything by z.  I tried this, and it sort of almost worked, but the result looked distorted.  Without understanding what I was doing, I experimented with adding an extra term to the formula until it looked right.  And just like that, I had a rotating 3D wireframe model, with perspective.

I didn’t fully appreciate at the time that I had just independently rediscovered the Perspective Projection, following in the footsteps of Florentine painters, mathematicians, and early computer graphics practitioners.  Nor did I fully understand the details, such as the fact that my extra term was actually the distance from the eye to the view plane.

I find it a little funny that the concept that spurred me to write a 3D program was rotation, and that I tacked on perspective almost as an afterthought.  It’s like I thought rotation was the main thing that would make an object seem real and solid.

Still, figuring out perspective was a pretty big deal.  I have a much deeper understanding of it now than I did back then.  And yet, when I went to reimplement a projection matrix today, I found that I’d forgotten (again) what a lot of the terms did, and how it all worked with the homogeneous coordinates and what not.  So, my first little series will be a breakdown of perspective projection matrices and why they are the way they are.


Posted in Uncategorized | Tagged: | 1 Comment »