al_perspective_transform(3alleg5)
β¨ al_perspective_transform β¨
okay bestie, welcome to the allegro5 manual, page al_perspective_transform(3alleg5), and babes this one is a whole mood π
π NAME π
al_perspective_transform β it's the Allegro 5 API, and it's giving perspective projection, no cap
πΈ SYNOPSIS πΈ
#include <allegro5/allegro.h>
void al_perspective_transform(ALLEGRO_TRANSFORM *trans,
float left, float top, float n,
float right, float bottom, float f)
π¦ DESCRIPTION π¦
so like, this is al_orthographic_transform(3alleg5)'s cooler sibling β same energy, but it honors perspective β¨. and here's the tea: if literally everything is sitting at a z-position of -near, it will look exactly the same as it would with an orthographic transformation. like, identical. periodt.
now, if you wanna use a specific horizontal field of view, you can use this relation:
tan(hfov / 2) = (right - left) / 2 / near
and therefore:
near = (right - left) / 2 / tan(hfov / 2)
iykyk π
π Example 1:
float w = 800, h = 450; // assume our display is 800 x 450
float fov = tan(90 * ALLEGRO_PI / 180 / 2); // 90 degree field of view
// Our projection goes from 0/0 to w/h with the near parameter set
// for a 90 degree horizontal viewing angle.
ALLEGRO_TRANSFORM projection;
al_identity_transform(&projection);
al_perspective_transform(&projection, 0, 0,
w / 2 / fov,
w, h,
2000);
al_use_projection_transform(&projection);
// Set the camera z to +400 (which is exactly the near distance)
ALLEGRO_TRANSFORM camera;
al_build_camera_transform(&camera, 0, 0, 400, 0, 0, 0, 0, 1, 0);
al_use_transform(&camera);
// This will draw two rectangles at the left and right edge of the
// screen and vertically centered. The x distance between them is 800
// units, but the camera transform moves them 400 along z, so with
// a 90Β° viewing angle both are visible.
al_draw_filled_rectangle(0, 200, 50, 250, red;
al_draw_filled_rectangle(750, 200, 800, 250, red);
π§ Example 2:
float w = 800, h = 450; // assume our display is 800 x 450
float fov = tan(90 * ALLEGRO_PI / 180 / 2); // 90 degree field of view
float aspect = h / w;
float zoom = 2; // enlarge x 2
// This projection is very different from the one in the first example.
// Here we map the left and right edge of the screen to -1 and +1. And
// the y axis goes from -1 at the bottom to +1 at the top, scaled by
// the aspect ratio. We also add a zoom parameter so we can control
// the visible portion of the scene independent of the field of view.
ALLEGRO_TRANSFORM projection;
al_identity_transform(&projection);
al_perspective_transform(&projection,
-1 / zoom, aspect / zoom,
1 / fov,
1 / zoom, -aspect / zoom,
2000);
al_use_projection_transform(&projection);
// Moves everything by -4 in the z direction.
ALLEGRO_TRANSFORM camera;
al_build_camera_transform(&camera, 0, 0, 4, 0, 0, 0, 0, 1, 0);
al_use_transform(&camera);
// At a z distance of 4 with a 90Β° hfov everything would be scaled
// down to 25%. However we also zoom 2-fold, so the final scaling is
// 50%. This rectangle therefore will appear at a size of 400 x 225
// pixel (assuming the display is 800 x 450).
al_draw_filled_rectangle(-1, -1, 1, 1, red);
β SINCE β
5.1.3 β she's been iconic since way back, fr fr π
π SEE ALSO π
and that's the whole page bestie!! π«Ά this was the Allegro reference manual's al_perspective_transform(3alleg5) page β go forth and project things with correct perspective, you absolute main character ππ
π¦ where this page comes from
- debian trixie: allegro5-doc 2:5.2.10.1+dfsg-1 Β· Zlib
- ubuntu questing: allegro5-doc 2:5.2.10.1+dfsg-1build1
- ubuntu resolute: allegro5-doc 2:5.2.11.3+dfsg-1 Β· Zlib
- ubuntu stonking: allegro5-doc 2:5.2.11.3+dfsg-1 Β· Zlib
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms