Как только процесс визуализации куба (за экраном) завершен, вызывается подпрограмма glutSwapBuffersO, чтобы сделать видимым новый кадр. Анимация контролируется с помощью функции обратного вызова spinnerO в качестве «функции ожидания». Когда система находится в режиме ожидания - иначе говоря, когда она не реагирует на команды пользователя, - автоматически вызывается spinner. Эта подпрограмма слегка изменяет углы поворота куба и вновь вызывает функцию displayO. В результате получается эффект непрерывной анимации: куб выглядит вращающимся, так что его различные грани попадают в поле зрения и выходят из него - снова и снова.
8.5.5. Обертывание текстуры вокруг криволинейных поверхностей Теперь, когда мы уже видели, как наклеивать текстуру на плоскую поверхность, мы можем рассмотреть, как обертывать текстуру вокруг криволинейной поверхности, вроде банки для пива или шахматной фигуры. Как и ранее, мы предполагаем, что объект смоделирован в виде сетки, то есть состоит из большого числа маленьких плоских граней. Как уже обсуждалось в конце раздела «Наклеивание текстуры на плоскую поверхность», с каждой вершиной сетки связана пара текстурных координат (st, tt). Основная задача состоит в нахождении правильных текстурных координат (s, і) для каждой вершины сетки.
Приводимые здесь четыре примера показывают, как отображать текстуры на «цилиндроподобные» и «шароподобные» объекты; в них обсуждается, что должен делать разработчик модели в каждом случае.
Пример 8.5.1. Обертывание этикетки вокруг консервной банки Предположим, что мы хотим обернуть этикетку вокруг кругового цилиндра, как показано на рис. 8.50, а. Естественно рассуждать в терминах цилиндрических координат. Этикетка должна простираться от угла 0а до Вь по азимуту и от za до zb вдоль оси z. Цилиндр смоделирован как полигональная сетка, поэтому его стенки являются прямоугольными полосками, как показано на рис. 8.50, б. Для вершины V. каждой грани необходимо найти подходящие текстурные координаты (s, £.), так чтобы на эту грань отображалась нужная «часть» текстуры.