[cairo] [PATCH 1/6] Enable projective transforms

Bill Spitzak spitzak at gmail.com
Mon Dec 1 19:40:16 PST 2014


 > So is adding px and py the right approach? (btw. may be there are some
 > more appropriate names for these elements)

I think you need to have all three numbers, as the lower-right corner 
can be zero and thus you cannot normalize to 1.

There seems to be some desire to match SVG and CSS with Cairo. This may 
require the use of 4x4 matrices:

SVG and CSS seem to define projections with an x,y,z triple. If I 
understand this right, xyz are the position of the eye in space, it is 
facing down the -z axis, and the perspective is chosen such that the z=0 
plane is unchanged. If I got the math right this is a 4x4 matrix of the 
following form:

	D = 1/z
	|1 0 -xD 0|
	|0 1 -yD 0|
	|0 0  0  0|
	|0 0 -D  1|

An orthographic perspective is achieved by setting z to infinity. This 
is somewhat problematic so it would probably be better to have the api 
take the inverted D value, so orthographic is done with a value of zero 
and there is no need to put infinity into the api.

This does not produce anything useful unless some way can be made to 
have points in the path have a z not equal to zero. Adding a z to the 
path's points may help but is much less important than adding the 
ability to multiply the ctm by 3d rotations about the x and y axis (or 
an arbitrary axis), to scale along z, and to translate along z. These 
are the only way for source surfaces to get perspective transforms.

These concatenations only work if 4x4 matrices are used.

Note that all rendering only needs the 3x3 subset where you throw away 
the z row and column.


More information about the cairo mailing list