Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
al_perspec..._transform(3) Library Functions Manual al_perspec..._transform(3)

NAME
       al_perspective_transform	- Allegro 5 API

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
       Like  al_orthographic_transform(3)  but	honors perspective.  If	every-
       thing is	at a z-position	of -near it will look the same as with an  or-
       thographic transformation.

       To use a	specific horizontal field of view you can use the relation:

	      tan(hfov / 2) = (right - left) / 2 / near

       and therefore

	      near = (right - left) / 2	/ tan(hfov / 2)

       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

SEE ALSO
       al_use_projection_transform(3), al_orthographic_transform(3)

Allegro	reference manual			    al_perspec..._transform(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=al_perspective_transform&sektion=3&manpath=FreeBSD+Ports+14.3.quarterly>

home | help