intrinsic camera parameters

would someone be so kind as to tell me what are the relationships (and underlying formulas) between the matrix of intrinsic camera parameters and the opengl matrices.

specifically, how is the camera matrix:

[ -f/sx 0 ox ]
[ 0 -f/sy oy ]
[ 0 0 1 ]

related (mathematically) to the opengl matrices. Where f is the focal length in world coordinates, sx and sy are the pixel sizes in world coordinates, and ox and oy are the camera center in pixel coordinates.

Let’s call the intrinsic camera matrix K.

If you would sample an opengl texture at coordinate (0,0), it samples the corner of the texture. The mapping of K to (0,0) however usually samples the center of the corner pixel.

So you have to adjust K to

| K11 0   K13+0.5 |
| 0   K22 K23+0.5 |
| 0   0   1       |

If you now sample where K originaly mapped to (0,0), it will sample from (0.5,0.5) which is the center of the corner pixel.

Now we map into the canonical viewvolume of opengl, with ranges [-1,1]x[-1,1].

| 2*K11/width  0            2*(K13+0.5)/width -1 |
| 0            2*K22/height 2*(K23+0.5)/height-1 |
| 0            0            1                    |

This maps [0,width]x[0,height] to [-1,1]x[-1,1]

Next, we convert the 3x3 matrix to a 4x4 matrix accepted by opengl.

| 2*K11/width  0            2*(K13+0.5)/width -1  0 |
| 0            2*K22/height 2*(K23+0.5)/height-1  0 |
| X            X            X                     X |
| 0            0            1                     0 |

Note that the third row of the original matrix is placed in the fourth row. This is because we want do do the perspective divide on the Z-component and not the homogeneous component, which is in most cases always equal to 1.

All you need to do now, is fill in the X values according to your near and far plane.

Greetz,

Nico