Двойная
буферизация
В настоящий
момент перерисовка изображения во время манипуляций мышью очень плохая, так
как мы работаем с одним (front) буфером. Пора подключать второй. Вместо вызова
glFlush; вставьте вызов функции auxSwapBuffers();
J- из другой
библиотеки, которая, как вы помните, не документирована. Но этого мало — надо
заменить волшебное слово SINGLE на не менее волшебное слово —DOUBLE. Местоположение
вычислите самостоятельно. Поиск места вынуждает прокручивать в голове последовательность
вызовов функций, что является полезным, а для многих и необходимым упражнением.
После этого запустите приложение и отметьте, что управляемость кубика улучшилась,
но при достаточно большом его повороте вокруг оси Y поворот вокруг оси X ведет
себя так, как будто сама ось «повернута». Если вы поменяете порядок вызова двух
функций вращения glRotated, то эффект останется, но проявит себя в симметричном
варианте. Исправьте это, если хотите. Хорошая задача на сообразительность, так
как не требует специфических знаний языка программирования, а только общих представлений
о сути преобразований и возможностях библиотек OpenGL.
В примерах
MSDN можно найти способ введения реакций на нажатия клавиш. Используем клавиши
стрелок для смещения объекта в плоскости Z = const. Введите в функцию main декларацию
4 обработчиков:
auxKeyFunc(AUX_DOWN,
KeyDown);
auxKeyFunc(AUX_UP,
KeyUp);
auxKeyFunc(AUX_LEFT,
KeyLeft);
auxKeyFunc(AUX_RIGHT,
KeyRight);
Теперь по аналогии
с мышиными событиями создайте самостоятельно функции обработки и меняйте внутри
них те переменные, от которых зависит трансляция изображения. Например:
void
_stdcall KeyDown()
{
gdTransY
-=0.1; // Сдвигаем изображение вниз
}
void
_stdcall KeyUp()
{
gdTransY
+= 0.1; // Сдвигаем изображение вверх
}
void
_stdcall KeyLeft()
{
gdTransX
-=0.1; // Сдвигаем изображение влево
}
void
_stdcall KeyRight()
{
gdTransX
+=0.1; // Сдвигаем изображение вправо
}
При тестировании
результата обратите внимание на поведение изображения. Например, чем больше
сдвиг вправо, тем лучше видна левая боковая грань. Кажется, что совместно с
перемещением объекта он поворачивается. Но это не так. Эффект объясняется особенностями
перспективной проекции.