М. Ву, Т. Девис, Дж. Нейдер, Д. Шрайнер - OpenGL. Руководство по программированию (Библиотека программиста) (2006), страница 104
Описание файла
PDF-файл из архива "М. Ву, Т. Девис, Дж. Нейдер, Д. Шрайнер - OpenGL. Руководство по программированию (Библиотека программиста) (2006)", который расположен в категории "". Всё это находится в предмете "инженерная графика" из 5 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 104 страницы из PDF
Соответствующие записи реакции обрабатываются в процедуре ргосе5 5 Н1 сз (), а массив записей распечатывается. Первый треугольник генерирует запись, второй — нет, а третий и четвертый генерируют одну запись на двоих Листинг 13.2. Пример выбора: зе!есс.с уоЗо огаитг1апз1е(6(с1оас х1, 6((1оас у1, 61(1оас х2, 61(1оас у2, 6(с1оас хз, 6((1оас уз, 6(е1оас с) ( 61вех1п(6( Та1Ан6(Е5); В(Чег(ех31(х1, у1. с); 61ЧеггехЗС(х2, у2, х); В1НеггехЗС(хЗ, уЗ, с); В1Епо(); ) уо1О ОгаиЧЗеиЧосоее(6(С1оаС х1. 6(С1оаС х2.
6(С1оаС у1. 6((1оаС у2, 6111оаС с1, 6(С1оаС с2) ( В16о1огЗС(1,0, 1.В, 1.В); 61вех!п(6( 11ИЕ (ООР); В1Чег(ехЗС(х1, у1, -с1); лродолхгеиие Ф Выбор 473 рг(пСТ(" число имен = аб)п", павеь); р(г++; Рг7пСГ(" 21 = йй;", (Г)оаС) 'РСг/Вх/ГСТС((Г); РСг++; Рг(п(Е(" 22 = %91п", ((1оаС) 'РСг/Вху(ГГ((ГГ); РСг++; рг)псс(" имя = "); Сог () = 0; ) < навея; )++) ( /* для каждого имени */ рг(пСГ("Жб ", 'рег); р(г++; ) рг!пСГ("сп"); ) ) «бес(пе ВОР512Е 512 чо!б ье1есСОО)ес(а(чо(б) ( 6(о(пС ье1есСВнс[ВОЕ512Е]; 6()пС П!Са; 515е1есСВо(сег(ВОР512Е, ье1ессВос); (чо)б) 81йепбегМобе(6С 5ЕСЕСТ); 51[о(Сйавеа(); 81Роапйаве(8): 51Риалйа(г(х(); 5(йасг(хМобе(6С РНО)ЕСТ!ой); В)сааб[барс(су(); 510г(по(9,9, 5.8, 9,0. 5.8, 0.9, 19.8); 51йа(г(хйобе(6( МООЕСЧ1ЕН); 51Соаб1бепС!Су(); 51(оабйаве(1): бгануг(ап81е(2.9, 2.8, 3.0, 2.0, 2.5, 3.8, -5.0); 51(оабйаве(2); бганТг(ап81е(2.9, 7.0, Э.О, 7.0, 2.5, В.О, -5.0); 51Соабйаве(Э); бгаиТг(ап81е(2.8.
2.0, 3.8, 2.8, 2.5, Э.О, 9.0); бгануг!ап81е(2.9, 2.0, 3.0, 2.9, 2.5, 3.9, - 10.8): 51Рорйа(г!х(); 515)мал(); СИ!а = 81йепбегМобе(6С КЕНОЕЙ); ргосеаанзся(исса, ае1ессВог); ) ча(б ! п! С (чо! б) ( 51Епао)е(6С ОЕРТН ТЕ5Т); 515лабеМобе1(6( РСАТ),' ю(б б(яр1ау(чо)б) ( 8161еагСо1ог(8.9, 8.0, 0,0, 9.0); 5161еаг(6( СОСОК ВОРРЕЙ В!Т [ 6С ОЕРТН ВОЕЕЕН 81Т); продолжение нх 474 Глава 13 ° Выбор и обратная связь Листинг 13.2 (продолженое) бган5сепе(); зе1ессоь]ессз(): В1Е105П (); !пт ма!п(тпт вгзс, спвг'" агхч) ( В1цс1птт(йвгзс, агзч): В!цс(п!10!зр]вунобе(нсвт 5!Мв(В ( 0(вт ааз ~ 0(вт ОВРти); В1цт1п!СИ!пбон5!зе(2ВВ, 209); $1011п!тытпбонР0511(оп(!00, !ВВ)! В!о!стев!ен!пеон(агзч(В]); тптс(); В!о!в!яр!аурцпс(0!зр(ву); В1цсМв!псоор(); гесцгп 9; ) Выбор с помощью указателя мыши Процесс, описанный в предыдущем разделе, можно распространить на выбор объектов с помощью указателя мыши (р]с]с]пя).
Для этого вы логически умножаете специальную матрицу на матрицу проекции с целью ограничить рисование небольшой областью окна просмотра, обычно рядом с указателем мыши. Затем вы организуете некоторую форму для реакции на ввод, такой как щелчок кнопкой мыши, чтобы активировать режим выбора. При всех перечисленных соблюденных условиях объекты, отображаемые вблизи указателя мыши, вызывают реакцию системы.
Таким образом, во время такого выбора вы обычно определяете, какие объекты отображаются рядом с указателем. Выбор с помощью указателя организуется почти так же, как обычный режим выбора, со следующим основными различиями: ° Такой выбор обычно производится переключением состояния (!г]яяегет]) устройства позиционирования. В следующем примере кода нажатие левой кнопки мыши вызывает функцию, выполняющую выбор.
° Вы используете подпрограмму-инструмент а1цр(с]сна!г(х() для умножения текун!ей матрицы проекции на специальную матрицу. Эта процедура должна быть вызвана до операции умножения матриц (такой как В1црегзрес!(че О илн а!0 гС По() ). Вероятно, вы захотите сохранить предшествующее состояние матрицы проекции, соответственно, последовательность операций будет выглядеть так: В1Масгтхнобе(60 РВО)ЕСТ!Он); В1Ризпнатг!х(); В1соаб1бепт!Су(); В1цР!сКМвтг!х(...); В1цРегзрестзче, В!Ог!По, В1цогсПо20, ог В1Егцзтцю /*...
рисование сцены дпя выбора с помощью указателя; выполнение выбора ... "/ В1Рорнвтг!х(); Выбор 475 Другой кардинально отличный способ выполнения выбора указателем мыши описан в разделе «Использование фонового буфера для выбора объектов> главы 14. Эта техника основана на идентификации различных компонентов объекта по значениям цвета. чоЫ в)иртскиаггтк(С(х)оцЫе х, С(х[оччЫе у, С1с[опЫе ю(ч//Ь, Сч(.с[опЫе ЬечяЬС, СЫп1 тле/бриг/[/ч'[); Создает матрицу проекции, ограччичивающую рисование маленькой областью окна просмотра, и умножает матрицу на текущую матрицу в вершине стека.
Центр области выбора задается оконными координатами (х, у) обычно в положении указателя лчыши. П1ирина и/ч/1(Ь и высота Ье(дЬг определяют размер области выбора в координатах экрана. (То есть ширину и высоту можно интерпретировать как чувствительность устройства позиционирования.) Массив ичекрочт[1 содержит текущие координаты окна просмотра, которые могут быть получены вызовом я\Ое1101еяегч(01 Н1ЕиРОйт, 61!01 «ч!енрог1). Результат, вырабатываемый командой д10Р!СКМатг!х(), преобразуется в область отсечения — единичный куб, где — 1 < (х, у, г) < 1 (или -ш < (шх, и/у, шз) < и/).
Матрица выбора эффективно выполняет ортогональное преобразование, сводя- в(ее область отсечения к единичному кубу. Поскольку допускаются преобразования произвольного характера, вы можете делать различные действия над облагтью выбора — например, вращать прямоугольные участки окна. В отдельных ситуациях это легче, чем задавать дополнительные плоскости отсечения для опРеделеччия области выбора. Явстипг 13.3 иллюстрирует выбор, делаемый с помощью указателя мыши. Здесь также показано, как используется множество имен для идентификации различных компонентов примитива; в этом случае объектами выбора являются строка и столбец. Рисуется сетка из квадратов 3 к 3 различных цветов. Массив Ьолггч[3] [3[ !Ранит информацию о цветах для каждого квадрата. При нажатии левой кнопки выши вызывается процедура рчсх5ч)иагез(), которая идентифицирует квадратн, выбранные мышью.
С каждым квадратом сетки связаны два имени: одно— ыя строки и другое — для столбца. Также, когда нажимается левая кнопка мыши, ювеняются цвета всех квадратов, расположенных в позиции указателя. йвстииг 13.3. Пример выбора с помощью указателя мыши: р)с)чэ()ваге,с И! Ьоагб (3) (3); / ' количество цветов для каждого квадрата */ /* Сброс значении цвета для каждого квадрата доски '/ чочб !лч 1(ччочб) ( члт гог (! = 0; ! < 3,' !««) тбг (1 = О; ) < 3; ) ++) Ьовгб(ч1[)) = 0; 3)С)еагсо!ог(9.0, 0.0, 0.0, В.О), ) и(б бгви5ливгев(01елиж жббе) продолжение Ф 476 Глава 23 ° Выбор и обратная связь Листинг 13.3 '(продолжение) 6Си(пС т, 1ог (! =О; ! <3; т++) ( )1 (жопе == 6С 5ЕСЕСТ) В(Соапнаве(!); тот (] = О; ) < 3; ) <+> ( ! 1 (врое == 6С 5ЕСЕСТ) В]РозПМаве()); В[Со[ог31((6С1[оаС) [/З.В, (6С1[оаС) >/З,В, (6С1[оаС) Ьоагв[)][>]/3.0); В[Нес» (!.
). т<). >+[); ! 1 (воде == 6С 5ЕСЕСТ) В[Роряаве(): /' Процедура ргосеззН[Сз выводит содержимое массива записей реакции "/ чета ргосеззН(Сз(6СтпС П(Сз, 6Со[пС Ьоттег[]) ( цпз[йпед тпС [, 6Со(пС [т, )), павез, *ртг; рг[пС1("записей = йд'тп", П(Сз); ртг = (6(ц(пС *) Ьц[тег; 1ог (! = О; т < п[сз; [++) ( /* для каждой записи */ павез = 'рсг! рг[п(1(" число имен для данной записи = %!['тп", павез); рсг++; Рг!'п[1(" х1 = ВВ;", (1[оаС) "РСг/Вх71111111); РСг++; р» пС1(" з2 = ХВ'тп", (1[оаС) 'р(г/Ох71111111); ртг++; рг)пС1(" имена "); 1ог () = О; ) < павез; )++) ( /' для каждого имени '/ рг!п(1("ХО ", *р(г); т 1 () == О) /' установка строки и колонки )! = 'рсг; е[зе [1 () == [) )) = "рсг: рсг++; ргтп(1("(и"); Ьоагп[тт] ())] = (Ьоагп(т!] [))] < С> Х 3: №Ое1[пе ВО15[2Е 512 чо(О ртсй5диагез((пС Ьо(Соп, зпС зеа(е, тпС х, !пС у) ( 6[и[и! яе]есСВцв[ВОР512Е]: 6СтпС Пттз; 6СтпС ч[енрагС[4]; Выбор 477 т( <Сот<оп .= 660т <Ерт ВОТТОН [[ атаев <= 6<От ООИН> гесцгп; 916ес1псевегч(6с ч1еиРОйт, чтеирогс); 915Е!ЕССВис(ЕГ(ВОГ511Е, ЗЕ1ЕССВЦГ); [ (ЧО<б) 91йЕПбЕГМОбЕ(6С 5ЕСЕСТ); 911п!<Навез(); Всрцзииаве<9); 91ИаСгтхИобе( 6!.
Рйо)ЕСТ1ОН); 91РцзПИаегтх(): 91Соаб1бепС<Су(); <' создает область выбора разиером 5х5 пиксепов в позиции указателя */ 91цР<<ййатг<х((6(боцб<е) х, (6Сбоцб)е) (ч<еирогС[3) - у), 5.9, 5.0, чтеирогС); асцОгСПого<Е.Е, 3.О, О,Е, 3.9>; бгаи5оцагез(6С 5ЕСЕСТ); 91Ма<гтхМобе(6С Рйо>ЕСТ10Н); 91Рорйа<гтх(); 91Р1цзп(); П<Сз = В>йепбегйобе<66 йЕНОЕй>; ргосеззН<Сз(и<Сз, зе1ествцс); 91цсРозсйебтзр1ау(); т чотб б<зр1ау(чо<б) ( 91С1еаг(6С СО(Ой ВОРРЕй В1Т); бгаи5пцагез(6С йЕНОЕй); В<Р)цзи<>; ) чо<б гезпаре(<пс и, тпс и) В<Ч<еирогС(9, О, и, П); 91ИаСг<хМобе(6С РВО>ЕСТ10М); 91Соаб1бепС<Су<); 91иО о20(О.О, 3.0, 9.0, 3.9): 91Ма<гтхМобе<6С НООЕСЧ1ЕИ); 91Соаб1бепС<Су(); ) <пс ватп(тпс агвс, спаг*' агеч) [ ВсцС1п<С(еагвс, агвч); В!цС1п<СОтзр1ауМобе(ОСОТ 51НОСЕ [ 6(ОТ й6В); 91цС1п<СИтпбои5<се(199, 190): 91цС1п<СИ<пбоиРоз<С<оп(199, 100); 91цССгеатеи<пбои(агвч[9[): <п<с(): продопжение,р 478 Глава 13 к Выбор и обратная связь Листинг 13.3 (продолжение) В1о1номвеуопс(р)сх5ямагев); Р1итаевларегмпс(гевларе); 51и10аар)ауямпс(б1ар1ау); 51отна1псоор(); гетогп Е, Выбор мышью с помощью составных имен и иерархической модели Составные имена могут также использоваться для выбора части иерархического объекта сцены.
Например, если вы отображаете сборочную линию автомобилей, может потребоваться позволить пользователю передвинуть мышь и выделить третий болт на передней стороне колеса третьего автомобиля на линии. Для идентификации каждого уровня иерархии можно использовать отдельные имена: автомобиля, колеса и болта. Но есть и другой вариант, когда одним именем можно описать только одну молекулу во множестве молекул, где дополнительными именами можно различить отдельные атомы, принадлежащие молекуле. Листинг 13.4 — зто модификация листинга ЗА, где рисовался автомобиль с четырьмя одинаковыми колесами, а каждое колесо имело пять идентичных болтов.
Код был дополнен лишь манипуляциями со стеком имен в иерархической модели объектов. Листинг 13.4. Создание составных имен бган иьее1 апб Ьо)тв() ( )опв 1; бган инее) Ьобу(); (1 = 0; 1 < 5; 1++) ( 51РмвьМасг(х(); В)Рогато(у).В'1, В.Е, В,В, В1тгапв1асе((3.0, 0.0, 0.0)) 61Ривлнаве(1); бган Ьо(г Ьобу(); В1Рорнаве(); к1РорМасг1х(); бган Ьобу апб илее1 апб Ьо1тв() ( бган саг Ьобу(); З1Ровлнасг)х(); 51тгапв1асе(40, О, 20); /* положение первого колеса */ З1Ривпмаве(1)) /* имя колеса с номером 1 */ бган илее( апб Ьа1(в(): З1Рорнаве(); а1РорМагг1х(): к1Рмялнагг!х(),' В1тгапв1асе(40, О, -20); /* положение второго колеса */ Выбор 479 к1РивПйаве(2); l* имя капесв с номером 2 *I бган иПее1 апб Ьо11в(); д1Рорйаве(); к1РорйаСг!х(); М аналогичное рисование дпя двух других колес Листинг 13.5.
Использование составных имен бган тпгее свгв() ( к11п ! (навея (); Х1Ровпйа1г!х(); сгапк1вте Со !!тот саг роя!С!оп(); к)Рокпйаве(1); бган Ьобу апб илее1 апб ЬЬ1(в(): Б1Рорйаве(); Б1Рорйатг!х(): к)яовпиасг!х(); тгвпв1ате то яесопб саг ров!т!оп(); к1Рпвпйвве(2); бгви Ьобу апб ипее1 апб Ьо11в(); Б1Рорйаве(); к)Рорнатг!х(); $1РО5ПМатг!х(); тгапь1вте то тптгб свг ров!1!оп(); В1Рняпйаве(3); бган Ьобу апб ипее1 апб Ьо1(в(); Х1Рорйаве(); к1РорМасг!х(); ) Предположилт, что выбор сделан. Ниже показаны некоторые возможные возвра- иаемые из стека имен значения и их интерпретация. В этих примерах в большип- пве возвращается одна запись реакции; с(1 и с(2 — значения глубины. 2б1 б221 Явтомобиль 2, колесо 1 Корпус автомобиля 3 Болт О на колесе !автомобиля 1 1б) б2 3 3 Й б2 1 1 0 Попытка выбора за пределами всех автомобилей пусто Последняя интерпретация исходит из того, что в одной области выделения нельзя одновременно выбрать болт и колесо.