Учебник по Visual C++ .Net

         

Двойная буферизация


В настоящий момент перерисовка изображения во время манипуляций мышью очень плохая, так как мы работаем с одним (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; // Сдвигаем изображение вправо

}

При тестировании результата обратите внимание на поведение изображения. Например, чем больше сдвиг вправо, тем лучше видна левая боковая грань. Кажется, что совместно с перемещением объекта он поворачивается. Но это не так. Эффект объясняется особенностями перспективной проекции.



Содержание раздела