OpenGL кубик Рубика - вращение граней с помощью мыши

Я работаю над своим первым настоящим проектом OpenGL. Это кубик Рубика 3x3x3. Вот ссылка на простой скриншот того, что у меня есть на данный момент(мой кубик Рубика)

Вращение куба осуществляется с помощью перетаскивания мыши, удерживая правую кнопку мыши. Это работает на примере аркбола из NeHe Tutorials(NeHe Arcball)

У меня есть класс singleCubes, который представляет один куб через 6 фактических квадратов, хранящихся в списке отображения, который может быть использован в его методе draw. Класс ComplexCube имеет массив из 3x3x3 singleCubes и используется как интерфейс при взаимодействии с полным кубиком Рубика.

Теперь я хочу вращать каждую конкретную грань в соответствии с перетаскиванием мыши с нажатой левой кнопкой. Я использую picking, чтобы получить id соответствующей грани кубика, на которой щелкнул пользователь. Это тоже работает. Итак, я нажимаю на сторону одного куба на грани и в зависимости от направления перетаскивания устанавливаю коэффициент поворота и смещения кубов, которые будут затронуты. (Я также хочу реализовать, чтобы вы действительно видели, что грани вращаются, а не просто меняют цвет)

Теперь моя проблема в том, что когда я вращаю кубик Рубика в любом направлении, перетаскивая его правой кнопкой мыши, он становится, например, вверх ногами. Поэтому, когда я нажимаю на сторону и хочу повернуть грань вправо, она идет в неправильном направлении, потому что я не могу отследить, перевернут ли кубик или нет. Из-за использования вращения аркбола у меня нет угла поворота x или y, который я мог бы использовать для определения этого.

Вопрос 1: Как я могу отследить или позже получить информацию о том, что куб перевернут, наклонен и т.д., чтобы перевести информацию о перетаскивании мыши (при вращении одной грани) при использовании примера с аркболом, приведенного выше?

// In render function
glPushMatrix();
{
    glMultMatrixf(Transform.M); // Rotation applied by arcball object
    complCube.draw();           // Draw all the cubes using display lists
}
glPopMatrix();

Установка: C++ с Microsoft Visual Studio 2008, GLEW, freeglut

5
задан genpfault 27 October 2011 в 15:25
поделиться