The pinhole camera equation
Every perspective drawing, photograph and 3D-rendered frame reduces to one piece of arithmetic: a pinhole camera model where light from a 3D point (x, y, z) passes through a single focal point and lands on a flat image plane a distance f (the focal length) away. Similar triangles give the perspective divide:
x_screen = f * x / z y_screen = f * y / z -- objects at larger z (farther away) get divided by a bigger number, so they shrink; this single division is the entire mathematical content of "things look smaller far away," and every renderer, real camera and eye implements it
This is why perspective, unlike an architect's orthographic elevation, is not a matter of taste or drafting convention — it is what a camera or an eye actually, physically does. z appears only in the denominator, never subtracted or added, which is also why perspective projection cannot be inverted from a single 2D image alone: infinitely many 3D points along the same ray through the focal point project to the identical screen pixel. Recovering depth needs a second view (stereo), a known object size, or an assumption.
Vanishing points are just directions, projected
A vanishing point is where a family of parallel lines in 3D space appears to converge on the 2D image. It is computed directly from the perspective-divide formula: parallel lines share a common 3D direction vector, and as a point races to infinity along that direction, its projected (x_screen, y_screen) converges to a single fixed limit — the vanishing point — that depends only on the direction, never on which specific parallel line you started with or how far along it the point sits. A horizontal line pointing due 'into' the frame and a parallel line ten metres to the side still share the exact same vanishing point, which is the geometric fact every perspective drawing tutorial is really teaching, usually without stating it algebraically.
One-point, two-point, three-point: how many axes are tilted
The classic 'N-point perspective' taxonomy just counts how many of a scene's three principal axes (typically the edges of a box: width, height, depth) are not parallel to the image plane, and therefore need their own vanishing point. One-point perspective happens when the camera looks squarely down one axis (a hallway shot straight down its length) — only the depth axis converges, to a single vanishing point on the horizon, while width and height stay parallel to the frame edges. Two-point perspective tilts the camera to look at a corner of a box rather than a face — two horizontal axes each get their own vanishing point on the horizon line, while vertical edges stay parallel to the image's vertical axis. Three-point perspective adds a camera tilt up or down (looking up at a skyscraper, or down from a drone), which breaks the vertical axis's parallelism too and gives it a third vanishing point, usually straight up or straight down off the frame.
The horizon is the vanishing line, not a fixed height
All vanishing points for horizontal directions lie on a single line — the horizon, which is exactly the projection of the infinitely-distant horizontal plane at the camera's own eye height. This is why the horizon in a perspective drawing rises and falls with the camera's height, not with the physical horizon: photograph a room from a chair and the horizon line sits low, near the seated eye height, cutting through the lower third of standing furniture; photograph the same room from a stepladder and it rises correspondingly. Painters use this single fact, more than any other, to keep a scene's geometry internally consistent — every parallel set of horizontal edges must send its vanishing point to the same horizon line, no exceptions.
Why renderers use a 4x4 matrix instead of raw division
Real-time 3D engines wrap the perspective divide inside a 4×4 projection matrix operating on homogeneous coordinates (x, y, z, w). The matrix multiply itself is entirely linear — it copies z into the w slot — and the actual division x/w, y/w, z/w happens as one separate hardware step afterward. Packaging it this way lets the same uniform 4×4-matrix machinery used for translation, rotation and scaling also handle projection, so a GPU's rendering pipeline can chain camera position, camera orientation and the lens's field of view into a single matrix multiplication per vertex, with the nonlinear division deferred to one fixed, hardware-accelerated final step.
Frequently asked questions
Why do parallel lines seem to meet at a point in a photo?
Because of the perspective divide x_screen = f·x/z: points on the same 3D line share a direction, and as that direction's points recede toward infinity their projected screen position converges to one fixed limit, the vanishing point. The lines never actually meet in 3D — only their projections do.
What decides whether a drawing is one-, two- or three-point perspective?
How many of the scene's principal axes are tilted away from being parallel to the image plane. Looking straight down a corridor gives one vanishing point; looking at a box's corner gives two; tilting the camera up or down as well (looking up at a tall building) adds a third, usually vertical, vanishing point.
Why does the horizon line move up and down between photos of the same room?
Because the horizon in a perspective drawing is the vanishing line for all horizontal directions, which sits at the camera's own eye height, not at a fixed physical location. A camera at seated height puts the horizon low in the frame; the same room shot from a stepladder raises it.
Try it live
Everything above runs in your browser — open Perspective Projection & Vanishing Points and change the parameters while it is running. Nothing is installed, nothing is uploaded, the whole model lives in one tab.
▶ Open Perspective Projection & Vanishing Points simulation