glPushName (ID); Эта команда помещает значение параметра ID в верхнюю позицию, опуская предыдущее верхнее имя на одну позицию. Кроме того, можно просто заменить верхнее значение стека, используя команду

Три цветных прямоугольника, отображенных в демонстрационной программе выделения с помощью указки

Рис. 11.15. Три цветных прямоугольника, отображенных в демонстрационной программе выделения с помощью указки

glLoadName (ID) ; Однако эту команду нельзя использовать, чтобы поместить значение в пустой стек. Для того чтобы удалить верхнее значение стека идентификаторов, используется следующая команда.

glPopName ( ); Окно выделения при выбранном окне просмотра определяется с помощью такой функции GLU.

gluPickMatrix (xPick, yPick, widthPick, heightPick, vpArray); Параметры xPick и yPick (величины двойной точности) задают экранные координаты центра окна выбора относительно левого нижнего угла окна просмотра. Когда данные координаты вводятся мышью, координаты мыши берутся относительно верхнего левого угла, следовательно, входное значение yMouse нужно инвертировать. Значения двойной точности ширины и высоты окна выбора задаются параметрами widthPick и heightPick. Параметры vpArray определяют массив целых чисел, содержащий координаты и размер текущего окна просмотра. Параметры окна просмотра получаются с использованием функции glGetlntegerv (раздел 6.4). Затем данное окно выбора используется как окно отсечения, позволяющее построить обновленный отображаемый объем при преобразовании точки наблюдения. Информация по объектам, пересекающим данный объем, помещается в буфер указки.

Проиллюстрируем выделение с помощью указки в OpenGL. Приведенная ниже программу дает три цветных прямоугольника, показанных на рис. 11.15. В этом примере используется окно выбора 5 на 5, и центр окна выбора определяется вводом мыши. Следовательно, необходимо инвертировать входное значение yMouse, используя высоту окна просмотра (четвертый элемент массива vpArray). Красному прямоугольнику присвоен идентификатор 30, синему - 10, а зеленому - 20. В зависимости от положения мыши при вводе может не выбираться ни одного прямоугольника, один прямоугольник, два прямоугольника или все три прямоугольника. Идентификаторы прямоугольника вводятся в стек идентификаторов в порядке цветов: красный, синий, зеленый. Следовательно, при обработке выбранного прямоугольника используется либо его идентификатор, либо номер положения в стеке. Например, если номер положения в стеке (первый элемент в записи выбора) равен 2, выбран синий прямоугольник, и в конце записи указаны два идентификатора прямоугольников. Альтернативный вариант - использовать последнюю позицию записи, т.е. идентификатор выбранного объекта. В приведенной ниже программе приведено содержимое буфера выбора. Прямоугольники определены на плоскости ху, так что все значения глубины равны 0. Пример выхода программы приведен в примере 11.1 для положения мыши при вводе вблизи границы между красным и зеленым прямоугольниками. Механизм остановки программы не реализован, так что можно обработать любое число щелчков мыши.

♦include <GL/glut.h>

♦include <stdio.h>


⇐ вернуться назад | | далее ⇒