[cairo] Rotations with Quaternions

Bryce Harrington bryce at osg.samsung.com
Fri Jan 19 23:36:31 UTC 2018

On Wed, Jan 10, 2018 at 02:13:39PM -0500, cecashon at aol.com wrote:
> Hi Bryce,
> A 3x3 matrix should might work for quaternion rotations. In the sample
> code this is reduced to a 2x2 matrix, or four variables for each
> circle rotation, by using initial reference points but that wouldn't
> work in general to preserve rotations. There would be a need to keep
> the z component of a plane to make the rotations additive. If you
> assumed z=0 then a first rotation would work but not a second or it
> wouldn't work as expected.

The code I've been hacking on adds to Cairo a 3x3 matrix with the 9th
element fixed to 1 (so effectively is an 8-element matrix).  If that
last element is needed, it shouldn't be too hard to add in subsequently;
I've hidden the matrix definition internally so it'd be no API break to
change, just making sure all the math accounts for the transformation.

> This probably is something difficult to add to Cairo. There are a lot
> of places that the cairo_matrix_t touches in the code. Also I think
> there would be a need for a new matrix for quaternion rotations and if
> that is done then you run into further difficulties such as the order
> of matrix multiplication. A lot of speculation at this point.

Yes, it is proving to be rather difficult.  Actually, just expanding the
cairo_matrix_t definition to include projection wasn't too bad, but
keeping the cairo_matrix_t API intact and adding projection as a new
matrix type is rather invasive - everywhere that uses cairo_matrix_t
needs updated to handle a cairo_matrix3_t.

But, I'm working my way through it, and I think once that's in place
then I think the quaternion rotation is doable.  Since internally Cairo
assumes a 2D surface (Z=0), perhaps some flattening operation would
allow using 9-elements externally and avoid a lot of logical mess by
using 8 internally.

> I got going on this to figure out 3d rotations using Cairo's api. I
> could get some special case rotations in 3d but not something that
> would work for a gyro. Working on putting together a little gyro
> widget with Cairo and GTK.
> I am not familiar with the internals of Cairo. I have looked around a
> little but I don't have a test setup with the current version. Do you
> have any suggestions for putting together a test setup? I would be
> interested in getting a test build set up that I could experiment
> with. Also to take a look at what you have going with projections.

Depends on what operating system you're on.

If you're on Linux it's just `apt-get build-dep libcairo2-dev` or the
equivalent for your distro to install the build dependencies, checkout
the code from git, and build it.  See INSTALL and README.

There's more tips on the download page and elsewhere, although can't
vouch for how current the directions are:


For experimenting with the matrix code, the good thing is that even just
the image backend will be suitable, so don't have to worry about driver
issues at least.  :-)


More information about the cairo mailing list