## Homogeneous coordinates

Posted by Andy on May 29, 2009

This continues the series on perspective projection, but again, the subject of homogeneous coordinates is extemely useful on its own. Homogeneous coordinates are sort of notorious for being non-intuitive, or maybe it’s just hard to see what the *point *of them is. I’ve always sort-of kind-of understood basically what the rules were, but to be honest, I don’t think I ever really had that aha! moment until just a few hours ago.

I’m going to assume that you understand how plain old coordinates work. You’ve got x, y, and z values that describe a position in a cartesian coordinate system. Usually this is represented by a 3-dimensional vector. Simple enough.

To get so-called homogeneous coordinates, you add a fourth component, conventionally called **w**. So now you have x, y, z, and w, but they still represent a point in **3** dimensions, **not **4. Then what’s the **w **for? Isn’t it superfluous? Before we answer that, let’s look at a few examples.

Consider this 3d point:

<10, 10, 10>

The simplest way to make these into homogeneous coordinates is to just add **w=1**:

<10, 10, 10, 1>

There, now they’re homogeneous. Big deal! Well, what happens if we change **w**?

<10, 10, 10, **5**>

Uh oh. They’re still homogeneous coordinates, but now they’re misleading. Here’s the thing:

<10, 10, 10, 5> **!= **<10, 10, 10>. They are **not **the same point in space! In fact:

<10, 10, 10, 5> = <2, 2, 2>!

The rule is, <x, y, z, w> is the same point as <x, y, z> *only *when w = 1. If w != 1, you can normalize the whole thing by dividing every component by w (obviously, doing this will give you w = 1).

Now we can sort of start to see one part of what **w **is good for. It gives us a way to package a scaling factor into a vector. Notice that because of the rules, this scaling factor is upside down – the rest of the vector scales *inversely *with **w**. When w gets bigger, the rest of the vector gets smaller, and when w gets smaller, the rest of the vector gets bigger.

Ok, so we can pack an inverse scaling factor in with our coordinates. Why is that useful? To understand that, you have to look at how these 4-component vectors interact with the 4×4 transformation matrices used everywhere in computer graphics. I’ll get into that in the next post, where I’ll examine the perspective projection matrix.

## Leave a Reply