No need for any matrix operations at all. I watched the Cassini Division movie and those guys had a web site at the end of the movie, there I found cassini.cpp and this simple code to rotate the camera in real 3D manner (I added Z-axis rotation though):

The X-axis rotation works fine.The Y-axis rotation does not rotate around the camera, but around the world's Y-axis?Also, when I rotate around the Z-axis, it seems to rotate also around something else than the camera's Z-axis.

I added Z-axis rotation to simple1.cpp like this:

Quote

// We now assign a new rotation transformation to the camera. You // can think of the rotation this way: starting from the zero // position, you first rotate "rotY" radians on your Y axis to get // the first rotation. From there you rotate "rotX" radians on the // your X axis to get the final rotation. We multiply the // individual rotations on each axis together to get a single // rotation matrix. The rotations are applied in right to left // order . csMatrix3 rot = csXRotMatrix3 (rotX) * csYRotMatrix3 (rotY) * csZRotMatrix3 (rotZ); csOrthoTransform ot (rot, c->GetTransform().GetOrigin ()); c->SetTransform (ot);