Maybe I'm missing something, but in order to eliminate the dirty flags from `viewRotation3D` and `inverseViewRotation3D`, wouldn't I also need to remove it from `view3D`?  Or at least, `getViewRotation3D` would have to check the `view3D` dirty flag each time it is called.  `view3D` is cheap to compute in 3D, but expensive-ish in 2D and Columbus View, so I'm not sure if removing the dirty flag there is wise.