• записать текущие матрицы наблюдения и геометрических преобразований;
• задать окно выбора для ввода мышью;
• присвоить объектам идентификаторы и переработать сцену, используя обновленный отображаемый объем (затем информация об указке записывается в буфере указки);
• восстановить исходную матрицу наблюдения и геометрических преобразований;
• определить число объектов, на которые указывает ссылка и вернуться к нормальному режиму визуализации;
• обработать информацию о выборе с помощью указки.
Кроме того, можно использовать модификацию указанных процедур для выбора объектов без интерактивного ввода мышью. Для этого задается не искомое окно выбора, а вершины обновленного отображаемого объема.
Массив буфера указки подготавливается с помощью команды
glSelectBuffer (pickBuffSize, pickBuffer); Параметр pickBuffer задает целочисленный массив с элементами pickBuffSize. Перед активизацией операции выбора с помощью указки (режима выбора) нужно вызвать функцию glSelectBuffer. Для каждого объекта, выбранного с помощью указки, в массиве ее буфера создается целая информационная запись.
Несколько информационных записей можно сохранить в буфере указки в зависимости от размера и расположения окна выделения. Каждая запись в буфере указки содержит следующую информацию.
1. Положение объекта в стеке - число идентификаторов в стеке имен, расположенных над положением выбранного объекта (включая позицию объекта).
2. Минимальная глубина выбранного объекта.
3. Максимальная глубина выбранного объекта.
4. Список идентификаторов в стеке имен от первого (верхнего) идентификатора до идентификатора выбранного объекта.
Целочисленные значения глубин, хранимые в буфере указки, - это исходные значения из диапазона 0-1,0, умноженные на 232 - 1.
Для активизации указки OpenGL используется операция
glRenderMode (GL_SELECT); При этом мы переходим в режим выбора, следовательно, для обработки сцены используется конвейер наблюдения, но данные не заносятся в буфер кадра. Запись информации для каждого объекта, который был бы отображен в обычном режиме визуализации, помещается в буфер указки. Кроме того, указанная команда возвращает число объектов, выделенных с помощью указки, которое равно числу информационных записей в буфере указки. Чтобы вернуться в нормальный режим визуализации (режим по умолчанию), вызывается процедура glRenderMode с аргументом GL_RENDER. Третья опция - это аргумент GL_FEEDBACK, который содержит координаты объекта и другую информацию из буфера обратной связи, которая отображается рядом с объектом. Режим обратной связи используется для получения информации о типах и параметрах примитивов, а также других параметрах, связанных с объектами на сцене.
Для активизации стека имен (целочисленных идентификаторов), фигурирующего при выборе с помощью указки, используется такая процедура.
gllnitNames ( ) ; Изначально стек идентификаторов пуст, и его можно использовать только в режиме выбора. Чтобы поместить в стек целое значение (без знака), вызывается следующая функция.