OpenGL. Руководство по программированию (Библиотека программиста) (2006). Ву М., Девис Т., Нейдер Дж., Шрайнер Д (1124475), страница 102
Текст из файла (страница 102)
(8.75, 9.75), (0.75, о.5П; 6С(1оаС согчехпотв[8] (0.0, 9.8, 0.8, 9.0, 1.8, 1.8, 1.0, 1.8); 6[(1оат ри1РС(3][2) = /' по часовой стрелке */ ((8.75. 8.5), (0.5, 8.25), (8.25, 9.5)); 9161еаг(6С СОСОМ 80РГЕМ ВХТ [ 61 0ЕРТН ВЬЕРЕМ 81Т); 91ровпйаСгтх(): 81йотвтет(338.9, 1., 8., 8.); 915са1ет(0.5, 8.5, 0.5); 91оВейтп5игтасе(тлейогЫ; 81ойогьв5огсасе(тпейогЬ, 8, Хпотв, 8, Хпотв, 4 * 3, 3, аст1рот птв[8] [О] [О], 4, 4, 61 МАР2 ЧЕМТЕХ 3); й[овейтпТгт'в(СПейогЬ); й[оРи1Согче(СПейогЬ, 5, аеийеРС[0][0], 2, 610 МАР1 ТМ1М 2); В[ойпитгтв(тлейогЫ; 91оВейтпТг(в(СПейигЫ; 91ойогьвсогче(спемогь, В, сигчехпосв, 2, асогчеРс[9][8), 4, 6(0 МАР1 Та]М 2); й]ори[Сигуа(тйейогЬ, 3, арн]РС[8)[9], г, 610 МАРХ ТМХМ 2); 91ийпитгтв(СПейого); 91оЕпи5огтасе(тлейогЫ; 91РоРМатг1'х(); 91Р1овл(): В листинге 128 команды-скобки к[ибеа[птг! в() и к1оЕпотг(в() обрамляют каждую кривую усечения. Первая, с вершинами в массиве ет[йеРС [) [], ориентирована против часовой стрелки вокруг единичного квадрата параметрического пространства.
Это гарантирует отображение всего, что не исключается из рассмотрения вложенными кривыми усечения, обходимыми по часовой стрелке. Вторая кривая — это комбинация кусочно-линейной и [ч1]ВВ5-кривой. Концы ]([]ВВ5-кривой в точках 10,9, 0.5) и (0.1, 0.5) замыкаются с помощью кусочно-линейной кривой. Выбор и обратная связь После прочтения этой главы вы научитесь следующему: ° Создавать приложения, позволяющие пользователю выбирать область экрана или нарисованный на экране объект ° Использовать режим обратной связи Орели~ для получения результатов построения сцены Выбор 467 Некоторые графические программы просто рисуют статические изображения двух- или трехмерных объектов. Другие приложения позволяют пользователю идентифицировать объект на экране и затем перемещать, модифицировать, удалять его или манипулировать этим объектом другими способами.
Библиотека ОрепС». ориентирована на поддержку именно таких интерактивных приложений. Поскольку обычно нарисованный на экране объект подвергается вращению, смещению н перспективным преобразованиям, это может усложнить задачу его идентификации пользователем на фоне трехмерной сцены. В помощь вам ОрепСЕ предоставляет механизм выбора, автоматически информирующий вас, какие объекты отображены внутри указанной области окна. Вы вправе использовать этот механизм вместе со специальными процедурами-инструментами для выяснения того, какой объект в пределах области указан пользователем — выдеин (р1сЫпй) им с помощью указателя мыши.
Выбор фактически является режимом выполнения операций ОрепС1; обратная связь — другой подобный режим. В режиме обратной связи вы используете свое мшаратное обеспечение и ОрепСЕ для выполнения обыкновенных построения и отображения сцены. Вместо использования вычисленных результатов для рисования изображения на экране в этом случае ОрепСЕ возвращает (1еедз Ьаск) эту информацию вам. Например, если вы хотите нарисовать трехмерный объект с помощью графопостроителя, а не на экране, вам следует отобразить его элементы в режиме обратной связи, собрать вместе инструкции отображения и затем преобразовать их в команды, понятные графопостроителю. Как при выборе, так и в режиме обратной связи информация об изображении возвращается приложению, а не посылается в буфер кадров, как это происходит при воспроизведении.
Таким образом, экран остается «замороженным» вЂ” никакого рисования не происходит, — пока ОрепС1 не покинет режим выбора или обратной связи. В обоих режимах содержимое буферов цвета, глубины, трафарета и накопления не подвергается воздействию. В этой главе каждому из означенных режимов посвящен собственный раздел: » Выбор. Рассказывает, как испольэовать режим выбора и связанные с ннм подпрограммы, чтобы позволить пользователю вашего приложения выбирать объект на экране. ° Обратная связь. Здесь описывается, как получить данные, которые могут быть отображены на экране, н как обрабатывать эту информацию. Выбор Обычно, когда вы планируете использовать механизм выбора ОрепС!., сначала вы рисуете свою сцену в буфер кадров и затем входите в режим выбора и перерисовываете сцену.
Войдя в режим выбора, вы уже не можете изменить содержимое буфера кадров, пока не покинете этот режим. После выхода из пего ОрепСБ возвращает список примитивов, попадающих в видимый объем (помннте, что видимый объем определяется текущими модельно-видовой матрицей и матрицей проекции и любыми дополнительными плоскостями отсечения, как обсуждалось 468 Глава 13 ° Выбор и обратная связь в главе 3). Каждый примитив, пересекающий видимый объем, утвердительно реагирует на выбор самого себя (зе1есг!оп и!1). Список примитивов фактически возвращается как массив целочисленных идентификаторов (пашез) — имен и связанных с ними данных — записей реакции системы ()пс гесогг!з) соответствующих текущему содержанию стека имен (паше зсас!с).
Вы выстраиваете стек имен загрузкой имен во время применения комацды отображения примитивов, находясь в режиме выбора. Таким образом, ко~да возвращается список имен, вы можете использовать его для определения, какой из примитивов может быть выбран на экране пользователем. В дополнение к механизму выбора Ореп01.
предоставляет подпрограммы-инструменты, служащие для упрощения выбора в некоторых случаях, ограничивая рисование небольшой областью окна просмотра. Обычно вы используете такую подпрограмму, чтобы выяснить, какой объект нарисован вблизи указателя мыши, тем самым вы можете идентифицировать выбранный пользователем объект. (Вы можете также разграничить область выбора, указав дополнительные плоскости отсечения. Помните, что эти плоскости действуют в отношении мировых координат, но не в системе координат экрана.) Поскольку выбор с помощью указателя (р!сЫпд) является частным случаем выбора (зе!есг!оп), сначала в этой главе мы рассмотрим выбор в принципе, и лишь затем — выделение указателем мыши.
Основные шаги Чтобы задействовать механизм выбора, вы должны выполнить следующие шаги. 1. Указать массив, который будет использоваться для возвращаемых записей реакции, с помощью В15е1естВиттег О. 2. Войти в режим выбора посредством задания параметра 61 5 Ес ВСт для команды В1Репоегцоое(). 3.
Инициализировать стек имен командами В11п!(йааез() и В1Ризлйаве(). 4. Определить видимый объем, в котором будет возможен выбор. Обычно он не отличается от видимого объема вашей оригинальной нарисованной сцены, поэтому вероятно, что вы захотите сохранить и после восстановить текущее состояние преобразования — с помощью В1Ризлнасг!х() и В1Рорпатг1х(). 5. Поочередно вызывать команды отображения примитивов и команды манипулирования стеком имен с целью присвоить каждому заслуживающему интерес примитиву соответствующее имя, 6. Выйти из режима выбора и обработать возвращенные механизмом выбора записи реакции.
чо!г! В15е1естботтег(01л!ге! з(ге, 01п!п( 'ЬиЦег); Задает массив, используемый для возвращаемых при выборе данных. Аргумент ЬиДег — это указатель на массив беззнаковых целых, куда помешаются зти данные, а аргумент зые указывает максимальное количество значений, которые могут быть сохранены в массиве. Вам следует сделать вызов В15е1ессаиттег() перед входом в режим выбора. Выбор 469 сз1.!пс В1йепбегИобе(01еппщ тоЫе); Управляет тем, в каком режиме приложение будет выполнять визуализацию — в режиме выбора или обратной связи. Аргумент режима то/(е задается равным 6С йЕМОЕй (по умолчанию), 6С 5ЕСЕСТ или 61 РЕЕОВАСК.
Приложение остается в указанном режиме до того момента, пока снова не будет выдана команда В1йепбегМобе() с другим аргументом режима. Перед входом в режим выбора нужно вызвать команду В15е1ессвиттег() для задания массива выбора. Аналогично, перед активизацией режилса обратной связи следует вызвать В1реебвасКВигтег() для задания массива ланных обратной связи. Возвращаемое значение В1йепбегИобе() для текущего режима визуализации (то есть не значения аргумента тог(е); 61 5ЕсЕСТ или 61 РЕЕОВАСК представляет собой количество зарегистрированных попаданий или количество значений, помещенных в массив обратной связи; отрицательное число означает выход за границы (переполнение) массива.
Вы можете использовать параметр 61 йЕМОЕй ИОВЕ совместно с В16ес1псекегу() для получения идентификатора текущего режима. В следующем разделе описаны команды для манипулирования стеком имен. Создание стека имен Как упоминалось в предыдущем разделе, стек имен закладывает основу для возвращаемой вам информации выбора. Чтобы создать стек имен, сначала инициализируйте его командой В11п! (навез(), которая просто очищает стек, и затем добавьте целочисленные идентификаторы-имена во время выполнения соответствующих команд отображения. Как и следовало ожидать, команды, манипулирующие стеком, позволяют вам затолкнуть имя в него (В! Ризпйаве () ), вытолкнуть из него имя (В1Рорнаве()) и заменить имя на вершине стека другим (й11оабнаве()).
Листинг 13.1 демонстрирует, как программа может манипулировать стеком с помощью этих кома!Сд. Листинг 13.1. Создание стека имен я11птснавез(), я1Розпнаве(0); я1Розьнатгтх(); /* сохранение текущего соСтояния ПРеобразования /" здесь создается желаемый для вас видимый объем '/ й1(оабнаве( 1); бгаизовеОЬ)есС(); З1(оабнаве(2); ОгаидпослегОЬ)ест(): З1(оабкаве(З): бгаитеСАпогпегОЬ)есС(); Оган) озтопеногеОЬ)есС(); я1Рориасгтх(); /' восстановление предшествующего состояния преобразования '/ 470 Глава 13 ° Выбор и обратная связь В этом примере первые два рисуемых объекта имеют собственные имена, а третий и четвертый объекты совместно использу|от одно имя.