1) Команды вида
GL.Rotate(<угол наклона>, Vector3d.UnitY);
GL.Rotate(<угол наклона>, Vector3.UnitX);
Не подходят, так как в таком случае, если перевернёшь кубик вверх-тормашками, и попытаешься его вращать кубик влево-вправо, то движения кубика инвертируются — он будет вращаться вправо-влево.
2) Потом я решил вычислять оси динамически, но и тут неудача, кубик при вращении ведёт себя как-то не так, крутится не куда надо.
Долго объяснять из-за чего неудача, в двух словах из-за того, что вращение вокруг первой оси, потом вокруг второй не равносильно вращениям в другом порядке.
3) Потом я решил не вращать кубик, а менять положение камеры с помощью GL.LookAt.
Однако, и здесь неудача: кубик ни с того, ни с сего резко поворачивается на 180 градусов в определенных точках (хотя я выводил логи — граничных условий нет),
если повернуть кубик особым образом, то при движении мышки с зажатой кнопкой влево-вправо, кубик будет вращаться вокруг оси, перпендикулярной экрану монитора