/
Автор: Херн Д. Паулин Бейкер М.
Теги: компьютерные технологии программирование компьютерная графика
ISBN: 5-8459-0772-1
Год: 2005
Текст
Этот файл был взят с сайта http://all-ebooks.com Данный файл представлен исключительно в ознакомительных целях. После ознакомления с содержанием данного файла Вам следует его незамедлительно удалить. Сохраняя данный файл вы несете ответственность в соответствии с законодательством. Любое коммерческое и иное использование кроме предварительного ознакомления запрещено. Публикация данного документа не преследует за собой никакой коммерческой выгоды. Эта книга способствует профессиональному росту читателей и является рекламой бумажных изданий. Все авторские права принадлежат их уважаемым владельцам. Если Вы являетесь автором данной книги и её распространение ущемляет Ваши авторские права или если Вы хотите внести изменения в данный документ или опубликовать новую книгу свяжитесь с нами по email.
ТРЕТЬЕ ИЗДАНИЕ
ТРЕТЬЕ ИЗДАНИЕ Компьютерная графика и стандарт DpenGL Дональд Херн М. Паулин Бейкер Факультет информатики и Лаборатория глобальных технологий визуализации и интерактивных пространств университет Индианы, университет Пердью ВИЛЬЯМС К4 Издательский дом "Вильямс” Москва ♦ Санкт-Петербург ♦ Киев 2005
ББК 32.973.26-018.2.75 Х39 УДК 681.3.07 Издательский дом “Вильямс” Зав. редакцией С.Н. Тригуб Перевод с английского И.Ю. Дорошенко, А.В. Назаренко Под редакцией А.В. Назаренко По общим вопросам обращайтесь в Издательский дом “Вильямс” по адресу: info@williarnspublishing.com, http://www.williamspublishing.com Херн, Дональд, Бенкер, М. Паулин. Х39 Компьютерная графика и стандарт OpenGL, 3-е издание. : Пер. с англ. — М. : Изда- тельский дом “Вильямс”, 2005. — 1168 с. (+48 с. цв. ил.): ил. — Парад, тит. англ. ISBN 5-8459-0772-1 (рус.) Предполагая, что читатели абсолютно не знакомы с компьютерной графикой, авторы (признанные авторитеты в данной области) доступно изложили основные принципы, требуемые для разработки, использования и понимания систем компьютерной графики. В данной книге математика и физика ор- ганично сочетаются с программированием с использованием OpenGL. Предлагаемый подход оптима- лен, если ставится задача изучить теоретическую и практическую стороны двух- и трехмерной графи- ки. Текст написан понятно, четко и без лишних отступлений; материал иллюстрируется с помощью прекрасных диаграмм и примеров. Книга удачно структурирована, ее удобно использовать и как учебник, и как справочник, в ней приводятся примеры кодов C++ и OpenGL и все математические ал- горитмы, которые нужны для низкоуровневого программирования в сфере компьютерной графики. Книга рассчитана на пользователей средней и высокой квалификации, студентов и аспирантов соответствующих специальностей. ББК 32.973.26-018.2.75 Вес названия программных продуктов являются зарегистрированными торговыми марками соответствующих фирм. Никакая часть настоящего издания ни в каких целях нс может быть воспроизведена в какой бы то ни было фор- ме и какими бы то ни было средствами, будь то электронные или механические, включая фотокопирование и запись на магнитный носитель, если на это нет письменного разрешения издательства Pearson Prentice Hall. Authorized translation from the English language edition published by Pearson Prentice Hall, Copyright © 2005, 1994, 1986 by Donald Hearn and M. Pauline Baker All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechani- cal, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher. Russian language edition published by Williams Publishing House according to the Agreement with R&l Enterprises International, Copyright © 2005 ISBN 5-8459-0772-1 (pyc.) ISBN 0-13-015390-7 (англ.) © Издательский дом “Вильямс", 2004 © 2004, 1994, 1986 by Donald Hcam and M. Pauline Baker
Оглавление Предисловие 30 1. Обзор компьютерной графики 36 2. Краткий обзор графических систем 74 3. Выходные графические примитивы 142 4. Атрибуты графических примитивов 264 5. Геометрические преобразования 346 6. Двухмерное наблюдение 436 7. Трехмерное наблюдение 498 8. Представления трехмерных объектов 572 9. Методы исследования видимых поверхностей 734 10. Модели освещения и методы визуализации поверхностей 774 И. Методы интерактивного ввода и графические интерфейсы пользователя 918 12. Модели цвета и применение цвета 972 13. Компьютерная анимация 998 14. Иерархическое моделирование 1028 15. Форматы графических файлов 1042 А. Математика компьютерной графики 1067 Литература 1119 Предметный указатель 1144 Алфавитный указатель функций OpenGL 1155
Содержание Предисловие Особенности третьего издания Примеры программирования Требуемые знания Предлагаемые курсы Благодарности 30 30 31 32 32 33 И Обзор компьютерной графики 36 1.1. Графики и диаграммы 1.2. Автоматизированное проектирование 1.3. Виртуальная реальность 1.4. Визуализация данных 1.5. Обучение 1.6. Компьютерное искусство 1.7. Развлечения 1.8. Обработка изображений 1.9. Графические пользовательские интерфейсы 1.10. Резюме 37 40 46 48 56 60 66 69 71 73 Литература 73
Содержание 7 Краткий обзор графических систем 74 2.1. Приборы с мониторами 75 Электронно-лучевые трубки с регенерацией 75 Дисплеи растрового сканирования 80 Дисплеи с выборочным сканированием 83 Цветные мониторы с ЭЛТ 85 Дисплеи с плоским экраном 87 Приборы с трехмерным изображением 92 Стереоскопические системы и виртуальная реальность 93 2.2. Системы растрового сканирования 96 Видеоконтроллер 96 Процессор дисплея с растровым сканированием 99 2.3. Графические рабочие станции и системы создания изображений 102 2.4. Устройства ввода 106 Клавиатура, блок кнопок и круговая шкала 106 Мышь 107 Трекболы и пространственные манипуляторы 109 Джойстик 109 Информационные перчатки 110 Цифровой преобразователь 110 Сканеры изображений 114 Сенсорная панель 115 Световое перо 117 Голосовые системы 118 2.5. Устройства выдачи документальных копий 118 2.6. Графические сети 120 2.7. Графика в сети Internet 121 2.8. Графическое программное обеспечение 122 Координатные представления 123 Графические функции 125 Стандарты программного обеспечения 126 Другие графические пакеты 128 2.9. Знакомство с OpenGL 128 Основной синтаксис OpenGL 129
8 Содержание Родственные библиотеки 129 Файлы заголовков 130 Управление окнами изображения с помощью библиотеки GLUT 131 Полная программа OpenGL 133 2.10. Резюме 137 Литература 139 Упражнения 140 Я Выходные графические примитивы 142 3.1. Системы координат 144 Экранные координаты 144 Абсолютные и относительные координаты 146 3.2. Задание двухмерной внешней системы координат в OpenGL 147 3.3. Функции точек в OpenGL 148 3.4. Функции прямых в OpenGL 150 3.5. Алгоритмы построения прямых линий 152 Уравнение прямой 153 Алгоритм ЦДА 155 Алгоритм построения прямых линий Брезенхема 157 Изображение ломаных линий 164 3.6. Параллельные алгоритмы построения прямых 164 3.7. Запись значений в буфер кадров 167 3.8. Функции кривых в OpenGL 168 3.9. Алгоритмы построения окружностей 168 Свойства окружностей 169 Алгоритм построения окружности методом средней точки 172 3.10. Алгоритмы построения эллипсов 178 Свойства эллипсов 178 Алгоритм средней точки для эллипса 181 3.11. Другие кривые 189 Конические сечения 190 Полиномы и сплайны 193 194 3.12. Параллельные алгоритмы построения кривых
Содержание 9 3.13. Адресация пикселей и геометрия объектов 195 Координаты сетки экрана 195 Сохранение геометрических свойств изображаемых объектов 196 3.14. Закрашенные области 200 3.15. Закрашенные многоугольники 201 Классификация многоугольников 202 Распознавание вогнутых многоугольников 203 Деление вогнутых многоугольников 204 Разделение выпуклого многоугольника на набор треугольников 206 Проверки “внутри-снаружи” 206 Таблицы многоугольников 210 Уравнения плоскости 212 Передние и задние грани многоугольника 214 3.16. Функции закрашивания многоугольников в OpenGL 216 3.17. Массивы вершин в OpenGL 225 3.18. Примитивы пиксельных массивов 228 3.19. Функции пиксельных массивов в OpenGL 229 Функция битового отображения OpenGL 229 Функция пиксельного отображения OpenGL 231 Растровые операции OpenGL 232 3.20. Примитивы символов 234 3.21. Функции изображения символов в OpenGL 237 3.22. Деление рисунка на части 239 3.23. Таблицы отображений в OpenGL 239 Создание и наименование таблиц отображений в OpenGL 239 Реализация таблиц отображений в OpenGL 241 Удаление таблицы отображений в OpenGL 242 3.24. Функция изменения формы окна изображения в OpenGL 242 3.25. Резюме 246 Примеры программ 251 Литература 259 Упражнения 259
10 Содержание Атрибуты графических примитивов 264 4.1. Параметры состояния в OpenGL 266 4.2. Цвет и шкала яркости 267 Цветовые компоненты RGB 267 Таблицы цветов 268 Шкала яркости 269 Другие цветовые параметры 270 4.3. Функции цвета в OpenGL 270 Цветовые режимы RGB и RGBA в OpenGL 270 Индексный цветовой режим в OpenGL 272 Смешивание цветов в OpenGL 273 Цветовые массивы в OpenGL 275 Другие функции цвета в OpenGL 276 4.4. Атрибуты точек П1 4.5. Атрибуты прямых линий 278 Ширина линии 278 Стиль линии 281 Опции перьев и кистей 282 4.6. Атрибуты кривых 284 4.7. Функции атрибутов точек в OpenGL 287 4.8. Функции атрибутов прямых линий в OpenGL 288 Функция для задания ширины линии в OpenGL 288 Функция OpenGL стиля линии 289 Другие эффекты прямых линий в OpenGL 291 4.9. Атрибуты закрашенных фигур 292 Стили закрашивания 292 Области, заполненные с использованием смешивания цветов 295 4.10. Общий вид растрового алгоритма закрашивания многоугольников 297 4.11. Построчное закрашивание выпуклых многоугольников 303 4.12. Построчное закрашивание фигур с криволинейными границами 303 4.13. Способы заполнения фигур с неправильными границами 304 Алгоритм граничного заполнения Алгоритм потокового заполнения 4.14. Функции атрибутов закрашенных фигур в OpenGL 304 309 310
Содержание 11 Функция шаблона заполнения в OpenGL 310 Текстурные и интерполяционные шаблоны в OpenGL 312 Контурные методы в OpenGL 313 Функция передней стороны в OpenGL 316 4.15. Атрибуты символов 317 4.16. Функции атрибутов символов в OpenGL 322 4.17. Защита от наложения 323 Сверхдискретизация прямолинейных отрезков 325 Маски удельного веса подпикселей 327 Дискретизация прямолинейных отрезков по площади 328 Методы фильтрации 329 Фазировка пикселей 329 Компенсация различий в интенсивности линии 329 Устранение контурных неровностей границ фигур 330 4.18. Функции OpenGL защиты от наложения 334 4.19. Функции запроса в OpenGL 335 4.20. Группы атрибутов в OpenGL 336 4.21. Резюме 337 Литература 341 Упражнения 342 Геометрические преобразования 346 5.1. Базовые двухмерные геометрические преобразования 348 Двухмерная трансляция 348 Двухмерный поворот 351 Двухмерное масштабирование 354 5.2. Матричные представления и однородные координаты 357 Однородные координаты 358 Матрица двухмерной трансляции 359 Матрица двухмерного поворота 359 Матрица двухмерного масштабирования 360 5.3. Обратные преобразования 360 5.4. Двухмерные сложные преобразования 361 Сложные двухмерные трансляции 362
12 Содержание Сложные двухмерные повороты 362 Сложное двухмерное масштабирование 363 Произвольный двухмерный поворот вокруг оси 363 Общее двухмерное масштабирование относительно неподвижной точки 364 Произвольные двухмерные направления масштабирования 365 Свойства произведения матриц 366 Произвольные двухмерные сложные преобразования и вычислительная эффективность 367 Двухмерные жесткие преобразования 369 Построение двухмерных матриц поворота 370 Пример программирования двухмерной сложной матрицы 371 5.5. Другие двухмерные преобразования 376 Отражение 376 Сдвиг 381 5.6. Растровые методы геометрических преобразований 383 5.7. Растровые преобразования в OpenGL 386 5.8. Переход между двухмерными системами координат 387 5.9. Геометрические преобразования в трехмерном пространстве 390 5.10. Трехмерная трансляция 391 5.11. Трехмерный поворот 393 Трехмерные повороты вокруг координатной оси 393 Произвольные трехмерные повороты 396 Использование кватернионных методов в расчете трехмерных поворотов 404 5.12. Трехмерное масштабирование 409 5.13. Сложные трехмерные преобразования 412 5.14. Другие трехмерные преобразования 416 Трехмерные отражения 416 Трехмерные сдвиги 417 5.15. Переход между трехмерными системами координат 418 5.16. Аффинные преобразования 419 5.17. Функции геометрических преобразований в OpenGL 419 Базовые геометрические преобразования OpenGL 420 Операции с матрицами в OpenGL 421 Стеки матриц в OpenGL 423
Содержание 13 Пример программирования геометрических преобразований в OpenGL 425 5.18. Резюме 429 Литература 431 Упражнения 432 Двухмерное наблюдение 436 6.1. Двухмерный конвейер наблюдения 6.2. Отсекающее окно Отсекающее окно в координатах наблюдения Отсекающее окно во внешних координатах 6.3. Нормировка и преобразование поля просмотра Отображение окна отсечения в нормированное поле просмотра Отображение отсекающего окна в нормированный квадрат Изображение строк символов Расщепление экрана и несколько устройств вывода 6.4. Функции двухмерного наблюдения OpenGL Режим проектирования OpenGL Функция отсекающего окна GLU Функция поля просмотра OpenGL Создание окна на экране дисплея GLUT Установка режима и цвета окна (GLUT) Идентификатор GLUT окна изображения Удаление окна GLUT с экрана дисплея Текущее окно на экране GLUT Замещение и изменение размера окна на экране (GLUT) Управление несколькими окнами на экране (GLUT) Субокна GLUT Выбор формы курсора окна на экране Наблюдение графических объектов в окне экрана GLUT Выполнение прикладной программы Другие функции GLUT Пример программы двухмерного наблюдения OpenGL 6.5. Алгоритмы отсечения 437 440 441 442 443 444 446 448 448 449 449 449 450 451 452 452 453 453 453 454 455 455 456 456 456 457 459
14 Содержание 6.6. Двухмерное отсечение точки 6.7. Двухмерное отсечение линии Отсечение линий Коэна-Сазерленда Отсечения линии Лианга-Барски Отсечение линии Николла-Ли-Николла Отсечение линий с использованием непрямоугольных многоугольных окон Отсечение линий с использованием окон с нелинейными границами 6.8. Отсечение многоугольной закрашенной области Отсечение многоугольниками Сазерленда-Ходгмана Алгоритм отсечения многоугольников У Эйлера-Азертона Обработка многоугольников с использованием непрямоугольных отсекающих окон Обработка многоугольника с использованием отсекающих окон с нелинейными границами 6.9. Отсечение кривых 6.10. Отсечение текста 460 460 462 468 472 475 476 477 479 485 487 488 489 490 6.11. Резюме 491 Литература Упражнения 495 495 Трехмерное наблюдение 498 7.1. Обзор концепций трехмерного наблюдения Наблюдение трехмерной сцены Проекции Упорядочение по глубине Определение видимых линий и поверхностей Визуализация поверхностей Разобранный вид и вид в разрезе Трехмерное и стереоскопическое наблюдение 7.2. Трехмерный конвейер наблюдения 7.3. Параметры трехмерного наблюдения Вектор нормали к плоскости наблюдения Вектор верха 499 500 500 501 502 503 504 504 505 508 508 509
Содержание 15 Эталонная система наблюдения uvn 510 Генерация эффектов трехмерного наблюдения 511 7.4. Преобразование из внешних координат в координаты наблюдения 514 7.5. Преобразования проектирования 515 7.6. Ортогональные проекции 516 Аксонометрические и изометрические ортогональные проекции 516 Координаты ортогональной проекции 518 Отсекающее окно и объем наблюдения ортогональной проекции 518 Нормировка ортогональной проекции 520 7.7. Косоугольные параллельные проекции 523 Косоугольные параллельные проекции в черчении и проектировании 524 Косоаксонометрические и кабинетные параллельные проекции 525 Вектор косоугольной параллельной проекции 526 Отсекающее окно и объем наблюдения косоугольной параллельной проекции 527 Матрица косоугольной параллельной проекции 528 Нормировка косоугольной параллельной проекции 529 7.8. Перспективные проекции 530 Координаты перспективной проекции 531 Уравнения перспективной проекции: частные случаи 531 Точки схождения перспективных проекций 533 Объем наблюдения для перспективной проекции 535 Матрица перспективной проекции 536 Симметричная пирамида перспективной проекции 538 Усеченная пирамида косоугольной перспективной проекции 542 Нормированные координаты перспективной проекции 545 7.9. Преобразования поля просмотра и трехмерные экранные координаты 548 7.10. Функции трехмерного наблюдения OpenGL 549 Функция OpenGL преобразования наблюдения 549 Функция ортогональной проекции OpenGL 550 Функции OpenGL симметричной перспективной проекции 552 Функции OpenGL произвольной перспективной проекции 553 Поля просмотра и окна на экране OpenGL 553 Пример программы трехмерного наблюдения OpenGL 554 7.11. Трехмерные алгоритмы отсечения 556
16 Содержание Отсечение в трехмерных однородных координатах Трехмерные коды областей Трехмерное отсечение точек и линий Трехмерное отсечение многоугольников Трехмерное отсечение кривых Произвольные плоскости отсечения 7.12. Дополнительные плоскости отсечения в OpenGL 7.13. Резюме 557 558 559 562 564 564 567 568 Литература Упражнения 569 570 Я Представления трехмерных объектов 572 8.1. Многогранники 8.2. Функции многогранников OpenGL Функции OpenGL заполнения области многоугольника Функции GLUT правильных многогранников Пример программы GLUT построения многогранников 8.3. Криволинейные поверхности 8.4. Поверхности второго порядка Сфера Эллипсоид Тор 8.5. Суперквадрики Суперэллипс Суперэллипсоиды 8.6. Функции OpenGL поверхностей второго и третьего порядка Функции GLUT поверхностей второго порядка Функция GLUT изображения чайника с помощью кубических поверхностей Функции GLU поверхностей второго порядка Пример программы с использованием функций GLUT и GLU для создания поверхностей второго порядка 8.7. Каплевидные объекты 8.8. Сплайновые представления 574 575 575 575 577 579 579 579 580 581 583 583 584 584 584 586 587 590 592 594
Содержание 17 Интерполяция и аппроксимация сплайнами 595 Параметрические условия непрерывности 597 Условия геометрической непрерывности 599 Спецификация сплайна 599 Сплайновые поверхности 601 Настройка сплайновых поверхностей 601 8.9. Методы интерполяции кубическими сплайнами 602 Естественные кубические сплайны 603 Эрмитова интерполяция 604 Фундаментальные сплайны 607 Сплайны Коханека-Бартелса 609 8.10. Сплайновые кривые Безье 611 Уравнения кривых Безье 612 Пример программы генерации кривых Безье 614 Свойства кривых Безье 617 Методы проектирования с использованием кривых Безье 618 Кубические кривые Безье 620 8.11. Поверхности Безье 622 8.12. Би-сплайны 624 Уравнение би-сплайна 624 Равномерные периодические би-сплайны 626 Кубические периодические би-сплайны 630 Открытые равномерные би-сплайны 632 Неравномерные би-сплайны 634 8.13. Би-сплайновые поверхности 636 8.14. Бета-сплайны 636 Условия непрерывности бета-сплайнов 637 Кубическое периодическое матричное представление бета-сплайнов 638 8.15. Рациональные сплайны 638 8.16. Преобразование между сплайновыми представлениями 641 8.17. Отображение сплайновых кривых и поверхностей 643 Правило Горнера 643 Расчет по правым разностям 644 Методы подразделения 646
18 Содержание 8.18. Функции OpenGL аппроксимации сплайнами 649 Функции OpenGL сплайнов Безье 649 Функции OpenGL поверхностных сплайнов Безье 653 Функции би-сплайновых кривых GLU 656 Функции GLU би-сплайновых поверхностей 658 Функции GLU обрезки поверхности 661 8.19. Заметающее представление 663 8.20. Методы конструктивной стереометрии 664 8.21. Октодеревья 668 8.22. BSP-деревья 671 8.23. Методы фрактальной геометрии 671 Процедуры генерации фракталов 673 Классификация фракталов 674 Фрактальная размерность 674 Геометрическое построение детерминированных самоподобных фракталов 678 Геометрическое построение статистически самоподобных фракталов 682 Методы построения аффинных фракталов 684 Методы случайного смещения средней точки 685 Управление топографией ландшафта 689 Фракталы многократного возведения в квадрат 691 Самообратные фракталы 705 8.24. Грамматики форм и другие процедурные методы 707 8.25. Системы многих частиц 710 8.26. Физическое моделирование 713 8.27. Визуализация наборов данных 715 Визуальное представление скалярных полей 716 Визуальное представление векторных полей 721 Визуальное представление тензорных полей 723 Визуальное представление многомерных полей данных 725 8.28. Резюме 726 Литература 731 Упражнения 731
Содержание 19 Я Методы исследования видимых поверхностей 734 9.1. Классификация алгоритмов исследования видимых поверхностей 9.2. Детектирование невидимых поверхностей 9.3. Метод буфера глубины 9.4. Метод А-буфера 9.5. Метод строк развертки 9.6. Метод сортировки по глубине 9.7. Метод BSP-дерева 9.8. Методы деления области 9.9. Методы октодеревьев 9.10. Метод расчета луча 9.11. Сравнение методов исследования видимых поверхностей 9.12. Криволинейные поверхности Представления криволинейных поверхностей Графики контуров поверхности 9.13. Методы определения видимости для каркасных изображений Алгоритмы исследования видимых поверхностей для каркасных объектов 736 736 738 742 744 746 751 752 755 757 758 759 760 760 762 762 Алгоритм затухания с глубиной для каркасных объектов 9.14. Функции исследования видимых поверхностей в OpenGL Функции отбора многоугольников OpenGL Функции буфера глубины OpenGL Методы OpenGL исследования видимых каркасных поверхностей Функции OpenGL затухания с глубиной 9.15. Резюме 763 764 764 765 767 767 768 Литература Упражнения 769 769 Ш Модели освещения и методы визуализации поверхностей 774 10.1. Источники света 776 Точечные источники света 777 Бесконечно удаленные источники света 778
20 Содержание Радиальное затухание интенсивности 778 Источники направленного света и прожекторные эффекты 779 Угловое затухание интенсивности 780 Неточечные источники света и модель Вона 782 10.2. Эффекты освещения поверхности 783 10.3. Стандартные модели освещения 784 Рассеянный свет 785 Диффузное отражение 785 Зеркальное отражение и модель Фонга 789 Объединенное диффузное и зеркальное отражение 795 Диффузное и зеркальное отражение от нескольких источников света 796 Излучение света с поверхности 796 Стандартная модель освещения с затуханием интенсивности и источниками направленного света 797 Вопросы, касающиеся RGB-цветов 798 Другие формы представления цвета 800 Яркость 800 10.4. Прозрачные поверхности 801 Полупрозрачные материалы 802 Преломление света 803 Стандартная модель прозрачности 805 10.5. Атмосферные эффекты 806 10.6. Тени 807 10.7. Параметры камеры 808 10.8. Отображение интенсивности света 809 Распределение уровней интенсивности 809 Гамма-коррекция и таблицы видеосоответствий 810 Вывод на экран тоновых изображений 813 10.9. Полутоновые шаблоны и методы псевдослучайного шума 814 Полутоновые аппроксимации 814 Методы введения псевдослучайного шума 819 10.10. Методы визуализации многоугольников 822 Визуализация поверхностей постоянной интенсивности 823 Визуализация поверхностей по методу Гуро 824 Визуализация поверхности по Фонгу 827
Содержание 21 Быстрая визуализация поверхности по Фонгу 828 10.11. Методы построения хода лучей 829 Стандартный алгоритм построения хода лучей 831 Расчет пересечения луча с поверхностью 834 Пересечение лучом сферы 836 Пересечения луча с многогранником 837 Сокращение вычислений при решении задачи пересечения лучом объекта 838 Методы деления пространства 839 Имитация эффектов фокусировки камеры 844 Построение лучей без наложения 846 Распределенное построение хода лучей 849 10.12. Модели диффузного отражения 852 Слагаемые лучистой энергии 853 Стандартная модель диффузного отражения 856 Метод прогрессивного уточнения диффузного отражения 861 10.13. Отображение среды 863 10.14. Отображение фотонов 866 10.15. Сложение деталей поверхности 866 10.16. Моделирование деталей поверхности многоугольниками 870 10.17. Наложение текстуры 870 Линейные текстурные узоры 871 Поверхностные текстурные узоры 872 Объемные текстурные узоры 876 Узоры с сокращенной текстурой 877 Методы процедурного текстурирования 877 10.18. Отображение шероховатости 878 10.19. Отображение кадра 881 10.20. Функции освещения и визуализации OpenGL 882 Функции OpenGL для задания точечных источников света 882 Положение и тип источника света OpenGL 882 Цвета источников света OpenGL 884 Коэффициенты радиального затухания интенсивности источников света OpenGL 884 Направленные источники света (прожекторы) OpenGL 885 Параметры глобального освещения OpenGL 886
22 Содержание Функция свойств поверхности OpenGL 888 Модель освещения OpenGL 889 Атмосферные эффекты OpenGL 890 Функции прозрачности OpenGL 891 Функции визуализации поверхности OpenGL 893 Операции формирования полутонового изображения OpenGL 894 10.21. Текстурные функции OpenGL 895 Функции линейных текстур OpenGL 895 Функции OpenGL для поверхностных текстур 899 Функции OpenGL для объемных текстур 901 Опции цвета текстурных узоров OpenGL 902 Опции отображения текстуры в OpenGL 902 Текстурное обрамление в OpenGL 903 Копирование текстурных узоров OpenGL из буфера кадров 904 Массивы координат текстуры OpenGL 904 Присвоение имен текстурным узорам OpenGL 905 Текстурные подузоры OpenGL 906 Сокращенные текстурные узоры OpenGL 906 Границы текстуры OpenGL 908 Заместители текстуры в OpenGL 908 Автоматическое текстурирование поверхностей второго порядка 909 Однородные текстурные координаты 909 Дополнительные возможности текстур OpenGL 910 Литература 915 Упражнения 915 ilB Методы интерактивного ввода и графические интерфейсы пользователя 918 11.1. Графические входные данные 919 11.2. Логическая классификация устройств ввода 920 Устройства ввода координаты 920 Устройства ввода набора координат 921 Устройства ввода строк 921 Устройства ввода скалярных значений 921
Содержание 23 Устройства выбора 923 Указки 923 11.3. Функции ввода графических данных 926 Режимы ввода 926 Обратная связь с дублированием 927 Функции обратного вызова 927 11.4. Интерактивные технологии построения изображений 928 Основные методы размещения 928 Перетаскивание 928 Условия 928 Сетки 929 Методы эластичной графики 930 Поле тяжести 931 Методы интерактивного рисования и живописи 932 11.5. Среды виртуальной реальности 933 11.6. Интерактивные функции устройств ввода OpenGL 933 Функции GLUT (мышь) 934 Функции GLUT (клавиатура) 939 Функции GLUT (планшет) 945 Функции GLUT (спейсбол) 945 Функции GLUT (поле клавиш) 946 Функции GLUT (наборные диски) 946 Указки в OpenGL 947 11.7. Функции меню OpenGL 953 Создание меню GLUT 954 Создание нескольких меню GLUT и управление ими 957 Создание подменю GLUT 958 Модификация меню GLUT 961 11.8. Разработка графического пользовательского интерфейса 962 Диалог с пользователем 962 Окна и пиктограммы 963 Учет различных уровней подготовки 963 Согласованность 964 Минимизация использования памяти 964 Резервное копирование и обработка ошибок 964
24 Содержание Обратная связь 965 11.9. Резюме 966 Литература Упражнения 968 969 12 Модели цвета и применение цвета 972 12.1. Свойства света 973 Электромагнитный спектр 973 Психологические характеристики цвета 975 12.2. Модели цвета 976 Основные цвета 977 Интуитивное восприятие цвета 978 12.3. Стандартные основные цвета и диаграмма цветности 978 Модель цвета XYZ 979 Нормированные значения XYZ 979 Диаграмма цветности МКО 980 Цветовые гаммы 981 Дополнительные цвета 982 Преобладающая длина волны 982 Чистота 983 12.4. Модель цвета RGB 983 12.5. Семейство моделей YIQ 985 Параметры YIQ 985 Преобразования между пространствами цветов RGB и YIQ 986 Системы YUV и YCrCb 987 12.6. Модели цвета CMY и CMYK 987 Параметры CMY 987 Преобразования между пространствами CMY и RGB 988 12.7. Модель цвета HSV 989 Параметры HSV 989 Выбор теней, оттенков и тонов 990 Преобразования между пространствами цветов HSV и RGB 991 12.8. Модель цвета HLS 993 12.9. Выбор цвета и приложения 995
Содержание 25 12.10. Резюме Литература Упражнения 995 996 997 ЕЯ Компьютерная анимация 998 13.1. Растровые методы компьютерной анимации Двойная буферизация Создание анимации с помощью растровых операций 13.2. Проектирование анимационных сюжетов 13.3. Традиционные методы анимации 13.4. Общие функции компьютерной анимации 13.5. Языки компьютерной анимации 13.6. Системы ключевых кадров Трансформация Имитация ускорения 13.7. Спецификация движения Прямая спецификация движения Целенаправленные системы Кинематика и динамика 13.8. Анимация шарнирной фигуры 13.9. Периодическое движение 13.10. Процедуры анимации OpenGL 13.11. Резюме 1000 1001 1002 1002 1004 1006 1006 1008 1008 1011 1015 1015 1016 1016 1017 1020 1020 1024 Литература Упражнения 1026 1026 Иерархическое моделирование 1028 14.1. Базовые концепции моделирования Представления систем Иерархии символов 14.2. Пакеты моделирования 14.3. Общие методы иерархического моделирования 1029 1030 1032 1033 1036
26 Содержание Локальные координаты 1036 Моделирующие преобразования 1037 Создание иерархических структур 1038 14.4. Иерархическое моделирование с использованием таблиц отображения OpenGL 1039 14.5. Резюме 1040 Литература 1040 Упражнения 1041 Форматы графических файлов 1042 15.1. Конфигурации файлов изображения 15.2. Методы снижения цветности Равномерное снижение цветности Снижение цветности по популярности Медианное сокращение цветности 15.3. Методы сжатия файлов Групповое кодирование Кодирование LZW Другие методы сжатия на основе распознавания шаблонов Кодирование Хаффмана Арифметическое кодирование Дискретное косинус-преобразование 15.4. Формат основного файла Стандарт JPEG (Joint Photographic Experts Group) CGM — метафайл компьютерной графики TIFF — теговый формат файлов изображений PNG — формат переносимой сетевой графики ХВМ — битовый формат системы X Window и ХРМ — пиксельный формат системы X Window Формат Adobe Photoshop MacPaint — формат Macintosh Paint 1043 1045 1045 1046 1046 1047 1048 1048 1049 1049 1053 1055 1057 1058 1060 1060 1061 1061 1062 1062 PICT — формат данных изображения BMP — формат битового отображения 1062 1063 PCX — файловый формат Paintbrush 1063
Содержание 27 TGA — формат графических адаптеров Truevision 1063 GIF — формат графического обмена 1064 15.5. Резюме 1064 Литература 1065 Упражнения 1065 А Математика компьютерной графики 1067 А.1. Координатные системы отсчета 1067 Двухмерные декартовы экранные координаты 1067 Стандартные двухмерные декартовы системы отсчета 1068 Полярные координаты на плоскости ху 1068 Стандартные трехмерные декартовы системы координат 1070 Трехмерные декартовы экранные координаты 1071 Трехмерные криволинейные системы координат 1071 Телесный угол 1073 А.2. Точки и векторы 1074 Свойства точки 1074 Свойства вектора 1074 Сложение векторов и умножение на скаляр 1076 Скалярное произведение двух векторов 1077 Векторное произведение двух векторов 1078 А.З. Тензоры 1079 А.4. Базисные векторы и метрический тензор 1080 Определение базисных векторов в координатном пространстве 1080 Ортонормированный базис 1081 Метрический тензор 1082 А.5. Матрицы 1083 Умножение на скаляр и сложение матриц 1084 Умножение матриц 1085 Транспонирование матрицы 1086 Детерминант матрицы 1086 Обратная матрица 1087 А.6. Комплексные числа 1088 Основы комплексной арифметики 1089
28 Содержание Мнимая единица 1089 Комплексно-сопряженное число и модуль комплексного числа 1090 Комплексное деление 1090 Представление комплексного числа в полярных координатах 1091 А.7. Кватернионы 1091 А.8. Непараметрические представления 1093 А.9. Параметрические представления 1094 А. 10. Операторы скорости изменения 1095 Градиент 1096 Производная по направлению 1097 Общая форма оператора градиента 1097 Оператор Лапласа 1097 Оператор дивергенции 1098 Оператор ротора 1099 А. 11. Теоремы об интегральном преобразовании операторов скорости изменения 1099 Теорема Стокса 1100 Теорема Грина для плоской поверхности 1101 Теорема о дивергенции (Гаусса-Остроградского) 1102 Уравнения Грина 1103 А. 12. Площадь и центр масс многоугольника 1103 Площадь многоугольника 1104 Центр тяжести многоугольника 1104 А. 13. Расчет свойств многогранника 1106 А. 14. Численные методы 1107 Решение систем линейных уравнений 1107 Поиск корней нелинейных уравнений 1110 Вычисление интегралов 1112 Решение обычных дифференциальных уравнений 1114 Решение уравнений в частных производных 1116 •Аппроксимация наборов данных методом наименьших квадратов 1117 Литература 1119 Предметный указатель 1144 Алфавитный указатель функций OpenGL 1155
Нашим друзьям Дуайту, Роуз, Джею и Милли
Предисловие К омпьтерная графика остается одной из самых впечатляющих и быстро развивающихся областей современных технологий. С момента выхода в свет первого издания этой книги компьютерная графика стала стандар- том в прикладном программном обеспечении и компьютерных системах вообще. Методы компьютерной графики повсеместно применяются в разработке мно- гих продуктов, обучающих тренажерах, производстве музыкальных клипов и телере- кламе, кинофильмах, анализе данных, научных исследованиях, медицинских проце- дурах, а также во множестве других приложений. В этих прикладных областях ис- пользуются разнообразные технологии и аппаратные решения. В частности, большая часть современных исследований в области компьютерной графики связана с повыше- нием эффективности, реализма и скорости генерации изображений. Чтобы получить реалистичное изображение природной сцены, графическая программа должна сыми- тировать эффекты реального преломления и отражения света от физических объектов. Таким образом, в компьютерной графике наблюдается тенденция к внедрению в гра- фические алгоритмы оптимизированных аппроксимаций физических принципов, что- бы лучше имитировать сложные взаимодействия между объектами и световой средой. ОСОБЕННОСТИ ТРЕТЬЕГО ИЗДАНИЯ Материал третьего издания немного изменился из-за замечаний, полученных авто- рами за много лет чтения разнообразных курсов, включая вводные и расширенные курсы по компьютерной графике, научной визуализации, специальным вопросам и программированию. Когда мы готовили первое издание этой книги, многие графи- ческие курсы и приложения касались только двухмерных методов, поэтому мы раз- делили обсуждение двух- и трехмерных графических техник. База по двухмерным
Предисловие 31 процедурам компьютерной графики формировалась в первой половине книги, а трех- мерные методы обсуждались во второй. В настоящее время трехмерные графические приложения получили широчайшее распространение, и многие начальные курсы по компьютерной графике направлены либо на изучение только трехмерных методов, ли- бо на введение в трехмерную графику. Таким образом, основным отличием данного третьего издания является интеграция тем, касающихся двух- и трехмерной графики. Кроме того, по большинству тем мы увеличили материал, включив обсуждение последних открытий и новых приложений. В число общих вопросов, рассмотренных в предлагаемом третьем издании, входят: современные аппаратные и программные компоненты графических систем, фрактальная геометрия, расчет луча, сплайны, мо- дели освещения, визуализация поверхностей, компьютерная анимация, виртуальная реальность, параллельная реализация графических алгоритмов, защита от наложения, BSP-деревья, системы многих частиц, физическое моделирование, научная визуали- зация, диффузное отражение, отображение шероховатости и трансформация. Наибо- лее значительному развитию подверглись темы анимации, представления объектов, трехмерного конвейера наблюдения, моделей освещения, методов визуализации по- верхностей и наложения текстуры. Другим существенным изменением в третьем издании стало введение набора графических процедур OpenGL, которые в настоящее время широко используются и доступны в большинстве компьютерных систем. Пакет OpenGL предлагает большую и эффективную коллекцию аппаратно-независимых функций для создания компью- терных изображений с использованием программы, написанной на универсальном языке программирования (С или C++). Также стоит отметить наличие дополнитель- ных библиотек OpenGL, позволяющих обрабатывать операции ввода-вывода, требую- щие взаимодействия с устройством, а также дополнительных графических процедур для генерации цилиндрических форм, сферических объектов и би-сплайнов. ПРИМЕРЫ ПРОГРАММИРОВАНИЯ В данном третьем издании представлено более двадцати полных программ на C++, в которых использована библиотека графических процедур, доступная в популярном пакете OpenGL. Данные программы иллюстрируют применение базовых методов построения изображений, двух- и трехмерных геометрических преобразований, ме- тодов двух- и трехмерного наблюдения, перспективного проектирования, генерации сплайнов, фрактальных методов, интерактивного ввода с помощью мыши, операций выбора, отображения меню и подменю, а также методов анимации. Помимо это- го, представлено более сотни фрагментов программ C++/OpenGL, демонстрирующих реализацию алгоритмов компьютерной графики, связанных с отсечением, эффекта- ми освещения, визуализации поверхности, наложения текстуры и множества других методов компьютерной графики.
32 Предисловие ТРЕБУЕМЫЕ ЗНАНИЯ Книга написана для читателей, не знакомых с компьютерной графикой, хотя предпс лагается, что читатель имеет определенные знания о компьютерном программировг нии, организации записей и таких структурах данных, как массивы, списки указате лей, файлы. В алгоритмах компьютерной графики используется множество матема тических методов, и все они более или менее подробно рассмотрены в приложенш Математические темы, вынесенные в приложение, включают методы из сфер ана литической геометрии, линейной алгебры, векторного и тензорного анализа, теори: комплексных чисел, кватернионов, основ исчисления и численного анализа. Студенты, не знакомые с компьютерной графикой, могут использовать предлага емую книгу как учебник, также она послужит хорошим справочником для професси оналов в данной области. При изложении материала мы делали акцент на основны. принципах, требуемых для разработки, использования и понимания систем компью терной графики, также в книге приводятся многочисленные примеры программ, ил люстрирующих описанные методы и практическое приложение каждой темы. ПРЕДЛАГАЕМЫЕ КУРСЫ Для односеместрового курса можно выбрать набор тем либо исключительно по двух мерным методам, либо по комбинации двух- и трехмерных методов в зависимости О' требований конкретного курса. В двухсеместровом курсе вначале можно рассмотрет: основные графические концепции и алгоритмы, а расширенные трехмерные методь оставить на второй семестр. При самообучении читателю можно порекомендовать ис пользовать первые главы для ознакомления с графическими концепциями, дополня: материал избранными темами из последующих глав. Вводные курсы для старшеклассников можно организовать, используя выбран ный материал из глав 2-6, 11 и 13. Из этих глав можно изучить разделы, касающиес только двухмерных методов, также можно включить в программу курса трехмерны темы из указанных глав, дополнив их материалом из глав 7 и 10. В первом курсе m компьютерной графике можно прочитать такие темы, как фрактальные представле ния, сплайновые кривые, методы буфера глубины или модели цвета. Для студенто младших курсов или старшеклассников акцент следует делать на трехмерном на блюдении, трехмерных моделях с моделированием освещения и методах визуализг ции поверхностей. Вообще, двухсеместровый курс лучше подходит для адекватног охвата основ двух- и трехмерных методов компьютерной графики, включая сплайне вые представления, визуализацию поверхностей и построение хода лучей. В одной двух случаях можно предложить специализированные курсы (при прочтении которы предполагается, что студенты прослушали базовый курс) по методам визуализацш фрактальной геометрии, сплайновым методам, построению хода лучей, диффузном отражению и компьютерной анимации.
Предисловие 33 В главе 1 разнообразие приложений компьютерной графики иллюстрируется пу- тем обзора множества изображений, создаваемых с помощью графических программ. В главе 2 представлен базовый словарь компьютерной графики, также здесь описы- ваются аппаратные и программные компоненты графических системы, дается по- дробное введение в OpenGL и разбирается пример завершенной программы OpenGL. Фундаментальные алгоритмы для представления и изображения простых объектов описываются в главах 3 и 4. В указанных главах исследуются методы получения та- ких базовых компонентов изображения, как многоугольники и окружности; задание цвета, размера и других атрибутов объекта; реализация этих методов в OpenGL. В гла- ве 5 обсуждаются алгоритмы выполнения таких геометрических преобразований, как поворот и масштабирование. В главах 6 и 7 подробно объясняются процедуры вывода на экран проекций двух- и трехмерных сцен. Методы генерации изображений слож- ных объектов (поверхностей второго порядка, сплайнов, фракталов и систем многих частиц) обсуждаются в главе 8. В главе 9 изучаются различные методы компьютерной графики, применяемые для определения видимых объектов на трехмерной сцене. Мо- дели освещения и методы наложения на сцену условий освещенности исследуются в главе 10. Методы интерактивного графического ввода и разработки графических ин- терфейсов пользователя представлены в главе 11. Различные модели цвета, полезные в компьютерной графике, описываются в главе 12, также сюда включены вопросы, ка- сающиеся работы с цветом. Методы компьютерной анимации изучаются в главе 13. Методы иерархического моделирования сложных систем представлены в главе 14. Наконец, в главе 15 приводится обзор основных форматов графических файлов. БЛАГОДАРНОСТИ Данный проект возник благодаря многолетней работе множества людей. Авторы вы- ражают свою признательность всем организациям и отдельным лицам, предоставив- шим изображения и другие материалы. Также мы благодарны нашим студентам за полезные замечания, высказанные при прослушивании наших курсов и семинаров по компьютерной графике и визуализации. Мы находимся в неоплатном долгу перед всеми, кто комментировал, проводил обзоры, делал предложения по улучшению ма- териала, освещенного в данной книге. В длинный список людей, которых мы хотим поблагодарить, входят Эд Энджел (Ed Angel), Норман Бадлср (Norman Badler), Фил- лип Барри (Phillip Barry), Брайан Барски (Brian Barsky), Хедли Бонд (Hedley Bond), Барт Брейден (Bart Braden), Лара Бертон (Lara Burton), Роберт Бертон (Robert Burton), Грег Чвелос (Greg Chwelos), Джон Кросс (John Cross), Стив Каннингхем (Steve Cun- ningham), Джон Де Катрел (John DeCatrel), Виктор Дуванеко (Victor Duvaneko), Гари Иркис (Gary Eerkcs), Паррис Эгберт (Parris Egbert), Тони Фаустини (Tony Faustini), Томас Фоли (Thomas Foley), Томас Франк (Thomas Frank), Дон Джиллис (Don Gillies), Эндрю Гласснср (Andrew Glassner), Джек Голдфизер (Jack Goldfeathcr), Джордж Грин- штейн (Georges Grinstcin), Эрик Хайнс (Eric Haines), Роберт Хербст (Robert Herbst),
34 Предисловие Ларри Ходжес (Larry Hodges), Кэрол Хаббард (Carol Hubbard), Энг-Киат Кох (Eng- Kiat Koh), Майк Крох (Mike Krogh), Майкл Ласзло (Michael Laszlo), Сьюзанн Ли (Suzanne Lea), Майкл Мэй (Michael Мау), Нельсон Макс (Nelson Мах), Дэвид Ма- калистер (David McAllister), Джеффри Макконнел (Jeffrey McConnell), Гари Макдо- нальд (Gary McDonald), С. Л. Морган (С. L. Morgan), Грег Нильсон (Greg Nielson), Джеймс Оливер (James Oliver), Ли-Хьян Квек (Lee-Hian Quek), Лоуренс Рейнвилль (Laurence Rainville), Пол Росс (Paul Ross), Дэвид Саломон (David Salomon), Гюнтер Шрек (Gunther Schrack), Стивен Шафер (Steven Shafer), Клифф Шаффер (Cliff Shaf- fer), Пит Ширли (Pete Shirley), Кэрол Смит (Carol Smith), Стефани Смаллен (Stephanie Smullen), Джефф Спирс (Jeff Spears), Уильям Тафф (William Taffe), Ваи Ван Тсанг (Wai Wan Tsang), Спенсер Томас (Spencer Thomas), Сэм Юзлтон (Sam Uselton), Дэвид Вен (David Wen), Билл Уикер (Bill Wicker), Эндрю By (Andrew Woo), Анджело Йфан- тис (Angelo Yfantis), Марек Заремба (Marek Zaremba), Майкл Зида (Michael Zyda), a также множество анонимных рецензентов. Мы благодарим наших редакторов Алана Эпта (Alan Apt), Тони Холма (Toni Holm) за их помощь, предложения и содействие, но, прежде всего, за их терпение при подготовке данного третьего издания. Кроме того, при подготовке книги к переизданию нам очень сильно помогли Линда Кастил- ло (Lynda Castillo), Камилла Трентакост (Camille Trentacoste), Гизер Скотт (Heather Scott), Ксиаохонг Жу (Xiaohong Zhu), Винс о’Брайен (Vince O’Brien), Патрисия Бернс (Patricia Bums), Кэти Эвинг (Kathy Ewing) и Дэвид Абель (David Abel), которых мы отдельно благодарим за умение обращать внимание на мелкие детали.
в Обзор компьютерной графики Изображение кактуса-артиста из компьютерного мультфильма (перепечатано с разрешения компании SOFTIMAGE, Inc.)
1.1. Графики и диаграммы 1.7. Развлечения 1.2. Автоматизированное проектирование 1.8. Обработка изображений 1.3. Виртуальная реальность 1.9. Графические пользовательские 1.4. Визуализация данных интерфейсы 1.5. Обучение 1.10. Резюме 1.6. Компьютерное искусство Е настоящее время компьютеры стали мощным средством быстрого и эко- номного создания изображений. Фактически нет ни одной области, где ' не было бы определенного преимущества в использовании графических демонстраций, поэтому не удивительно, что компьютерная графика по- лучила такое широкое распространение. И хотя при первых попытках применения компьютерной графики в науке и технике обязательным условием было наличие до- рогого и громоздкого оборудования, современные достижения компьютерных техно- логий сделали интерактивную компьютерную графику практическим инструментом. Сегодня использование компьютерной графики стало довольно обычным явлением в таких разнообразных областях, как наука, искусство, техника, бизнес, промышлен- ность, медицина, управление, развлечения, реклама, образование, обучение и быт. С помощью сети Internet можно даже передавать графические изображения по все- му миру. На рис. 1.1 в компактном виде показаны основные приложения графики в моделировании, обучении и построении графиков данных. Прежде чем углублять- ся в подробности того, как создается компьютерная графика, совершим небольшую экскурсию по галерее областей применения графики. 1.1. ГРАФИКИ И ДИАГРАММЫ Одна из первых областей применения компьютерной графики — это демонстрация простых графиков данных, которые, как правило, строились с помощью буквенно- цифрового принтера. Построение графиков до сих пор остается самым распростра- ненным примером применения компьютерной графики, но сегодня можно запросто создавать диаграммы для печатных отчетов и презентаций, демонстрирующие очень сложные взаимосвязи данных, используя 35-миллиметровые слайды, плакаты или мультипликацию. Графики и диаграммы, как правило, используют для обобщения финансовых, статистических, математических, научных, технических и экономиче- ских данных при оформлении научных докладов, административных отчетов, потре- бительских информационных бюллетеней и публикаций других видов. Существует
38 Глава 1. Обзор компьютерной графики Рис. 1.1. Примеры применения компью- терной графики в различных областях (пе- репечатано с разрешения корпорации DI- COMED) Рис. 1.2. Двухмерные линейные графики, ги- стограммы и секторная диаграмма (перепеча- тано с разрешения компании UNIRAS, Inc.) множество коммерческих графических программ, а также рабочих станций и сер- висных бюро, превращающих изображение на экране в фильм, слайды или плакаты, которые используются для презентаций или архивного хранения. Типичные примеры графического изображения данных — это линейные графики, гистограммы, сектор- ные диаграммы, плоскостные диаграммы, контурные и другие схемы, показывающие взаимосвязь между несколькими параметрами в двух-, трехмерном или имеющем большую размерность пространстве. На рис. 1.1 и 1.2 приведены примеры двух- мерных графиков данных. На этих рисунках показаны основные виды линейных графиков, гистограмм и секторная диаграмма. Один или несколько секторов сектор- ной диаграммы можно выделить особо, выдвинув их в радиальном направлении, в результате чего получится “взорвавшаяся” секторная диаграмма.
1.1. Гэафики и диаграммы 39 Рис. 1.4. Два трехмерных графика, построенные таким образом, чтобы произвести большее впечатление (перепечатано с разрешения компании ISSCO Graphics, Сан-Диего, Калифорния) Рис. 1.3. Два набора данных с цветовым кодирова- нием, изображенных в виде трехмерной гистограм- мы на поверхности географического региона (пере- печатано с разрешения компании ISSCO Graphics, Сан-Диего, Калифорния) Рис. 1.5. Построение двухмерных контуров на го- ризонтальной плоскости. Поле высот изображает- ся как поверхность над горизонтальной плоско- стью (перепечатано с разрешения компании 1SSCO Graphics, Сан-Диего, Калифорния) Трехмерные графики и диаграммы используются для того, чтобы показать допол- нительную информацию о параметрах, хотя иногда ими пользуются просто, чтобы произвести более впечатляющий эффект или представить зависимость данных более привлекательным образом. На рис. 1.3 показана трехмерная гистограмма в сочета- нии с географической информацией. А на рис. 1.4 приводится пример впечатляющих трехмерных графиков. Еще один пример построения трехмерных графиков — это плоскостная диаграмма, изображенная на рис. 1.5, на которой показана высота по- верхности и ее проекция на двухмерную контурную схему.
40 Глава 1. Обзор компьютерной графики Рис. 1.6. Временная диаграмма, на кото- рой показано расписание и другая важ- ная информация о задачах проекта (пере- печатано с разрешения компании 1SSCO Graphics, Сан-Диего, Калифорния) На рис. 1.6 показана временная диаграмма, которая используется для плани- рования задач. Временные диаграммы применяются для управления проектами — составления расписания и наблюдения за ходом проекта. 1.2. АВТОМАТИЗИРОВАННОЕ ПРОЕКТИРОВАНИЕ Компьютерная графика главным образом используется в процессах проектирования — в частности, в технических и архитектурных системах, хотя сегодня в большинстве случаев проектирование осуществляется автоматически. Сейчас эти методы, которые обычно называют автоматизированным проектированием (АП, computer-aided de- sign — CAD) или автоматизированным проектированием и составлением чертежей (АПСЧ, computer-aided drafting and design — CADD), повсеместно применяются для проектирования зданий, автомобилей, самолетов, кораблей, космических аппаратов, компьютеров, текстильных изделий, бытовой техники и другой продукции. В некоторых областях проектирования предметы сначала изображаются в виде каркасной модели, которая показывает общую форму и характерные особенности объекта. Кроме того, каркасная модель позволяет проектировщику быстрее увидеть результат интерактивной коррекции формы, не дожидаясь, пока поверхность объекта будет полностью сформирована. На рис. 1.7 и 1.8 приведены примеры каркасных изображений из некоторых областей проектирования. Программные пакеты для приложений АП, как правило, предлагают разработ- чику многооконную операционную среду, подобную показанной на рис. 1.9 и 1.10. В различных окнах можно увидеть увеличенные части объекта или его вид с раз- ных сторон. Электрические схемы, подобные показанной на рис. 1.10, а также коммуника- ционные сети, схемы водоснабжения или других коммунальных услуг создаются путем многократной перестановки нескольких графических элементов. Эти элемен-
1.2. Автоматизированное проектирование 41 Рис. 1.8. Каркасные схемы проектирования корпуса автомобиля и самолета с цветовым кодированием (перепечатано с разрешения корпорации Peritek (панечъ а) и Evans & Sutherland /панель б>) Рис. 1.7. Каркасное изображение сборки коле- са автомобиля с цветовым кодированием (пе- репечатано с разрешения компании Evans & Sutherland) ты представляют собой различные компоненты сети или схемы. Пакеты разработки часто предлагают стандартные элементы механических, электрических, электронных и логических схем. Для других приложений проектировщик может создавать свои собственные символы, которые можно использовать для создания сети или схемы. Затем вся система визуализируется — последовательно размещаются копии отдель- ных элементов на чертеже, а графический программный пакет автоматически создает связи между компонентами. Это позволяет проектировщику выполнять быстрое те- стирование альтернативных схем с целью минимизации количества составляющих или пространства, необходимого для данной системы.
42 Глава 1. Обзор компьютерной графики Рис. 1.9. Изображения, полученные с помощью многооконной рабочей станции АП с цветовым кодиро- ванием (перепечатано с разрешения корпорации Intergraph) Рис. 1.10. Приложение для проектирова- ния электрических схем с помощью мно- жественных окон и цветового кодирова- ния логических элементов (перепечатано с разрешения компании Sun Microsystems) Рис. 1.11. Моделирование работы транс- портного средства при изменении направ- ления движения (перепечатано с разреше- ния компаний Evans & Sutherland и Me- chanical Dynamics, Inc.)
1.2. Автоматизированное проектирование 43 а) б) Рис. 1.12. Реалистичное изображение поверхностей технических разработок {перепечатано с разрешения корпорации Intergraph (панель а) и компании Evans & Sutherland (панель б)) Рис. 1.13. Эффект студийного освещения и методы реалистичного изображения поверх- ностей используются в программах компью- терной графики при создании рекламы ко- нечного продукта. Компьютерное изображе- ние автомобиля Chrysler Laser было получе- но по данным, предоставленным корпораци- ей Chrysler {перепечатано с разрешения Эри- ка Хайнса (Eric Haines), Autodesk, Inc.) В приложениях АП часто пользуются анимацией. Компьютерная анимация в ре- альном времени с каркасными формами очень удобна для быстрого тестирования работы транспортного средства или системы, как показано на рис. 1.11. Поскольку при каркасном изображении поверхности не воспроизводятся, каждый анимационный элемент рассчитывается достаточно быстро, что создает впечатление непрерывного движения на экране. Кроме того, каркасные изображения позволяют проектировщику видеть внутренность транспортного средства и наблюдать за поведением внутренних элементов во время движения. Когда проектирование объекта завершено или почти завершено, налагаются усло- вия реалистичного освещения и закрашиваются поверхности, в результате чего полу- чается изображение, иллюстрирующее окончательный внешний вид продукта. Соот- ветствующие примеры приведены на рис. 1.12. Реалистичные изображения создаются также для рекламы автомобилей и других транспортных средств, при этом использу- ются специальный фон и эффекты освещения (рис. 1.13).
44 Глава 1. Обзор компьютерной графики Рис. 1.14. Чертеж АП, на котором описы- вается обработка детали с помощью циф- рового управления. Поверхность детали показана одним цветом, а путь, который должен проделать станок, - другим (пе- репечатано с разрешения Национальной лаборатории Лос-Аламоса) Inc.. Колорадо) Процесс производства также связан с компьютерным описанием проектируемых объектов, так что с помощью методов автоматизированного производства (АПр, computer-aided manufacturing - САМ) можно автоматизировать выпуск продукции. Чертеж монтажной платы, например, можно превратить в описание отдельных про- цессов, необходимых для создания электронной сети. Некоторые механические дета- ли изготовляются согласно описанию того, как механический станок должен форми- ровать поверхности. На рис. 1.14 показан путь, который должен пройти станок по по- верхности создаваемого объекта. Затем согласно этим чертежам механические станки с цифровым управлением программируются на производство отдельной детали.
1.2. Автоматизированное проектирование 45 а) Рис. 1.16. Реалистичные трехмерные изображения проектов зданий: а) вид проекта Всемирного торгового центра со стороны улицы (перепечатано с разрешения компании Skidmore, Owings, & Merrill)', б) архитек- турная визуализация атриума, созданная с помощью компьютерной анимации Мэрэлин Прие (Marialine Prieur), Лион, Франция (перепечатано с разрешения компании Thomson Digital Image. Inc.) Рис. 1.17. Коридор в гостинице, вызывающий чув- ство движения благодаря волнообразному располо- жению светильников и создающий иллюзию объе- ма из-за того, что у входа в каждую комнату нахо- дится белая колонна (перепечатано с разрешения компании Skidmore, Owings, & Merrill) Архитекторы пользуются интерактивными методами компьютерной графики для создания планов этажей (рис. 1.15), где показывается расположение комнат, дверей, окон, лестниц, выступов, стоек и других элементов здания. Работая с изображением плана здания на мониторе, электрик может подобрать оптимальное расположение электропроводки, розеток и системы пожарной сигнализации. Кроме того, программ- ные пакеты, способные создавать схематические планы, можно применить для опти- мального использования пространства в офисе или в производственном помещении. Реалистичные изображения архитектурных проектов, подобных представленным на рис. 1.16, позволяют как самим архитекторам, так и их клиентам изучить внеш- ний вид отдельного здания или группы зданий, такой как студенческий городок или промышленный комплекс. Кроме реалистичных изображений внешнего вида зда- ний, архитектурные программные пакеты АП также позволяют экспериментировать с трехмерными изображениями и освещением (рис. 1.17).
46 Глава 1. Обзор компьютерной графики Рис. 1.18. Восточный ковровый узор, полученный методом проектирования средствами компьютерной графики (перепечатано с разрешения корпора- ции Lexidatd) С помощью либо общих пакетов АП, либо специально разработанного программ- ного обеспечения можно проектировать еще много различных систем и продуктов. На рис. 1.18, например, показан ковровый узор, полученный с помощью системы АП. 1.3. ВИРТУАЛЬНАЯ РЕАЛЬНОСТЬ Одно из новейших применений компьютерной графики — это создание виртуальной реальности, в которой пользователь может взаимодействовать с предметами в трех- мерном пространстве. Специальные устройства создают эффект трехмерного про- странства и позволяют пользователю “поднимать” предметы, которые он видит. Анимация виртуальной реальности часто используется для обучения водителей тяжелой техники или анализа эффективности различных моделей кабины и располо- жения рычагов управления. Когда водитель трактора на рис. 1.19 перемещает рычаги, шлем создает стереоскопическое изображение (рис. 1.20) ковша переднего устройства для загрузки или заднего ковша, так, как будто бы водитель действительно находит- ся в кабине трактора. Это дает проектировщику возможность исследовать различные положения ковша, при которых они будут закрывать водителю поле зрения, что в даль- нейшем учитывается при проектировании трактора в целом. На рис. 1.21 показан об- щий вид из кабины трактора с широким углом обзора, изображаемый на обычном мо- ниторе вместо виртуального, трехмерного изображения, а на рис. 1.22 показано изоб- ражение трактора, которое можно увидеть в отдельном окне или на другом мониторе.
1.3. Виртуальная реальность 47 Рис. 1.19. Управление трактором в виртуальной реальности. Перемещая рычаги, водитель в шлеме видит переднее устройство для загрузки, задний ковш и окружа- ющий пейзаж (перепечатано с разрешения Национального центра суперкомпью- терных приложений Иллинойского университета в Урбана-Шампейн и компании Caterpillar, Inc.) Рис. 1.20. Изображение заднего ковша, ко- торое видит водитель трактора в шлеме виртуальной реальности (перепечатано с разрешения Национального центра супер- компьютерных приложений Иллинойского университета в Урбана-Шампейн и ком- пании Caterpillar, Inc.) С помощью систем виртуальной реальности проектировщики и не только они могут передвигать предметы и взаимодействовать с ними различными способами. Архитектурный проект можно проверить, совершив виртуальную “прогулку” по ком- натам или вокруг здания, чтобы лучше оценить общее впечатление от отдельного проекта. А с помощью специальной перчатки можно даже “брать” изображаемые предметы и переворачивать их или передвигать с места на место.
48 Глава 1. Обзор компьютерной графики Рис. 1.21. Так водитель видит ковш трактора, составленный из нескольких частей с целью со- здания широкого угла обзора на обычном мони- торе (перепечатано с разрешения Национально- го центра суперкомпьютерных приложений Ил- линойского университета в Урбана-Шампейн и кампании Caterpillar, Inc,) Рис. 1.22. Изображение трактора на обыч- ном мониторе (перепечатано с разреше- ния Национального центра суперкомпью- терных приложений Иллинойского универ- ситета в Урбана-Шампейн и компании Caterpillar. Inc.) 1.4. ВИЗУАЛИЗАЦИЯ ДАННЫХ Создание графических отображений научных, технических и медицинских данных и процессов — это еще одна совершенно новая область применения компьютерной графики, которую обычно называют научной визуализацией. А термин деловая визу- ализация употребляют в связи с наборами данных, относящимися к торговле, про- мышленности и другим ненаучным отраслям. Исследователям, аналитикам и многим другим специалистам часто приходится иметь дело с большими объемами информации или изучать протекание процессов высокой сложности. При численном компьютерном моделировании, например, часто выдаются файлы, содержащие тысячи или даже миллионы значений. Точно так же спутниковые камеры и другие записывающие устройства накапливают большие фай- лы данных быстрее, чем их можно обработать. Просмотр этих огромных наборов цифр с целью определения тенденций и взаимосвязей — утомительное и неэффек- тивное занятие. Но если эти данные преобразовать в визуальную форму, то сразу
1.4. Визуализация данных 49 Рис. 1.23. Цветовое кодирование графика с шестна- дцатью миллионами точек плотности относительной яркости, наблюдаемых для туманности Whirlpool, помогает обнаружить две отдельные галактики (пе- репечатано с разрешения Национальной лаборато- рии Лос-Алалюса) же будут видны тенденции и общий рисунок. На рис. 1.23 приведен пример боль- шого набора данных, преобразованного в изображение с цветовым кодированием относительной высоты над уровнем земли. Если таким образом изобразить значения плотности, можно легко увидеть общий рисунок данных. Существует множество различных видов данных, и эффективность схемы визу- ализации зависит от характеристик этих данных. Набор данных может состоять из скалярных величин, векторов, тензоров высокого порядка или представлять собой любую комбинацию этих типов данных. Кроме того, данные могут располагаться в двух-, трехмерной области или в пространстве более высокого порядка. Цветовое кодирование — это только один из способов визуализации данных. К другим методам визуализации относятся контурные графики, закрашивание поверхностей одинако- вых значений или других участков пространства, а также специально придуманные формы представления различных типов данных. Методика визуализации также используется для облегчения понимания и анализа сложных процессов и математических функций. Цветной график кривых математи- ческих функций показан на рис. 1.24, а изображение функции в виде поверхности представлено на рис. 1.25. Фрактальные процедуры с использованием кватернионов дают объект, изображенный на рис. 1.26, а на рис. 1.27 показаны топологические структуры. Ученые также разрабатывают методы визуализации общих классов дан- ных. На рис. 1.28 показан общий метод графического изображения и моделирования данных, расположенных на сферической поверхности. Некоторые из множества других областей применения визуализации показаны на рис. 1.29-1.42. На этих рисунках изображены: воздушные потоки на поверхности космического корабля, численное моделирование грозы, развитие трещин в метал- лах, цветовое кодирование плотности потока над аэродинамической поверхностью (крылом), ряд поперечных разрезов набора данных, моделирование белков, интерак- тивная схема молекулярных структур в виртуальной реальности, модель дна океана, моделирование кувейтских нефтяных пожаров, исследование загрязнений атмосфе- ры, динамика роста кукурузы, реконструкция развалин каньона Чако в Аризоне и график, отображающий статистику автомобильных аварий.
50 Глава 1. Обзор компьютерной графики Рис. 1.24. Кривые математических функций, постро- енные с помощью различных цветовых комбина- ций (перепечатано с разрешения Мелвина Прюитта (Melvin L. Prueitt), Национальная лаборатория Лос- Аламоса') Рис. 1.25. Для представления этой трехмер- ной функции в виде закрашенной поверхно- сти применялось моделирование освещения и закрашивание поверхностей (перепечата- но с разрешения Wolfram Research, Inc., со- здателя программы Mathematica) Рис. 1.26. Четырехмерный объект, спроектированный сначала в трехмерное пространство, а затем - на двухмерный экран мо- нитора и прошедший цветовое кодирование. Этот объект был создан с помощью кватернионов и процедуры фрактального воз- ведения в квадрат (перепечатано с разрешения Джона Харта (John С. Hart), факультет кибернетики Иллинойского универси- тета в Урбана-Шампейн)
1.4. Визуализация данных 51 Рис. 1.27. Четыре изображения из интерактив- ного исследования в реальном времени с помо- щью компьютерной анимации минимальных поверхностей (“улиток”) в трехмерной сфе- ре, спроектированных в трехмерное евклидо- во пространство (перепечатано с разрешения Джорджа Франсиса (George Francis), факуль- тет математики, и Национального центра суперкомпьютерных приложений Иллинойско- го университета в Урбана-Шампейн. © /993) Рис. 1.28. Метод отображения графической информации и моделирования данных, рас- положенных на поверхности сферы (пе- репечатано с разрешения Грега Нельсона (Greg Nelson), факультет кибернетики На- ционального университета Аризоны) Рис. 1.29. Визуализация поверхностей по- токов, сопровождающих космический ко- рабль, разработанная Джеффом Халткви- стом (Jeff Hultquist) и Эриком Рейблом (Eric Raible) для испытаний НАТО (перепечата- но с разрешения Сэма Юзлтона (Sam Usel- ton), Исследовательский центр НАТО)
52 Глава 1. Обзор компьютерной графики Рис. 1.30. Численная модель воз- душного потока во время грозы (перепечатано с разрешения Боба Вильгельмсона (Bob Wilhelmson). факультет атмосферных наук, и Национального центра супер- компьютерных приложений, Ил- линойский университет в Урбана- Шампейн) Рис. 1.31. Численная модель грозовой поверхности (перепечатано с разреше- ния Боба Вильгельмсона, факультет ат- мосферных наук, и Национального цен- тра суперкомпьютерных приложений. Иллинойский университет в Урбана- Шампейн) Рис. 1.32. Визуализация с цветовым кодированием плотности энергии напря- жения при исследовании развития трещин в метал- лических пластинах, раз- работанная Бобом Габером (Bob Haber) (перепечатано с разрешения Национально- го центра суперкомпьютер- ных приложений, Иллиной- ский университет в Урбана- Шампейн)
1.4. Визуализация данных 53 Рис. 1.33. Моделирование динамики по- тока, где показано цветовое кодирование плотности потока на участке решетки из плоскостей вокруг крыла самолета, разра- ботанная Ли-Хьян Квеком (Lee-Hian Quek), Джоном Ейкемейером (John Eickemeyer) и Джеффри Таном (Jeffery Tan) (перепечата- но с разрешения Института информаци- онных техиоюгий. Республика Сингапур) Рис. 1.34. Коммерческий программный про- дукт. разрезающий набор данных на ряд поперечных сечений, показанных с помо- щью цветового кодирования (перепечатано с разрешения компании Spyglass. Inc.) Рис. 1.35. Изображение структуры бел- ка, созданное Джеем Сигелом (Jay Siegel) и Ким Белдридж (Kim Baldridge). SDSC (перепечатано с разрешения Стефани Сайдс IStephanie Sides), Суперкомп матер- ный центр в Саи-Диего)
54 Глава 1. Обзор компьютерной графики Рис. 1.36. Взаимодействие ученого со сте- реоскопическим изображением молекуляр- ной структуры в виртуальной реальности под названием “Пещера” (перепечатано с разре- шения Уильяма Шермана (William Sherman) и Национального центра суперкомпьютер- ных приложений, Иллинойский университет в Урбана-Шампейн) Рис. 1.37. Одно изображение из стереоско- пической пары, на котором показана визуа- лизация дна океана, полученная с помощью данных спутника, созданного Дэвидом Сенд- веллом (David Sandwell) и Крисом Смоллом (Chris Small), Институт океанографии. Скрипп- сом и Джимом Мак-Леодами (Scripps Mcleod, Jim Mcleod). SDSC (перепечатано с разреше- ния Стефани Сайдс (Stephanie Sides), Супер- компьютерный центр в Сан-Диего) Рис. 1.38. Моделирование кувейтских неф- тяных пожаров 1991 года, выполненное Гари Глетцмейером (Gary Glatzmeier), Чаком Хенсо- ном (Chuck Hanson) и Полом Хинкером (Paul Hinker) (перепечатано с разрешения Майка Кроха (Mike Krogh), Лаборатория передовых вычислений при Национальной лаборатории Лос-Аламоса) Day 1 10 15 20 25
1.4. Визуализация данных 55 Рис. 1.39. Визуализация загрязнения земной поверхности, созданная Томом Палмером, Cray Research Inc./NCSC, Крисом Лендрезом (Chris Landreth), NCSC, и Дейвом Боком (Dave Bock), NCSC. Загрязнитель SO4 изображается синим цветом, выпадение кислотных дождей пред- ставлено цветной плоскостью на поверхности карты, а концентрация дождей показана чисты- ми цилиндрами (перепечатано с разрешения Суперкомпьютерного центра Северной Каро- лины/MCNC) Рис. 1.40. Один кадр из анимационного филь- ма, показывающего процесс развития зерна в кукурузном початке (перепечатано с разре- шения Национального центра суперкомпью- терных приложений, Иллинойский универси- тет в Урбана-Шампейн) Рис. 1.41. Визуализация реконструкции развалин в каньоне Чако, штат Аризона (перепечатано с разрешения Мелвина Прюитта, Национальная лаборатория Лос-Аламоса. Данные предоставил Стефан Лексон (Stephen Н. Lekson))
56 Глава 1. Обзор компьютерной графики Рис. 1.42. Фототипная технология визуали- зации многомерной таблицы данных, ко- торая называется Win Vis и была разрабо- тана командой, занимающейся визуализа- цией, в Институте информационных тех- нологий, Республика Сингапур, использу- ется здесь для корреляции статистических данных по пешеходам, попавшим в авто- мобильные аварии (перепечатано с разре- шения Ли-Хьян Квека, корпорация Oracle. Калифорния) Statistical Analysis By mapping the class proportions onto the group bars, we can see the correlation between the pedestrain injury and other attributes! 1.5. ОБУЧЕНИЕ В образовательных целях часто используются компьютерные модели физических, финансовых, политических, социальных, экономических и многих других систем. Модели физических процессов, физиологических функций, демографических тен- денций или оборудования, такие как схема с цветовым кодированием на рис. 1.43, помогают обучающимся понять принцип действия системы. Для некоторых обучающих приложений разработаны специальные системы обо- рудования. В качестве примеров таких специализированных систем можно назвать тренажеры для практических занятий или обучения капитанов кораблей, пилотов самолетов, водителей тяжелой техники и авиадиспетчеров. Некоторые тренажеры не оснащены видеоэкранами, как, например, пилотажный тренажер с одной только приборной панелью для обучения полету по приборам. Однако у большинства трена- жеров есть экраны для визуального изображения внешнего окружения. Два примера Рис. 1.43. Схема с цветовым кодиро- ванием, объясняющая принцип рабо- ты ядерного реактора (перепечатано с разрешения Национальной лабора- тории Лос-Аламоса)
1.5. Обучение 57 Рис. 1.44. Большой закрытый пи- лотажный тренажер с полноцвет- ной визуальной системой и ше- стью степенями свободы на мони- торе (перепечатано с разрешения компании Frasca International) больших тренажеров с системами внешнего обозрения показаны на рис. 1.44 и 1.45. Еще один тип систем обозрения показан на рис. 1.46, бив. Здесь экран обозрения со множественными панелями приподнят перед тренажером, и цветные прожекторы по- казывают картину полета на панелях экрана. На рис. 1.47 показано место инструктора, которое может находиться за кабиной пилотажного тренажера. С помощью клавиа- туры инструктор вводит параметры, изменяющие работу самолета или окружающую среду, а на экране во время тренировочных занятий видна траектория движения са- молета и другая информация. Рис. 1.45. Военный имитатор танка с систе- мой визуальных изоб- ражений (перепечата- но с разрешения ком- пании Mediatech и GE Aerospace)
58 Глава 1. Обзор компьютерной графики Рис. 1.46. Внутренний вид кабины пилотажного тренажера с двойным управлением (панель а), внешняя полноцветная система визуализации (панель б) и малый пилотажный тренажер (панель в) (перепечатано с разрешения компании Frasca International} На рис. 1.48-1.50 показаны изображения, созданные для пилотажных, военно- морских и космических тренажеров. Тренажер управления автомобилем и связанные с этим процессом изображения показаны на рис. 1.51. На части а этого рисунка пока- зан внутренний вид этого тренажера и экран наблюдения, который виден через вет- ровое стекло. Характерное изображение уличного движения показано на рис. 1.51, б. Хотя автомобильные тренажеры предназначены для использования в качестве обуча- ющих систем, их часто применяют для изучения поведения водителя в критической ситуации. Затем реакцию водителя в различных ситуациях на дороге можно исполь- зовать в качестве основы для оптимального дизайна транспортного средства с точки зрения максимальной безопасности движения.
1.5. Обучение 59 Рис. 1.47. Место инструктора в ка- бине малого пилотажного трена- жера. Оборудование позволяет ин- структору следить за условиями полета и параметрами окружаю- щей среды (перепечатано с раз- решения компании Frasca Interna- tional) Рис. 1.48. Изоб- ражения, создава- емые пилотажным тренажером (пере- печатано с раз- решения компании Evans & Suther- land) Рис. 1.49. Изображения, которые генерирует тренажер ВМФ (пере- печатано с разрешения компании Evans & Sutherland)
60 Глава 1. Обзор компьютерной графики Рис. 1.51. Внутренний вид автомобильного тренажера (панель а) и изображения части улицы (панель б), которую может видеть водитель (перепечатано с разрешения компании Evans & Sutherland) 1.6. КОМПЬЮТЕРНОЕ ИСКУССТВО Как в изобразительном искусстве, так и в полиграфии, применяются методы ком- пьютерной графики. Сегодня художникам доступны разнообразные компьютерные методы и средства, в том числе и специальное оборудование, коммерческие про- граммные пакеты (такие как Lumena), программы для работы с математическими символами (такие как Mathematical пакеты для АП, настольные издательские про- граммные средства и анимационные системы, дающие возможность проектировать форму и описывать движение объекта.
1.6. Компьютерное искусство 61 Рис. 1.52. Рисунок- карикатура, созданный с помощью инструмен- та “кисть”, на котором символически изобра- жен художник, рабо- тающий за монито- ром (перепечатано с разрешения компаний Gould Inc., Imaging & Graphics Division и Au- rora Imaging) На рис. 1.52 фигурально описывается использование инструмента paintbrush (кисть), которая дает художнику возможность “рисовать кистью” на экране монито- ра. По сути, картина, как правило, рисуется электронным образом на графическом планшете (кодировщике) пером, которое может имитировать разные мазки кистей, разную ширину кисти и разные цвета. С помощью “кисти” мультипликатор нарисо- вал героев рис. 1.53, которые, по-видимому, заняты созданием самих себя. Рис. 1.53. Мультипликационное изображение "художника", создающего картину с помощью “кисти”. На рис. а на графическом планшете нарисовано, как гномы смотрят на изображение, появляющееся на экране. На рис. б фигурки художника и гномов наложены на известный рисунок Санта Клауса Томаса Наста, введенный в систему с помощью видеокамеры, а затем приведенный к соответствующему мас- штабу и расположенный в нужном месте (перепечатано с разрешения компаний Gould Inc., Imaging & Graphics Division и Aurora Imaging)
62 Глава 1. Обзор компьютерной графики Рис. 1.54. Копия картины Ван Гога, сделанная художником-графиком Элизабет О’Рурк (Elizabeth O’Rourke) с помощью беспроводного пера, реагирующего на дав- ление (перепечатано с разрешения корпо- рации Wacom Tachnology) Рис. 1.55. Электронная акварель, напи- санная Джоном Дерри (John Derry) из Time Arts, Inc. с помощью беспроводно- го, реагирующего на давление пера и про- граммного продукта Lumena, имитирую- щего кисть и гуашь (перепечатано с раз- решения корпорации Wacom Technology) Для создания электронной картины на рис. 1.54 использовалась “кисть” с беспро- водным чувствительным к давлению пером Wacom, которая имитирует мазки кисти Ван Гога. Перо передает изменения давления руки через различную ширину линий, размер кисти и градацию цвета. На рис. 1.55 изображен рисунок акварелью, создан- ный с помощью такого пера и программного обеспечения, позволяющего художнику создавать эффект акварельных, пастельных или масляных красок, имитируя разное время высыхания, влажность и различные основы. На рис. 1.56 приведен пример сочетания инструмента “кисть” с отсканированными изображениями. Для создания изображений художники пользуются и многими другими компью- терными технологиями. Чтобы нарисовать такую картину, какая показана на рис. 1.57, художник воспользовался сочетанием программ трехмерного моделирования, отоб- ражением текстуры, программами для рисования и программным обеспечением АП. На рис. 1.58 мы видим картину, созданную с помощью перьевого графопостроителя и специально разработанного программного обеспечения, которое может создавать “автоматические произведения” без вмешательства художника.
1.6. Компьютерное искусство 63 Рис. 1.56. Автор этой картины, которая называется Электронная лавина, утвержда- ет, что техника, подобно лавине, захлестнула нас. Художник использовал персо- нальный компьютер с графическим планшетом и программу Lumena, которая поз- воляет объединить изображения листьев, цветочных лепестков и электронных эле- ментов с отсканированными изображениями {перепечатано с разрешения Williams Gallery. @ 1991, Джоан Тракенброд (Joan Truckenbrod), школа Института ис- кусств в Чикаго) На рис. 1.59 показан пример “математического” творчества. Этот художник ис- пользует комбинацию математических функций, фрактальных процедур, программ- ный пакет Mathematica, струйные принтеры и другие системы для создания двух- и трехмерных фигур и стереоскопических пар изображений. Еще один пример элек- тронного произведения искусства, созданного с помощью математических выраже- ний, показан на рис. 1.60. Произведения этой программы-синтезатора часто основаны на изменениях частоты и других параметров с целью создания видеоролика, в кото- ром объединяются визуальный и акустический узоры. Этими методами “рисования” также пользуются для создания логотипов и других элементов дизайна, макетов страниц, содержащих текст и графические изображения, телевизионной рекламы и т.п. Рабочая станция для создания макетов страниц, на которых графические изображения сочетаются с текстом, показана на рис. 1.61. Как и во многих других приложениях компьютерной графики, в изображениях, относящихся к полиграфии, часто используются фотореалистичные методы созда- ния рисунков. На рис. 1.62 приведен пример трехмерного дизайна логотипа, а на рис. 1.63 показаны три изображения, созданные с помощью компьютерной графики для рекламной продукции.
64 Глава 1. Обзор компьютерной графики Рис. 1.57. Из серии под названием “Сферы влия- ния". Эта электронная кар- тина Whigmalaree была со- здана путем комбинации ме- тодов с применением графи- ческого планшета, трехмер- ного моделирования, отоб- ражения текстуры и ряда геометрических преобразо- ваний (перепечатано с раз- решения Williams Gallery. © 1992, Винн Рагленд мл. (Wynne Ragland. Jr.)) Рис. 1.58. Результат электронного твор- чества (на перьевом графопостроителе) программного обеспечения, специально разработанного художником для имита- ции его стиля. Перьевой графопостро- итель включает в себя многочисленные перья и инструменты для рисования, в том числе китайские кисти (перепеча- тано с разрешения Williams Gallery. © Роман Веростко (Roman Verostko), Кол- ледж искусств в Миннеаполисе) При создании телевизионной коммерческой продукции также часто пользуют- ся компьютерной анимацией. Такие рекламные ролики создаются кадр за кадром, причем каждый кадр рисуется и сохраняется как отдельный файл изображения. На каждом последующем кадре положения объектов немного смещаются, что вызы- вает ощущение движения в анимационном фильме. Когда нарисованы все кадры анимационной последовательности, они объединяются в фильм или сохраняются в видеобуфере для просмотра. Для создания каждой секунды анимационного фильма необходимо 24 кадра анимационной последовательности. Для просмотра фильма на мониторе необходимо по меньшей мере 30 кадров в секунду.
1.6. Компьютерное искусство 65 Рис. 1.59. Это произ- ведение основано на визуализации вели- кой теоремы Ферма (хп + уп = zn, при п = 5) Эндрю Хэн- соном, факультет информатики, Уни- верситет Индианы. Изображение рас- крашено с помощью программ Mathemat- ica и Wavefront (пе- репечатано с раз- решения Williams Gallery. © 1991, Стюарт Диксон (Stewart Dickson)) Рис. 1.60. С помощью математических функ- ций, фрактальных процедур и суперкомпью- теров этот художник-синтезатор эксперимен- тирует с различными элементами дизайна с целью создания формы и цвета для музыкаль- ной композиции (перепечатано с разрешения Брайна Эванса (Brian Evans), Университет Вандербилда) Рис. 1.61. Рабочая станция для макета стра- ницы (перепечатано с разрешения компании Visual Technology)
66 Глава 1. Обзор компьютерной графики Рис. 1.62. Трехмерное изображение логоти- па (перепечатано с разрешения кампании Vertigo Technology, Inc.) а) б) в) Рис. 1.63. Реклама продукции с помощью компьютерной графики (перепечатано с разрешения Эндрю Флейшера (Audrey Fleisher) (панель а), компании SOFTIMAGE, Inc. (панели б и в)) Распространенным графическим методом, используемым при создании многих телевизионных коммерческих продуктов, является трансформация, при которой один объект плавно превращается (трансформируется) в другой. Именно с помощью этого метода на экране телевизора канистра машинного масла превращается в двигатель автомобиля, автомобиль — в тигра, лужа воды — в костюм, а лицо одного человека — в лицо другого. Пример трансформации приводится в следующем разделе (рис. 1.68). 1.7. РАЗВЛЕЧЕНИЯ В телевизионной продукции, кинофильмах и музыкальных клипах использование ме- тодов компьютерной графики стало обычным явлением. Иногда графические изобра- жения дополняют игру живых актеров и реальные сцены, а иногда фильм полностью делается с помощью методов компьютерного рисования и анимации. Во многих телесериалах методы компьютерной графики применяются регулярно для создания таких спецэффектов, как сцена, изображенная на рис. 1.64 из телесери- ала Глубокий космос - 9. В некоторых телевизионных программах для объединения компьютерных фигур людей, животных или мультипликационных героев с живыми
1.7. Развлечения 67 Рис. 1.64. Графическое изображение из телевизионного сериала Глубокий космос - 9 (пере- печатано с разрешения компании Rhythm & Hues Studios) актерами в кадре или для того, чтобы изменить лицо актера, также применяются анимационные методы. А во многих программах компьютерная графика использу- ется для имитации зданий, особенностей рельефа или другого фона, необходимого для данной сцены. На рис. 1.65 показан в высокой степени реалистичный вид города Даду тринадцатого века (теперь — Пекин), созданный для японской телепередачи. В современных кинофильмах широко используются компьютерные спецэффек- ты, анимация, персонажи и сцены, созданные с помощью компьютерной графики. На рис. 1.66 показан черновой вариант сцены для кинофильма Звездный путь — гнев хана. Затем контурные формы планеты и космического корабля на этой иллю- страции закрашиваются, и получается окончательный вид поверхностей предметов, которые появятся в фильме. Передовые методы компьютерного моделирования и за- крашивания поверхностей использовались и при создании двух короткометражных фильмов, занявших призовые места, в сценах, показанных на рис. 1.67. В других фильмах компьютерное моделирование, закрашивание и анимация используются для создания полного набора человекоподобных персонажей. В таких фильмах для того, чтобы придать компьютерным “актерам” натуральный цвет кожи, реальные черты ли- ца и небольшие дефекты на коже, такие как родинки, веснушки и пигментные пятна, применяются фотореалистичные методы. На рис. 1.7 показана сцена из фильма Final Fantasy: The Spirits Within с применением этих фотореалистичных методов для дости- жения максимального сходства внешности персонажей с внешностью актеров-людей.
68 Глава 1. Обзор компьютерной графики Рис. 1.65. Изображение компьютерной реконструкции Даду тринадцатого века (сегодня — Пекин), созданное для японского телевидения корпорацией Taisei (Токио, Япония) и нарисован- ное с помощью программы TDI (перепечатано с разрешения компании Thomson Digital Image, Inc.) Рис. 1.66. Изображения, созданные для фильма ки- нокомпании Paramount Pictures Звездный путь — гнев хана (перепечатано с разрешения компании Evans & Sutherland) Рис. 1.67. Компьютерные сцены из фильмов: а) Мечта Реда (перепечатано с разрешения компании Pixar. © Pixar, 1987); б) Безделушка (перепечатано с разрешения компании Pixar. © Pixar, 1989)
1.8. Обработка изображений 69 Рис. 1.67. Сцена из фильма Final Fantasy: The Spirits Within, где показаны три пер- сонажа, созданные методами компьютерной графики: доктор Аки Росс, Грэй Эдвардс и доктор Сид {перепечатано с разрешения Square Pictures, Inc. © 2001, FFFP) Методами компьютерной графики пользуются также при моделировании игры реального актера. С помощью цифровых файлов, в которых записаны черты лица актера, анимационная программа может выдать часть фильма, в которой будет содер- жаться созданная с помощью компьютера реплика этого человека. Во время съемок кинофильма в случае болезни актера или несчастного случая можно воспользоваться этими методами моделирования и заменить актера в некоторых сценах. В музыкальных клипах компьютерная графика применяется в нескольких случа- ях. Можно накладывать компьютерные объекты на реальные изображения или пользо- ваться методами компьютерной графики и обработки изображений для превращения одного предмета или человека в другой (трансформация). Пример трансформации приводится в ряде кадров на рис. 1.68, разработанных для видеоролика Дэвида Бирна Она сошла с ума. 1.8. ОБРАБОТКА ИЗОБРАЖЕНИЙ Изменение или интерпретация уже существующих изображений, таких как фотогра- фии или видеопленки, называются обработкой изображений. Хотя методы, которыми пользуются в компьютерной графике и при обработке изображений, перекрываются, эти две области связаны с фундаментально различными действиями. В компьютер- ной графике с помощью компьютера создается само изображение. Методы обработки изображений, с другой стороны, применяют для улучшения качества рисунка, его анализа или распознавания визуальных шаблонов в приложениях, связанных с робо- тотехникой. Однако методы обработки изображений часто используются в компью- терной графике, а методы компьютерной графики часто применяются для обработки изображений.
70 Глава 1. Обзор компьютерной графики Рис. 1.68, Примеры трансформации из видеоролика Дэвида Бирна (David Byrne) Она сошла с ума (пере- печатано с разрешения Дэвида Бирна, Index Video и Pacific Data Images) Как правило, перед тем, как применять методы обработки изображений, фотогра- фию или другое изображение следует оцифровать и превратить в файл изображения. Затем с помощью цифровых методов можно переместить отдельные части изобра- жения, увеличить контрастность цветов или улучшить качество ретуширования. Как можно с помощью методов обработки изображений улучшить качество изображения, показано на рис. 1.69. Эти методы интенсивно используются в полиграфии, особенно это касается ретуширования и перемещения частей фотографий и других подобных действий. Аналогичные методы применяются для анализа фотографий Земли, полу- ченных со спутника, и телескопических записей распределений звезд в галактиках. В медицине методы обработки изображений также интенсивно используются для усиления изображений при томографии и для моделирования хирургических опера- ций. Томография — это методика фотографирования в рентгеновских лучах, которая позволяет получить изображение поперечного разреза физиологической системы. В компьютерной рентгеновской томографии, позиционной томографии излучения и компьютерной аксиальной томографии применяются проекционные методы, даю- щие возможность воспроизводить поперечные разрезы по цифровым данным. Этими методами пользуются также для контроля за внутренними функциями и для изоб- ражения поперечного разреза во время хирургической операции. К числу других медицинских методов создания изображений относятся ультразвук и ядерное ме- дицинское сканирование. Ультразвук — это когда вместо рентгеновских лучей для получения цифровых данных используются высокочастотные звуковые волны. Ядер-
1.9. Гоафические пользовательские интерфейсы 71 Рис. 1.69. Размытая фотогра- фия номерного знака автомоби- ля становится разборчивой по- сле применения методов обра- ботки изображения (перепечата- но с разрешения Национальной лаборатории Лос-Аламоса) ные медицинские сканеры получают цифровые данные из излучения, испускаемого проглоченными радионуклидами, а затем эти данные изображаются в виде графика с цветовым кодированием. В медицинских приложениях обработка изображений и компьютерная графика часто сочетаются для моделирования и изучения физических функций, проектирова- ния искусственных органов, планирования и выполнения хирургических операций. Последнее приложение часто называют автоматизированной хирургией. С помощью компьютерных методов создания изображений получают двухмерные поперечные разрезы тела. Затем эти разрезы просматриваются, над ними с помощью графиче- ских методов выполняются определенные действия с целью моделирования настоя- щих хирургических процедур и испытания различных хирургических вмешательств. Примеры этих медицинских приложений показаны на рис. 1.70 и 1.71. 1.9. ГРАФИЧЕСКИЕ ПОЛЬЗОВАТЕЛЬСКИЕ ИНТЕРФЕЙСЫ Сегодня принято снабжать программное обеспечение графическими пользователь- скими интерфейсами (GUI). Главный элемент графического интерфейса — это блок управления окнами, позволяющий пользователю видеть на экране многочисленные прямоугольные участки, которые называются окнами. На каждом участке экрана мо- гут изображаться различные процессы, выдавая графическую или неграфическую информацию, а для активизации отдельных окон могут применяться различные ме-
72 Глава 1. Обзор компьютерной графики Рис. 1.70. Один кадр из компьютерно- го анимационного фильма, показываю- щего уровень сердечной активности на участке полупрозрачного сердца соба- ки с объемным закрашиванием. Меди- цинские данные предоставили Уильям Смит (William Smith), Эд Симпсон (Ed Simpson) и Аллан Джонсон (Allan John- son), Университет Дюка. Программное обеспечение по созданию изображения предоставил Том Палмер (Tom Palmer), Cray Research, Inc./NCSC (перепечатано с разрешения Дейва Бока (Dave Bock), Суперкомпьютерный центр Северной Каролины/MCNC) Рис. 1.71. Одна часть стереоскопической пары изображений, на которой показаны ко- сти человеческой руки, нарисованные Ин- мо Юн (Inmo Yoon), Д. Томпсоном (D. Thompson) и У. Н. Воггенспаком мл. (W. N. Waggenspack, Jr.), LSU, по данным, полу- ченным с помощью КТ-сканирования цен- тром Rehabilitation Research, GWLNHDC. На этих изображениях показано возможное расположение сухожилия при восстанови- тельной операции (перепечатано с разре- шения IMRLAB, факультет машинострое- ния, Университет Луизианы) тоды. В некоторых системах окно можно активизировать с помощью таких устройств интерактивного ввода, как мышь, поместив курсор на площадь этого окна и нажав на левую клавишу мыши. В других системах нам может понадобиться щелкнуть на строке заголовка в верхней части окна. Интерфейсы также служат для изображения меню и пиктограмм для выбора окна, опции обработки или значения параметра. Пиктограмма — это графический символ, который чаще всего передает смысл опции, которую он представляет. Преимущество пиктограмм в том, что они занимают меньше места на экране, чем соответствующие текстовые описания, и при удачном дизайне их назначение можно понять намного быстрее. Часто окно можно преобразовать в пиктограмму, а в меню могут содержаться списки как текстовых описаний, так и пиктограмм.
Литература 73 Рис. 1.72. Графический пользователь- ский интерфейс, содержащий многочис- ленные окна, меню и пиктограммы (пе- репечатано с разрешения Image-In Cor- poration) На рис. 1.72 показан типичный графический интерфейс с многочисленными ок- нами, меню и пиктограммами. В этом примере меню позволяет выбрать опцию обра- ботки, цвет и графические параметры. Пиктограммы представляют опции рисования, раскрашивания, увеличения изображения, печатания текста и другие операции, свя- занные с построением рисунка. 1.10. РЕЗЮМЕ Мы сделали обзор многих приложений, в которых применяется компьютерная гра- фика, включая построение графиков данных, АП, виртуальную реальность, научную визуализацию, образование, искусство, развлечения, обработку изображений и графи- ческие пользовательские интерфейсы. Однако мы не назвали еще множество других областей, хотя можно было бы заполнить всю эту книгу примерами из многих других сфер применения компьютерной графики. В последующих главах будут рассматри- ваться оборудование и методы, которые используются в приложениях, описанных в данной главе, а также во многих других приложениях. ЛИТЕРАТУРА Применение графических методов в различных областях, включая искусство, науку, математику и технику, рассматривается в работах [38, 111, 121, 137, 148, 159, 359, 361, 398, 408]. Графические методы визуализации музыки представлены в статье [221]. Подробное обсуждение автоматизиро- ванного проектирования и производства (АП/АПр) в различных промышленных отраслях описаны в книге [248]. Графические методы для пилотажных тренажеров представлены в монографии [303]. Авторы [108] обсуждают моделирование зрения, а в статье [382] сообщается о моделировании космических кораблей. Понятие графических пиктограмм и символов дается в работах [195, 197]. Дополнительную информацию о медицинских приложениях см. в [146, 271, 284].
BA 2 Краткий обзор графических систем Система с широким изогнутым экраном для презентаций с помощью компьютерной графики и ее панель управления (перепечатано с разрешения компаний Silicon Graphics, Inc. и Trimension Systems. © 2003, SGI)
2.1. Приборы с мониторами 2.6. Графические сети 2.2. Системы растрового сканирования 2.7. Графика в сети Internet 2.3. Графические рабочие станции и системы 2.8. Графическое программное обеспечение визуализации 2.9. Знакомство с OpenGL 2.4. Устройства ввода 2.10. Резюме 2.5. Устройства выдачи документальных копий п олезные свойства и возможности компьютерной графики хорошо извест- ны, и сегодня практически во всех прикладных областях доступен широ- кий диапазон графических аппаратных средств и программного обеспе- чения. В настоящее время широко используются возможности как двух-, так и трехмерных графических приложений, причем даже в компьютерах общего назначения и карманных калькуляторах. Если говорить о персональных компьюте- рах, то здесь можно воспользоваться различными устройствами интерактивного вво- да и графическими программными пакетами. Для высококачественных приложений предоставляется широкий выбор сложных специализированных систем графическо- го оборудования и технологий. В этой главе изучаются основные характеристики элементов графического оборудования и графических программных пакетов. 2.1. ПРИБОРЫ С МОНИТОРАМИ Основным устройством вывода в графических системах, как правило, является мони- тор (рис. 2.1). Принцип действия большинства мониторов основывается на стандарт- ной технологии электронно-лучевой трубки (ЭЛТ), но существуют и другие подходы, и со временем первое место могут занять полупроводниковые мониторы. ЭЛЕКТРОННО-ЛУЧЕВЫЕ ТРУБКИ С РЕГЕНЕРАЦИЕЙ На рис. 2.2 показан принцип действия ЭЛТ. Пучок электронов (электронный луч), вы- ходящий из электронной пушки, проходит через системы фокусировки и отклонения, которые направляют луч в определенное место на экране, покрытом люминесцент- ным веществом — люминофором. Затем на поверхности люминесцентного покрытия
76 Глава 2. Краткий обзор графических систем Рис. 2.1. Рабочая станция для работы с ком- пьютерной графикой (перепечатано с раз- решения кампаний Silicon Graphics, Inc., Why Not Films и 525 Post Production. © 2003, SGI) в каждой точке, куда попал электронный луч, появляется небольшое пятнышко света. Поскольку свет, излучаемый люминофором, очень быстро угасает, нужны какие-то методы, позволяющие сохранить картинку на экране. Один из таких способов — со- хранение информации о картинке в виде распределения зарядов внутри ЭЛТ. Затем это распределение зарядов можно использовать для поддержания люминофора в ак- тивном состоянии. Однако самый распространенный метод из тех, которые сегодня применяются для поддержания свечения люминофора, — это многократное повторе- ние картинки путем быстрого перенаправления электронного луча в одни и те же точки экрана. Соответствующий тип дисплея называется электронно-лучевой труб- кой с регенерацией, а частота, с которой картинка повторяется на экране, — частотой регенерации. Главные элементы электронной пушки в ЭЛТ — это раскаленный металлический катод и управляющая сетка (рис. 2.3). Катод нагревается путем пропускания тока че- рез катушку, которая называется нитью накала и находится внутри цилиндрического
2.1. Приборы с мониторами 77 катода. Это приводит к “испарению” электронов с поверхности разогретого катода. Затем свободные, отрицательно заряженные электроны благодаря большой положи- тельной разности потенциалов в вакууме внутри оболочки ЭЛТ получают ускорение в направлении люминесцентного покрытия. Ускоряющую разность потенциалов мож- но получить с помощью положительно заряженного металлического покрытия на внутренней стороне оболочки ЭЛТ поблизости люминесцентного экрана, кроме того, положительное напряжение можно создать с помощью ускоряющего анода, как по- казано на рис. 2.3. Иногда электронную пушку проектируют таким образом, чтобы ускоряющий анод и система фокусировки составляли один элемент. Интенсивность электронного луча контролируется напряжением на управляющей сетке, представляющей собой металлический цилиндр, расположенный вокруг като- да. Высокое отрицательное напряжение на управляющей сетке перенаправляет луч, отталкивая электроны и не позволяя им пройти через маленькое отверстие на конце управляющей сетки. Меньшее отрицательное напряжение на управляющей сетке про- сто уменьшает количество пропускаемых электронов. Поскольку количество света, излучаемого люминесцентным покрытием, зависит от числа электронов, попадающих на экран, яркость определенной точки на экране контролируется путем изменения на- пряжения на управляющей сетке. Для отдельных точек на экране эта яркость, или уровень интенсивности, определяется командами графического программного обес- печения, которые обсуждаются в главе 3. Система фокусировки ЭЛТ сжимает электронный пучок и уменьшает поперечное сечение луча, попадающего на люминесцентный экран. В противном случае электро- ны отталкивались бы друг от друга, и при приближении к экрану пучок бы расширял- ся. Фокусировка осуществляется с помощью либо электрического, либо магнитного поля. При электростатической фокусировке электронный луч проходит через положи- тельно заряженный металлический цилиндр, на центральной оси которого электроны находятся в состоянии равновесия. Такое устройство образует электростатическую
78 Глава 2. Краткий обзор графических систем линзу, которая изображена на рис. 2.3, и электронный луч фокусируется в центре экрана точно так же, как с помощью оптической линзы луч света фокусируется на определенном фокальном расстоянии. Аналогичного эффекта фокусировки можно достичь с помощью магнитного поля и катушки, намотанной вокруг внешней обо- лочки ЭЛТ. Фокусировка с помощью магнитной линзы, как правило, дает на экране пятно самого маленького размера. В системах высокой точности для удержания луча в фокусе во всех точках экрана используют дополнительное фокусирующее оборудование. Расстояние, которое дол- жен пройти электронный луч до различных точек на экране, не одинаковое, поскольку радиус кривизны большинства ЭЛТ больше, чем расстояние от фокусирующей систе- мы до центра экрана. При перемещении луча к краям экрана изображение на экране становится более размытым. Чтобы компенсировать это, фокусировка в системе мо- жет подстраиваться в зависимости от положения луча на экране. Как и фокусировкой, отклонением пучка также можно управлять с помощью либо электрического, либо магнитного поля. Сейчас электронно-лучевые трубки принято оснащать магнитными отклоняющими катушками, расположенными вокруг внешней оболочки ЭЛТ, как показано на рис. 2.2. Для этой цели используют две пары катушек. Одна пара расположена сверху и снизу трубки, другая — с двух противоположных сторон от трубки. Магнитные поля обеих пар катушек приводят к возникновению по- перечной отклоняющей силы, перпендикулярной как к направлению магнитного поля, так и к направлению электронного луча. Одна пара катушек обеспечивает горизон- тальное отклонение, а другая — вертикальное. Нужное отклонение достигается путем подбора силы тока в катушках. При использовании электростатического отклонения внутри оболочки ЭЛТ устанавливают две пары параллельных пластин. Одна пара пластин устанавливается горизонтально для управления вертикальным отклонением, а другая пара — вертикально для управления горизонтальным отклонением (рис. 2.4).
2.1. Приборы с мониторами 79 Рис. 2.5. Распределение интенсивности освещенного пятна люминофора на экране ЭЛТ Рис. 2.6. Два освещенных люминесцентных пятна различимы, если рас- стояние между ними больше, чем диаметр, на котором интенсивность пятна спадает до 60 % от своего максимального значения Светящиеся точки на экране возникают благодаря тому, что энергия пучка элек- тронов ЭЛТ передается люминесцентному покрытию. Когда электроны из электрон- ного луча ударяются о люминесцентное покрытие, они останавливаются, а их кинети- ческая энергия поглощается люминофором. Часть энергии электронного луча за счет трения превращается в тепловую энергию, а оставшаяся энергия приводит к тому, что атомы люминофора переходят на более высокий квантовый уровень энергии. Че- рез короткое время “возбужденные” электроны люминофора начинают возвращаться в свое устойчивое основное состояние, освобождаясь от излишка энергии в виде небольших квантов световой энергии, которые называются фотонами. То, что мы видим на экране, — это суммарное световое излучение всех электронов: яркая точка, которая быстро угасает после того, как все возбужденные электроны люминофора возвращаются в свое основное энергетическое состояние. Частота (или цвет) света, излучаемого люминофором, пропорциональна разности энергий основного и возбуж- денного квантовых состояний. В ЭЛТ могут использоваться различные виды люминофоров. Кроме цвета, лю- минофоры различаются, в основном, по своему послесвечению, т.е. по тому, как дол- го они продолжают излучать свет (или по тому, сколько времени проходит, пока все возбужденные электроны не возвратятся в основное состояние) после прекраще- ния действия электронного луча. Послесвечение определяется как время, за которое свет, излучаемый экраном, уменьшается до одной десятой своей изначальной интен- сивности. Чтобы картинка на экране не дрожала, для люминофоров с небольшим послесвечением необходима высокая скорость регенерации. Люминофор с неболь- шим послесвечением может быть полезным в анимации, тогда как люминофоры с большим послесвечением больше подходят для изображения высокосложных ста- тических картинок. Хотя величина послесвечения некоторых люминофоров может превышать 1 секунду, послесвечение обычных графических мониторов, как правило, составляет от 10 до 60 микросекунд. На рис. 2.5 показано распределение интенсивности светового пятна на экране. В центре пятна интенсивность наибольшая, а в направлении краев она уменьшает- ся по закону Гаусса. Это распределение соответствует распределению электронной плотности поперечного сечения луча ЭЛТ.
80 Глава 2. Краткий обзор графических систем Максимальное количество точек, которое можно изобразить на экране ЭЛТ без перекрывания, называют разрешением. Более точное определение разрешения — это количество точек, которое можно разместить горизонтально и вертикально в одном сантиметре, хотя чаще говорят просто об общем количестве точек в каждом направ- лении. Интенсивность пятна распределяется по закону Гаусса (рис. 2.5), так что два соседних пятна будут различимы до тех пор, пока расстояние между ними будет больше, чем диаметр, на котором интенсивность каждого из пятен уменьшается до 60 % от интенсивности в центре пятна. Такое перекрывание показано на рис. 2.6. Размер пятна также зависит от интенсивности. Чем больше электронов в секунду получают ускорение в направлении люминофора, тем больше диаметр луча ЭЛТ и, соответственно, светового пятна. Кроме того, при увеличении значения возбуждаю- щей энергии возбуждение распространяется и на соседние атомы люминофора, на которые луч не попадает непосредственно, что еще больше увеличивает диаметр пятна. В высококачественных системах разрешение, как правило, составляет 1280 на 1024, причем для многих систем возможно и более высокое разрешение. Системы с большим разрешением часто называют системами высокой четкости. Физические размеры графических мониторов задаются как длина диагонали экрана, размер кото- рой варьируется от 12 до 27 дюймов или больше. Монитор ЭЛТ можно подсоединять к различным компьютерным системам, поэтому количество точек, которое реально можно отобразить на экране, зависит также и от возможностей системы, к которой подсоединен этот экран. ДИСПЛЕИ РАСТРОВОГО СКАНИРОВАНИЯ Самый распространенный вид графических мониторов, в которых используется ЭЛТ, — это дисплеи растрового сканирования, в основе которых лежит телевизи- онная технология. В системах растрового сканирования электронный луч пробегает по экрану сверху донизу по одной строке за раз. Каждая строка называется строкой развертки. При перемещении электронного луча по строке развертки интенсивность луча включается и выключается (или приобретает какое-то промежуточное значение), с помощью чего создается узор из освещенных пятен. Сама картинка сохраняется в области памяти, которая называется буфером регенерации или буфером кадра, где слово кадр означает всю площадь экрана. В этой области памяти хранится набор цве- товых значений для всех точек экрана. Затем эти цветовые значения извлекаются из буфера регенерации и используются для управления интенсивностью электронного луча при его перемещении от пятна к пятну на экране. Таким образом, на экране “рисуется” картинка, по одной строке развертки за раз, как показано на рис. 2.7. Каждый участок экрана, который может освещаться электронным лучом, называется пикселем (сокращение от picture element — элемент изображения). Поскольку в буфере регенерации хранится набор цветовых значений, его еще иногда называют буфером цвета. Кроме того, в этом буфере содержится и другая информация о пикселях, а не
2.1. Приборы с мониторами 81 Рис. 2.7. С помощью системы растрового сканирования объект изображается как набор дискрет- ных точек в каждой строке развертки только информация о цвете, поэтому различные области буфера иногда обобщенно называют буфером кадра. Способность системы растрового сканирования хранить информацию о цвете каждой точки экрана делает ее очень удобной для реалистич- ного изображения сцен с тонким затенением и цветными узорами. Примеры систем растрового сканирования — это домашние телевизоры и принтеры. Растровая система обычно характеризуется своим разрешением, т.е. количеством пикселей, которое можно отобразить с ее помощью. Еще одно свойство мониторов — это характеристическое отношение, которое сейчас часто определяется как количе- ство столбцов пикселей, разделенное на количество строк развертки, которое можно отобразить с помощью данной системы. (Иногда термин характеристическое отно- шение используется для обозначения количества строк развертки, разделенного на количество столбцов пикселей.) Характеристическое отношение можно определить как отношение числа горизонтальных точек к числу вертикальных точек (или на- оборот), необходимое для создания линий одинаковой длины в обоих направлениях экрана. Таким образом, характеристическое отношение 4/3, например, означает, что горизонтальная линия, состоящая из четырех точек, имеет такую же длину, что и вертикальная линия, состоящая из трех точек, где длина линии измеряется в каких- либо физических единицах, например, в сантиметрах. Аналогично характеристиче- ское отношение любого прямоугольника (в том числе и всей площади экрана) можно определить, разделив ширину прямоугольника на его высоту.
82 Глава 2. Краткий обзор графических систем Гамма цветов или оттенков серого цвета, которую можно передать с помощью растровой системы, зависит как от вида люминофора, который используется в ЭЛТ, так и от количества битов информации на один пиксель, которое может обеспечить буфер кадра. В простой черно-белой системе каждая точка экрана либо включена, либо выключена, поэтому для управления интенсивностью точек экрана необходим только один бит на пиксель. Значение бита 1, например, указывает на то, что в этом положении электронный луч следует включить, а значение 0 выключает пу- чок. Дополнительные биты позволяют регулировать интенсивность луча в диапазоне значений между “включено” и “выключено”. В высококачественных системах коли- чество битов на пиксель достигает 24. Для хранения такого количества информации в буфере кадра может понадобиться несколько мегабайтов памяти в зависимости от разрешения системы. Например, в системе с 24 бит на пиксель и разрешением экрана 1024 на 1024 для хранения информации в буфере регенерации необходимо 3 Мбайт памяти. Количество битов на один пиксель в буфере кадра иногда называют либо глу- биной области буфера, либо количеством бит-карт. Кроме того, буфер кадра с одним битом на пиксель обычно называется битовым отображением (bitmap), а буфер кад- ра с несколькими битами на один пиксель — пиксельным отображением (pixmap). Но термины битовое и пиксельное отображение также используют для описания дру- гих прямоугольных массивов, где битовое отображение — это любой набор двоичных значений, а пиксельное отображение — это разноцветный узор. При каждом обновлении экрана нам будет казаться, что следующий кадр явля- ется непрерывным продолжением рисунка предыдущего, до тех пор, пока скорость регенерации не станет слишком маленькой. Если скорость ниже, чем приблизительно 24 кадра в секунду, то глаз, как правило, замечает промежуток между изображениями, появляющимися последовательно на экране, и кажется, что изображение дрожит. Этот эффект проявляется, например, в старых немых фильмах, поскольку они снимались со скоростью 16 кадров в секунду. Когда в 1920-х годах появились системы со звуком, скорость фильма возросла до 24 кадров в секунду, что устранило эффект дрожания и прерывистых движений актеров. Первые компьютерные системы с растровым ска- нированием разрабатывались со скоростью регенерации приблизительно 30 кадров в секунду. Это, естественно, дает хороший результат, но с увеличением скорости регенерации качество картинки на мониторе улучшается до определенного момен- та, поскольку технология создания изображения на мониторе может принципиально отличаться от методов, которые используются в фильме. Кинопроектор может сохра- нять непрерывное изображение кадра фильма, пока не появится следующий кадр. Но на мониторе люминесцентные пятна начинают угасать, как только прекращается их освещение. Итак, в современных дисплеях с растровым сканированием обновление выполняется от 60 до 80 раз в секунду, хотя скорость регенерации некоторых систем сегодня может достигать 120 кадров в секунду. Кроме того, в некоторых графических системах скорость регенерации может изменяться. Например, более высокая скорость
2.1. Приборы с мониторами 83 Рис. 2.8. Чередующиеся строки развертки на дисплее с растровым сканированием. Сперва показываются все точки строк развертки с четными номерами (сплош- ные линии), а затем все точки в строках с нечетными номерами (пунктирные линии) обновления может выбираться для стереоскопических приложений, чтобы два кадра на экране (по одному для каждого глаза) можно было независимо показывать без дро- жания изображения. Но для таких приложений, как правило, используются другие методы, такие как множественные буферы кадра. Иногда скорость регенерации выражают в циклах на секунду, или герцах (Гц), где цикл соответствует одному кадру. С помощью этих единиц можно описывать скорость регенерации в 60 кадров в секунду просто как 60 Гц. В конце каждой строки раз- вертки электронный луч возвращается на левый край экрана и начинает показывать следующую строку. Возвращение на левый край экрана называется горизонтальной трассировкой электронного луча. А в конце каждого кадра (показываемого за время от до секунды) электронный луч возвращается в верхний левый угол экрана (вертикальная трассировка), чтобы начать следующий кадр. В некоторых системах растрового сканирования и телевизорах каждый кадр по- казывается за два прохода с помощью процедуры чередующейся регенерации. При первом проходе сверху донизу луч пробегает только каждую вторую строку раз- вертки. После вертикальной трассировки луч пробегает остальные строки развертки (рис. 2.8). Такое чередование строк развертки позволяет увидеть изображение на всем экране за в два раза меньшее время, чем при пробегании всех строк сверху донизу сразу. Раньше этот метод использовался при меньших скоростях регенерации. На- пример, на более старом дисплее со скоростью регенерации 30 кадров в секунду при отсутствии чередования заметно некоторое мерцание. Но с чередованием каждый проход занимает секунды, что приближает скорость регенерации к 60 кадрам в секунду. Этот эффективный метод позволяет избежать мерцания — в предположении, что соседние строки развертки имеют сходное строение. ДИСПЛЕИ С ВЫБОРОЧНЫМ СКАНИРОВАНИЕМ Если ЭЛТ выступает в качестве дисплея с выборочным сканированием, электронный луч направляется только в те части экрана, где должна появиться картинка. Картин- ки создаются путем вычерчивания линий, электронный луч пробегает по линиям, составляющим рисунок, одна за другой. По этой причине мониторы с выборочным сканированием называют также векторными дисплеями (или дисплеями с построчной
84 Глава 2. Краткий обзор графических систем Рис. 2.9. В системе с выборочным сканированием линии, составляющие объект, рисуются в любом заданном порядке записью, или каллиграфическими дисплеями). В системе выборочного сканирования линии, составляющие рисунок, могут вычерчиваться и обновляться в любом заданном порядке (рис. 2.9). Отметим, что перьевой графопостроитель работает по аналогич- ному принципу и является примером устройства выдачи документальных копий с выборочным сканированием. Скорость регенерации системы с выборочным сканированием зависит от коли- чества линий, которые этой системе нужно изобразить. Определение изображения теперь хранится в виде набора команд для черчения линий в области памяти, на- зываемой таблицей отображения, файлом регенерации отображения, векторным файлом или программой отображения. Чтобы отобразить заданный рисунок, систе- ма выполняет цикл команд из файла отображения, изображая все линии по очереди. После выполнения всех команд для черчения линий система возвращается к первой командной строке в таблице. Дисплеи с выборочным сканированием проектируются таким образом, чтобы все линии, составляющие рисунок, изображались от 30 до 60 раз в секунду, причем число “коротких” линий в таблице отображения может дохо- дить до 100 000. Если нужно изобразить небольшой набор линий, то выполнение каждого цикла задерживается, чтобы избежать очень большой скорости регенерации, которая может привести к сгоранию люминесцентного покрытия.
2.1. Приборы с мониторами 85 Системы с выборочным сканированием создавались для чертежных приложений, предназначенных для построения архитектурных и инженерных схем, и они не мо- гут изображать реалистичные сцены с затенением. Поскольку определение рисунка хранится в виде набора команд для черчения линий, а нс в виде набора значений интенсивности для всех точек экрана, векторные дисплеи, как правило, обладают большим разрешением, чем растровые системы. Кроме того, векторные дисплеи да- ют более гладкие линии, поскольку траектория луча ЭЛТ непосредственно совпадает с самой линией. В растровых системах, наоборот, линии получаются зубчатыми, по- скольку они изображаются как дискретные наборы точек. Несмотря на это, большая гибкость и большие возможности создания изображений растровых систем приводят к тому, что векторной технологии не уделяют должного внимания. ЦВЕТНЫЕ МОНИТОРЫ С ЭЛТ С помощью монитора с ЭЛТ можно показывать цветные изображения, используя комбинацию люминофоров, излучающих свет разных цветов. Свет, излучаемый раз- личными люминофорами, сливается и воспринимается глазом как один цвет, который зависит от заданного сочетания возбужденных люминофоров. Один из способов изображения цветных картинок — покрыть экран слоями раз- ноцветных люминофоров. Цвет излучаемого света будет зависеть от того, насколько глубоко электронный луч проникает в слой люминесцентного покрытия. При та- ком подходе, который называют методом проникновения луча, обычно используется только два люминесцентных слоя: красный и зеленый. Пучок медленных электро- нов возбуждает только внешний красный слой, а пучок очень быстрых электронов проходит сквозь красный слой и возбуждает внутренний зеленый слой. При средней скорости излучается сочетание красного и зеленого света, что позволяет получить еще два дополнительных цвета — оранжевый и желтый. Скорость электронов, а сле- довательно, и цвет экрана в каждой точке контролируется с помощью напряжения, ускоряющего электронный луч. Проникновение луча — недорогой способ получения цвета, но при этом можно получить только ограниченный набор цветов, и качество изображения не такое высокое, как при других подходах. В растровых системах (в том числе и в цветных телевизорах) широко используют- ся масочные методы, поскольку они позволяют получить намного большую палитру цветов, чем метод проникновения луча. Масочный метод основан на том, что мы воспринимаем цвета как сочетания красной, зеленой и синей составляющих, что на- зывается RGB-моделью цвета. Таким образом, в масочных ЭЛТ в каждом пикселе находится три цветные люминесцентные точки. Одна люминесцентная точка излу- чает красный цвет, другая — зеленый, а третья — синий. Такие ЭЛТ состоят из трех электронных пушек, по одной для точек каждого цвета, и масочной решетки, которая находится сразу за люминесцентным экраном. Свет, излучаемый тремя люминофора- ми, дает маленькое цветное пятнышко в каждом положении пикселя, поскольку чело-
86 Глава 2. Краткий обзор графических систем Рис. 2.10. Принцип дей- ствия дельта-дельта ма- сочной ЭЛТ. Три элек- тронные пушки, распо- ложенные таким обра- зом, чтобы образовы- вать треугольные узо- ры из цветных точек на экране, направляют- ся в каждый треуголь- ник точек с помощью теневой маски веческий глаз имеет свойство объединять цвета, излучаемые тремя точками, в один цвет. На рис. 2.10 показан масочный метод дельта-дельта, который обычно использу- ется в цветных системах с ЭЛТ. Три электронных луча отклоняются и фокусируются как одна группа на теневую маску, состоящую из набора отверстий, совпадающих с узором из люминесцентных точек. Когда три электронных луча проходят через отвер- стие в теневой маске, они активизируют треугольник точек, который появляется как маленькое цветное пятнышко на экране. Люминесцентные точки в треугольниках рас- положены так, что каждый электронный луч, прошедший через теневую маску, может активизировать только соответствующую ему цветную точку. Еще одна конфигура- ция для трех электронных пушек — это прямолинейное расположение, при котором три электронные пушки и соответствующие им красно-сине-зеленые цветные точки на экране расположены на одной строке развертки, а не в виде треугольника. При таком прямолинейном расположении электронные пушки легче выравнивать, и оно, как правило, используется в цветных ЭЛТ с высоким разрешением. Цвета в теневых ЭЛТ меняются путем изменения уровня интенсивности трех электронных лучей. Отключив две из трех пушек, получим только один цвет, ис- ходящий из единственного активизированного люминофора (красный, зеленый или синий). Если все три точки активизируются лучами одинаковой интенсивности, мы видим белый цвет. Желтый цвет получается при одинаковых интенсивностях только зеленой и красной точек, фиолетовый получается при равных интенсивностях синего и красного, а голубой цвет появляется, если синий и зеленый цвета активизированы с одинаковой силой. В недорогих системах каждая из трех электронных пушек огра- ничена положениями либо “включено”, либо “выключено”, и при этом количество отображаемых цветов равно восьми. В более сложных системах возможны промежу- точные уровни интенсивности электронных лучей, что позволяет получить несколько миллионов цветов.
2.1. Приборы с мониторами 87 В цветных графических системах используется несколько видов дисплеев с ЭЛТ. Некоторые недорогие домашние компьютерные системы и видеоигры рассчитаны на использование цветного телевизора и радиочастотного модулятора. Назначение ра- диочастотного модулятора состоит в моделировании сигнала принимаемой телевизи- онной станции. Это означает, что информация о цвете и интенсивности изображения должна объединяться и налагаться на несущий сигнал частоты радиовещания, кото- рый используется в качестве входного сигнала телевизора. Затем этот сигнал из ра- диочастотного модулятора попадает на схемы телевизора, из него извлекается инфор- мация об изображении, которое и появляется на экране. Как и можно было бы ожи- дать, эта дополнительная обработка информации об изображении радиочастотным модулятором и телевизионными схемами снижает качество изображаемой картинки. Комбинированные мониторы — это адаптированные телевизоры, позволяющие обойти схему радиовещания. Для этих устройств все еще необходимо, чтобы ин- формация об изображении была объединенной, но уже не нужен несущий сигнал. Поскольку информация об изображении объединяется в сложный сигнал, а затем разделяется самим монитором, качество картинки оставляет желать лучшего. Цветные ЭЛТ в графических системах проектируются как RGB-мониторы. В этих мониторах используются масочные методы, а уровень интенсивности каждой электронной пушки (красной, зеленой и синей) берется непосредственно из компью- терной системы без какой-либо промежуточной обработки. В высококачественных растровых графических системах в буфере кадра приходится 24 бит на пиксель, что позволяет предлагать 256 вариантов напряжения для каждой электронной пушки и почти 17 миллионов вариантов цветов для каждого пикселя. Цветные RGB-системы с 24 бит памяти на один пиксель обычно называют полноцветными системами или системами реального цвета. ДИСПЛЕИ С ПЛОСКИМ ЭКРАНОМ Хотя большинство графических мониторов все еще оснащаются ЭЛТ, появляются новые технологии, которые вскоре могут заменить мониторы с ЭЛТ Дисплеями с плоским экраном называют класс видеоустройств с меньшим объемом, весом и по- треблением энергии, чем ЭЛТ. Главная отличительная характеристика дисплеев с плоским экраном — это то, что они тоньше, чем ЭЛТ, и их можно повесить на сте- ну или носить на запястье. Поскольку на некоторых дисплеях с плоским экраном можно даже писать, их можно также использовать в качестве карманных записных книжек. Еще несколько дополнительных областей применения дисплеев с плоским экраном — это маленькие телевизионные экраны, экраны калькуляторов, экраны для карманных видеоигр, экраны портативных компьютеров, видеосистемы в подлокот- никах сидений для авиалиний, рекламные щиты в лифтах и графические дисплеи в приложениях, для которых нужны жесткие портативные мониторы.
88 Глава 2. Краткий обзор графических систем Рис. 2.11. Стандартная схема дисплея с плазменным экраном Стеклянная пластина Проводники Стеклянная пластина Дисплеи с плоским экраном можно разделить на две категории: излучающие и неизлучающие. Излучающие дисплеи (или эмиттеры) — это устройства, превраща- ющие электрическую энергию в свет. Плазменные табло, тонкопленочные электро- люминесцентные дисплеи и светоизлучающие диоды — это примеры излучающих дисплеев. Также были разработаны плоские ЭЛТ, в которых электронные лучи уско- ряются параллельно экрану, а затем отклоняются на экран под углом 90°. Но плоские ЭЛТ оказались не такими удачными, как другие излучающие устройства. В неизлуча- ющих дисплеях (или неэмиттерах) используются оптические эффекты, с помощью которых солнечный свет или свет от какого-то другого источника преобразуется в гра- фическое изображение. Самый главный пример неизлучающего дисплея с плоским экраном — это устройства на жидких кристаллах. Плазменные табло, которые еще называют газоразрядными дисплеями, констру- ируются путем заполнения пространства между двумя стеклянными пластинами сме- сью газов, в состав которой, как правило, входит неон. На одной стеклянной пане- ли находится ряд вертикальных проводящих полос, а в другую стеклянную панель встроен ряд горизонтальных проводящих полос (рис. 2.11). Напряжение возникнове- ния разряда, приложенное к пересекающейся паре горизонтальных и вертикальных проводников, приводит к тому, что на пересечении двух проводников газ распадается на сияющую плазму, состоящую из электронов и ионов. Описание изображения хра- нится в буфере регенерации, а напряжение возникновения разряда для обновления положений пикселей подается (на пересечении проводников) 60 раз в секунду. Ме- тоды переменного тока позволяют ускорить приложение напряжения возникновения разряда и, следовательно, увеличить яркость экрана. Разделение пикселей обеспечи- вается электрическим полем проводников. На рис. 2.12 показано плазменное табло с
2.1. Приборы с мониторами 89 Рис. 2.12. Дисплей с плазменным экраном с разрешением 2048 на 2048 и диагональю порядка 1,5 метра (перепеча- тано с разрешения компании Photonics Systems) высоким разрешением. Единственным недостатком плазменных табло было то, что они были строго монохроматическими устройствами, но сейчас появились системы с многоцветными возможностями. Тонкопленочные электролюминесцентные дисплеи похожи по своему строению на плазменные табло. Отличие заключается в том, что область между стеклянными пластинами заполнена не газом, а люминофором, таким как сульфид цинка с до- бавками марганца (рис. 2.13). Если на пару пересекающихся электродов подается достаточно высокое напряжение, люминофор в области пересечения двух электродов становится проводником. Атомы марганца поглощают электрическую энергию, а за- тем превращают ее в пятно света, подобно явлению свечения плазмы в плазменных табло. Электролюминесцентные дисплеи более энергоемкие, чем плазменные табло, а хорошей гаммы цветов достичь труднее. Третий вид излучающих устройств — это светоизлучающие диоды (СИД). Мас- сив диодов располагается таким образом, чтобы он повторял положения пикселей на дисплее, а описание изображения хранится в буфере регенерации. Как и при об- новлении строк развертки в ЭЛТ, информация считывается из буфера регенерации и преобразуется в различные уровни напряжения, которое подается на диоды, создавая световое изображение на дисплее. Жидкокристаллические дисплеи (ЖКД) широко используются в небольших си- стемах, таких как портативные компьютеры и калькуляторы (рис. 2.14). В этих неиз- лучающих устройствах изображение создается при прохождении поляризованного света от окружающей среды или внешнего источника через жидкокристаллическое вещество, которое может либо перекрывать, либо пропускать свет.
90 Глава 2. Краткий обзор графических систем Рис. 2.13. Стандартная схема тонко- пленочного электролюминесцентного дисплея Проводники Стеклянная Люминофор Стеклянная пластина Рис. 2.14. Карманный калькулятор с жидкокристаллическим диспле- ем (перепечатано с разрешения компании Texas Instruments) Термин жидкие кристаллы означает, что эти соединения отличаются кристалли- ческим расположением молекул, хотя и текут, как жидкости. В дисплеях с плоским экраном, как правило, используют нематические (нитеподобные) жидкокристалличе- ские соединения, в которых сохраняется направление длинных осей вытянутых мо- лекул. Итак, с помощью нематического жидкого кристалла можно сконструировать
2.1. Приборы с мониторами 91 Рис. 2.15. Принцип действия заслонки, изменяющей поля- ризацию света, ко- торая используется во многих устрой- ствах с жидкокри- сталлическими дис- плеями дисплей с плоским экраном, как это показано на рис. 2.15. Между двумя стеклян- ными пластинками, каждая из которых содержит поляризатор света, расположенный под прямым углом к другой пластинке, находится жидкокристаллическое вещество. В одну стеклянную пластину встроены горизонтальные ряды прозрачного проводни- ка, а в другую пластину вставлены вертикальные колонки проводника. Пересечение двух проводников определяет положение пикселя. Обычно молекулы располагаются так, как показано на рис. 2.15 (положение “включено”)- Поляризованный свет, кото- рый проходит через вещество, разворачивается таким образом, чтобы пройти через противоположный поляризатор. Затем свет отражается обратно и попадает к наблю- дателю. Чтобы выключить пиксель, на два пересекающихся проводника подается напряжение, в результате чего молекулы располагаются таким образом, что поляри- зация света не разворачивается. Этот вид устройств с плоским экраном называется пассивно-матричными ЖКД. Информация об изображении хранится в буфере реге- нерации, а обновление экрана происходит с частотой 60 кадров в секунду, как и в излучающих устройствах. Очень часто применяется еще и задняя подсветка с исполь- зованием полупроводниковых электронных приборов, так что система не полностью зависит от внешних источников освещения. Цвета можно изображать с помощью
92 Глава 2. Краткий обзор графических систем различных материалов или красителей, а также путем размещения троек цветных пикселей в каждой точке экрана. Еще одна конструкция ЖКД — это когда в каждом положении пикселя находится транзистор. Здесь используется метод тонкопленочных транзисторов. Транзисторы применяются для управления напряжением в пикселях и для предотвращения постепенной утечки заряда из жидкокристаллических ячеек. Та- кие приборы называются активно-матричными дисплеями. ПРИБОРЫ С ТРЕХМЕРНЫМ ИЗОБРАЖЕНИЕМ Графические мониторы для создания трехмерных сцен были сконструированы с по- мощью методики, основанной на отражении картинки ЭЛТ от колеблющегося гибкого зеркала (рис. 2.16). Когда зеркало с переменным фокусным расстоянием колеблется, его фокусное расстояние меняется. Эти колебания синхронизируются с изображением объекта на ЭЛТ, так что каждая точка объекта отражается от зеркала в то положение в пространстве, которое соответствует расстоянию от этой точки до заданного по- ложения создающегося изображения. Это позволяет нам ходить вокруг объекта или сцены и рассматривать его с разных сторон. На рис. 2.17 показана система Genisco SpaceGraph, в которой для проекции трех- мерных объектов в область пространства размером 25 на 25 см используется ко- леблющееся зеркало. Кроме того, эта система обладает возможностью изображать двухмерные поперечные разрезы объектов на различной глубине. Такие системы обычно используются в медицинских приложениях для анализа данных ультразвуко- вых исследований и компьютерной томографии, в геологических приложениях для анализа топологических и сейсмических данных, в архитектурных приложениях и для моделирования таких трехмерных систем, как молекулы или рельеф местности. Рис. 2.16. Принцип действия системы создания трехмерного изображения с колеблющимся зеркалом, фокусное расстояние которого изменяется в зависи- мости от глубины точек изоб- ражаемой сцены
2.1. Приборы с мониторами 93 Рис. 2.17. Интерактивная графическая система SpaceGraph может изображать предметы в трех измерениях с помощью колеблющегося гибкого зеркала (перепечатано с разреше- ния кампании Genisco Computers Corporation) СТЕРЕОСКОПИЧЕСКИЕ СИСТЕМЫ И ВИРТУАЛЬНАЯ РЕАЛЬНОСТЬ Еще один способ описания трехмерного объекта — это создание его стереоскопиче- ского изображения. Этот метод не дает настоящих трехмерных изображений, но со- здается впечатление трехмерного пространства благодаря двум разным изображениям для каждого глаза наблюдателя, так что кажется, что сцены обладают определенной глубиной (рис. 2.18). Рис. 2.18. Смоделированный вид стереоскопической про- екции (перепечатано с разрешения компании StereoGraph- ics Corporation)
94 Глава 2. Краткий обзор графических систем Рис. 2.19. Стереоскопическая пара изображений (перепечатано с разрешения Джерри Фарма (Jerry Farm)) Рис. 2.20. Очки для просмотра стереоскопи- ческого изображения и инфракрасный син- хронизирующий излучатель (перепечатано с разрешения компании StereoGraphics Cor- poration) Чтобы получить стереоскопическую проекцию, нужны два изображения сцены, для которых направление взгляда совпадает с линиями, соединяющими точки, в ко- торых находится каждый глаз в отдельности (правый и левый), и сцену. Эти два изображения можно получить как компьютерные сцены, созданные при различных точках наблюдения, или воспользоваться стереоскопической парой камер и сфото- графировать объект или сцену. Когда мы одновременно смотрим левым глазом на левое изображение, а правым — на правое, два изображения сливаются в одно и мы воспринимаем его как объемную сцену. На рис. 2.19 показаны два изображения компьютерной сцены для стереоскопической проекции. Во избежание дискомфор- та участки слева и справа от изображения, которые видны только одному глазу, не демонстрируются. Один из способов создания стереоскопического эффекта в растровых системах — показать каждое из двух изображений в чередующихся циклах регенерации. На экран при этом смотрят через очки, каждая линза которых действует, как быстро закры- вающаяся и открывающаяся заслонка, которая синхронизирована с экраном таким
2.1. Приборы с мониторами 95 Рис. 2.21. Шлем, который используется в системах виртуальной реальности (перепе- чатано с разрешения компании Virtual Re- search) Рис. 2.22. Молекулярный биолог, анализи- рующий молекулярные структуры в системе виртуальной реальности, которая называется Trimension ReaCTor. "‘Перчатки для захвата в ложном пространстве” позволяют ученому брать в руки и передвигать виртуальные объекты в спроектированной сцене (пере- печатано с разрешения компаний Silicon Graphics, Inc. и Trimension Systems ReaCTor. © 2003, SGI) образом, чтобы в определенный момент закрывать одно из изображений. На рис. 2.20 показаны стереоскопические очки с жидкокристаллическими заслонками и инфра- красный излучатель, который синхронизирует очки с изображениями на экране. Стереоскопическое зрение — это один из элементов систем виртуальной реально- сти, в которых пользователь может войти в сцену и взаимодействовать с окружением в ней. Для определения местоположения и выполнения каких-либо действий над объектами сцены может использоваться шлем (рис. 2.21), содержащий оптическую систему для создания стереоскопических изображений. Сенсорная система в шлеме отслеживает положение наблюдателя, так что, когда наблюдатель “ходит по сцене” и взаимодействует с изображением, он может видеть переднюю и заднюю стороны предметов. Еще один способ создания окружения в виртуальной реальности — ис- пользовать проекторы, которые создают сцену, окруженную стенами, как показано на рис. 2.22, где наблюдатель взаимодействует с виртуальным изображением с помощью стереоскопических очков и “информационных” перчаток (раздел 2.4).
96 Глава 2. Краткий обзор графических систем Рис. 2.23. Прибор для ультразвукового от- слеживания, который используется вместе со стереоскопическими очками для фиксирова- ния изменений положения головы наблюда- теля (перепечатано с разрешения компании StereoGraphics Corporation) Недорогую интерактивную систему виртуальной реальности можно создать с помощью графического монитора, стереоскопических очков и прибора для отслежи- вания положения головы. На рис. 2.23 показан прибор для ультразвукового контроля с шестью степенями свободы. Этот прибор размещают над монитором и используют для фиксирования движений головы, так что положение наблюдателя на сцене может изменяться при изменении положения головы. 2.2. СИСТЕМЫ РАСТРОВОГО СКАНИРОВАНИЯ Интерактивные растровые графические системы, как правило, состоят из нескольких элементов, обрабатывающих информацию. Кроме центрального процессора, или ЦП, для управления работой прибора с дисплеем используется специальный процессор, который называется видеоконтроллером или контроллером дисплея. Структура про- стой растровой системы показана на рис. 2.24. Здесь буфер кадра может находиться в любой области памяти системы, а видеоконтроллер обращается к буферу кадра для обновления экрана. В более сложных растровых системах, кроме видеоконтроллера, есть еще и другие процессоры, такие как сопроцессоры и ускорители, выполняющие различные графические операции. ВИДЕОКОНТРОЛЛЕР На рис. 2.25 показана характерная структура растровой системы. Фиксированная область памяти системы занята буфером кадра, а видеоконтроллер имеет непосред- ственный доступ к этой области буфера кадра.
2.2. Системы растрового сканирования 97 МП Оперативна память Видео- контроллер Системная шина Устройства ввода-вывода Рис. 2.24. Структура простой растровой графической системы Системная шина Устройства ввода-вывода Рис. 2.25. Структура растровой системы с фиксированной долей памяти системы, предназначен- ной для буфера кадра Местоположения буферов кадра, а также соответствующие положения на экране записываются в декартовых координатах. В программе-приложении используются команды из графического программного пакета, которые определяют координаты изображаемых объектов относительно начала отсчета декартовой системы коорди- нат. Часто при выполнении команд программного пакета в качестве начала координат берется левый нижний угол экрана, хотя обычно мы можем поместить начало коор- динат в любую удобную нам для данного приложения точку. После этого поверхность экрана представляют в виде первого квадранта двухмерной системы координат, где положительные значения х увеличиваются слева направо, а положительные значения у увеличиваются в направлении снизу вверх. Затем положениям пикселей присваива- ются целые значения х в диапазоне от 0 до хтах по всему экрану в направлении слева направо и целые значения у, которые изменяются от 0 до утах в направлении снизу вверх. Однако при таких процессах, как обновление экрана, которые выполняются самими аппаратными средствами, а также некоторыми программными продуктами, положения пикселей отсчитываются от верхнего левого угла экрана.
98 Глава 2. Краткий обзор графических систем Рис. 2.26. Декартова система координат с началом отсчета в нижнем левом углу монитора Напряжение горизонтального и вертикального отклонения Генера гор рас гровогп сканирования Регистр х Регистру Адреса в памяти Регистр пикселей Интенсивность Рис. 2.27. Основные опе- рации обновления, за ко- торые отвечает видеокон- троллер Буфер кадра На рис. 2.27 схематически изображены основные операции обновления, за кото- рые отвечает видеоконтроллер. Для записи значений координат пикселей на экране используется два регистра. Изначально регистру х присваивается значение 0, а ре- гистру у — значение верхней строки развертки. Затем для этого положения пикселя извлекается содержимое буфера кадра и используется для задания интенсивности луча ЭЛТ. После этого значение в регистре х увеличивается на 1, и весь процесс повторяется для следующего пикселя в верхней строке развертки. Эта процедура продолжается для всех пикселей в верхней строке. После того как будет обработан последний пиксель, регистру х снова присваивается значение 0, а регистру у — зна- чение следующей строки развертки, которая находится ниже верхнего края экрана. Затем по очереди обрабатываются пиксели в этой строке, и эта процедура повторя-
2.2. Системы растрового сканирования 99 ется для каждой последующей строки развертки. После прохождения всех пикселей в нижней строке развертки видеоконтроллер возвращает регистры к положению пер- вого пикселя в верхней строке развертки, и процесс обновления начинается сначала. Поскольку экран должен обновляться со скоростью не меньше, чем 60 кадров в секунду, простая процедура, показанная на рис. 2.27, может оказаться невыполнимой для обычных микросхем оперативной памяти, если время выполнения цикла будет слишком большим. Для ускорения обработки пикселей видеоконтроллеры при каж- дом прохождении могут извлекать из буфера кадра значения нескольких пикселей. Затем интенсивности для нескольких пикселей записываются в отдельный регистр и используются для управления интенсивностью луча ЭЛТ для группы соседних пик- селей. После обработки этой группы из буфера кадра извлекается следующий блок значений пикселей. Видеоконтроллер можно сконструировать таким образом, чтобы он выполнял и ряд других операций. Для различных приложений видеоконтроллер при разных цик- лах обновления может извлекать значения пикселей из разных участков памяти. В некоторых системах, например, часто применяется несколько буферов, так что один буфер может использоваться для регенерации, в то время как другие заняты загрузкой информации. Затем текущий буфер регенерации может поменяться местами с одним из оставшихся буферов. Это обеспечивает, например, быстрое создание анимацион- ных изображений в реальном времени за счет того, что различные виды движущихся объектов могут последовательно загружаться в буфер без перерыва на время регенера- ции. Еще одна задача видеоконтроллера состоит в преобразовании блоков пикселей с целью увеличения, уменьшения или перемещения отдельных участков экрана во вре- мя выполнения цикла регенерации. Кроме того, в видеоконтроллере часто содержится таблица поиска, так что вместо того, чтобы непосредственно контролировать интен- сивность луча ЭЛТ, значения пикселей в буфере кадра используются для получения доступа к таблице поиска. Это дает возможность быстро изменять значения интен- сивности на экране. Более подробно таблицы поиска рассматриваются в главе 4. Наконец, некоторые системы разрабатываются так, что видеоконтроллер способен соединять изображение из буфера кадра со введенным изображением телевизионной камеры или другого устройства ввода. ПРОЦЕССОР ДИСПЛЕЯ С РАСТРОВЫМ СКАНИРОВАНИЕМ На рис. 2.28 показан один из способов организации элементов растровой системы с отдельным процессором дисплея, который иногда называют графическим контрол- лером или сопроцессором дисплея. Задача процессора дисплея — освободить ЦП от графических операций. Кроме общей памяти системы, для процессора дисплея может еще предоставляться отдельная область памяти.
100 Глава 2. Краткий обзор графических систем Системная шина Устройства ввода-вывода Рис. 2.28. Структура растровой графической системы с процессором дисплея Рис. 2.29. Описание символа с помощью прямоугольной сетки положе- ний пикселей Главная задача процессора дисплея заключается в оцифровке описания изобра- жения, заданного программой-приложением, и превращении его в набор значений пикселей, которые записываются в буфер кадра. Этот процесс оцифровки называется преобразованием в стандарт развертки. Графические команды, описывающие пря- мые линии и другие геометрические объекты, преобразуются в набор дискретных точек, соответствующих положениям пикселей на экране. Преобразование стандар- тов развертки прямолинейного элемента, например, означает, что пиксели следует расположить так, чтобы они как можно точнее напоминали прямую линию, и за- писать в буфер кадра значения цвета для каждого положения. Аналогичные методы используются для преобразования стандартов развертки других объектов из описания изображения. Символы можно задавать с помощью прямоугольной сетки пикселей, как показано на рис. 2.29, или в виде контурных форм, как это сделано на рис. 2.30.
2.2. Системы растрового сканирования 101 Рис. 2.30. Описание символа с помощью контурной схемы Для высококачественных дисплеев размер массива для сеток символов может варьи- роваться от приблизительно 5 на 7 до 9 на 12 или больше. Сетка символа изображается путем наложения прямоугольного узора сетки на буфер кадра в точке с заданными координатами. Для символов, которые задаются через контуры, форма подвергается преобразованию стандартов развертки и записывается в буфер кадра через положения пикселей, наиболее близкие к контуру. Процессоры дисплеев также разрабатываются таким образом, чтобы они могли выполнять ряд дополнительных операций. В число этих функций входит создание различных типов линий (сплошные и разные виды пунктирных), изображение цвет- ных участков и преобразование объектов сцены. Кроме того, процессоры дисплеев, как правило, разрабатываются для работы с интерактивными устройствами ввода, такими как мышь. В попытках сократить требуемый объем памяти для растровых систем были при- думаны методы организации буфера кадра в виде связного списка и кодирования информации о цвете. Одна из схем организации — это запись каждой строки разверт- ки в виде набора пар чисел. Первое число в каждой паре может определять значение цвета, а второе — задавать количество соседних пикселей на линии развертки, которые следует изображать в этом цвете. Эта методика, называемая групповым кодировани- ем, может значительно сэкономить память, особенно если изображение состоит по большей части из длинных рядов пикселей одного цвета. Подобным методом можно воспользоваться, если цвет пикселей изменяется линейно. Другой подход — это коди- рование развертки в виде набора прямоугольных участков (кодирование ячеек). Недо- статок группового кодирования заключается в том, что с уменьшением длины строк изменение цвета сложно записывать, а требуемый объем памяти возрастает. Кроме того, контроллеру дисплея трудно обрабатывать развертку, если она состоит из множе- ства коротких строк. Более того, размер буфера кадра уже не имеет первостепенного значения из-за резкого снижения затрат памяти. Тем не менее методы кодирования могут пригодиться для записи данных и передачи информации об изображении.
102 Глава 2. Краткий обзор графических систем Рис. 2.31. Рабочая станция художника, состо- ящая из монитора, клавиатуры, графическо- го планшета с ручным курсором и светового стола, а также устройств для записи данных и телекоммуникаций (перепечатано с разре- шения компании DICOMED Corporation) 2.3. ГРАФИЧЕСКИЕ РАБОЧИЕ СТАНЦИИ И СИСТЕМЫ СОЗДАНИЯ ИЗОБРАЖЕНИЙ Сегодня большинство графических мониторов работает как дисплеи растрового ска- нирования, широко используются как ЭЛТ, так и системы с плоским экраном. К графическим рабочим станциям можно отнести очень многие системы, от неболь- ших компьютерных систем общего назначения до многоэкранных комплексов, часто со сверхбольшими экранами обозрения. Разрешение экрана персонального компью- тера варьируется от приблизительно 640 на 480 до 1280 на 1024, а длина диагонали экрана — от 12 до свыше 21 дюйма. Большинство систем общего назначения сегодня обладает значительными возможностями передачи цвета, а многие из них являются полноцветными системами. В настольной рабочей станции, разработанной специаль- но для графических приложений, разрешение экрана может варьироваться от 1280 на 1024 до приблизительно 1600 на 1200, диагональ экрана при этом обычно равна или превышает 18 дюймов. Можно также найти коммерческие рабочие станции с различ- ными устройствами для специальных приложений. На рис. 2.31 показаны основные элементы одного из видов рабочей станции художника. Графические системы с высоким разрешением (до 2560 на 2048) обычно исполь- зуются для создания изображений в медицине, при управлении воздушным движени- ем, для моделирования и автоматизированного проектирования. Дисплей с плоским экраном с разрешением 2048 на 2048 показан на рис. 2.32. Многие профессиональные графические рабочие станции включают в себя еще и большие экраны обозрения часто со специальными возможностями. На рис. 2.33 изображена система стереоскопического зрения с большим экраном, а на рис. 2.34 — многоканальная широкоэкранная система. Многопанельные экраны используются в различных приложениях, для которых необходим экран размером на всю стену. Такие системы разрабатываются для пред- ставления на собраниях, конференциях, съездах, предпремьерных показах нового
2.3. Гмафические рабочие станции и системы создания изображений 103 Рис. 2.32. Графический монитор с высоким разрешением (2048 на 2048) (перепечатано с разрешения компании BarcoView) Рис. 2.33. Центр виртуальной реальности SGI 2000D с ImmersaDesk R2, показывающий на большом экране стереоскопическое изобра- жение профиля давления при моделировании движения крови по сосудам, наложенное на массив анатомических данных с объемным закрашиванием (перепечатано с разрешения компании Silicon Graphics, Inc. и профессора Чарльза Тейлора (Charles Taylor), Стэнфорд- ский университет. © 2003, SGI) фильма узкому кругу, в магазинах, музеях и на крупных пассажирских станциях. Многопанельный дисплей можно использовать, если нужно показать большое изоб- ражение одной сцены или несколько отдельных изображений. На каждой панели в такой системе изображается одна часть общей картины, как показано на рис. 2.35. Большие графические дисплеи могут также иметь такие экраны обозрения с изогну- той поверхностью, как в системе на рис. 2.36. Большая система с изогнутым экраном может оказаться полезной для группы людей, изучающих отдельное графическое приложение, как на примерах, показанных на рис. 2.37 и 2.38. Центр управления, оснащенный рядом стандартных мониторов, дает оператору возможность видеть ча- сти большого экрана и управлять аудио-, видео-, осветительными и проектирующими системами с помощью меню на сенсорном экране. Проекторы системы обеспечива- ют создание цельного, многоканального изображения, включая плавный переход на
104 Глава 2. Краткий обзор графических систем Рис. 2.34. Широкоэкранное изображение мо- лекулярной системы, созданное с помощью трехканального центра виртуальной реально- сти SGI 3300W (перепечатано с разрешения компаний Silicon Graphics, Inc. и Molecular Simulations. © 2003, SGI) Рис. 2.35. Многопанельная система создания изображений “Super Wall” (перепечатано с разрешения компании RGB Spectrum) Рис. 2.36. Система безопасности государства на большом изогнутом экране обозрения (пе- репечатано с разрешения компании Silicon Graphics, Inc. © 2003) краях, компенсацию искажений и баланс цветов. А для создания эффекта звукового окружения используется система объемного звучания. На рис. 2.39 показана система обозрения тренажера диспетчерской башни НАСА с обзором 360°, которая использу- ется для обучения и проверки способов решения задач, возникающих при управлении движением в воздухе и работе диспетчеров в аэропортах.
2.3. Графические рабочие станции и системы создания изображений 105 Рис. 2.37. Графическая система с изогнутым экраном, на которой изображается ин- терактивная прогулка по заводу по переработке природного газа (перепечатано с разрешения компаний Silicon Graphics, Inc., Trimension Systems и Cadcentre, Cor- taillod, Швейцария. © 2003, SGT) Рис. 2.38. Геофизическое изображение, представленное на 25-футовом полукруг- лом экране, который обеспечивает обзор 160° по горизонтали и 40° по вертикали (перепечатано с разрешения компаний Silicon Graphics, Inc., Landmark Graphics Corporation и Trimension Systems. © 2003, SGI)
106 Глава 2. Краткий обзор графических систем 2.4. Рис. 2.39. Трена- жер диспетчерской башни в аэропор- ту НАСА с экра- ном обзора 360° под названием Fu- tureFlight Central Facility (перепеча- тано с разреше- ния компании Sili- con Graphics, Inc. и NASA. © 2003, SGI) УСТРОЙСТВА ВВОДА В графических рабочих станциях для ввода данных могут использоваться различные устройства. Большая часть систем оснащена клавиатурой и одним или несколькими дополнительными устройствами, разработанными специально для интерактивного ввода. К ним относятся мышь, трекбол, пространственный манипулятор и джойстик. Некоторые другие устройства ввода, которые используются в специализированных приложениях, — это цифровой преобразователь, круговая шкала, “информационные” перчатки, поле клавиш, сканер изображений и голосовая система. КЛАВИАТУРА, БЛОК КНОПОК И КРУГОВАЯ ШКАЛА Буквенно-цифровая клавиатура в графических системах используется, главным обра- зом, для ввода текстовых строк, задания определенных команд и выбора опций меню. Клавиатура — это эффективное устройство ввода такой неграфической информации, как подписи под рисунками, изображаемыми на графическом дисплее. Клавиатура также может быть оснащена специальным приспособлением для ввода координат экрана, выбора опций меню или графических функций. Обычные приспособления на клавиатуре общего назначения — это клавиши управления курсором и функциональные клавиши. Функциональные клавиши позво- ляют пользователю выбирать часто используемые операции одним нажатием клави- ши, а клавиши управления курсором удобны для выбора изображенного объекта или места на экране путем перемещения курсора по экрану. Кроме того, клавиатура может включать и другие виды приспособлений для управления курсором, такие как трек- бол или джойстик, наряду с полем клавиш для быстрого ввода численных данных. Кроме этих приспособлений, некоторые клавиатуры имеют эргономичный дизайн (рис. 2.40), который подразумевает приспособления для снятия усталости оператора.
2.4. Устройства ввода 107 Рис. 2.40. Эргономичная клавиатура со съемными подставками для ладоней. На- клон каждой половинки клавиатуры ре- гулируется независимо. Однокнопочная мышь, лежащая перед клавиатурой, с по- мощью кабеля подключается к централь- ному процессору (перепечатано с разре- шения компании Apple Computer, Inc.) Для выполнения специализированных задач ввод информации в графических приложениях может осуществляться с помощью поля клавиш, наборного диска или переключателей, которые служат для выбора значений данных или обычных графиче- ских операций. На рис. 2.41 приведен пример поля клавиш и наборных дисков. Кнопки и переключатели часто используются для ввода стандартных функций, а наборные диски — обычное устройство для ввода скалярных величин. Численные значения в пределах некоторого заданного диапазона выбираются для ввода путем вращения диска. Для измерения величины поворота диска используют потенциометр, а затем полученные значения преобразуются в соответствующие цифры. МЫШЬ На рис. 2.40 показан стандартный дизайн однокнопочной мыши, которая представ- ляет собой небольшой элемент, который помещается в руке и обычно перемещается по плоской поверхности с целью управления курсором на экране. Для записи ве- личины и направления перемещения можно использовать колесики или валики на подошве мыши. Еще один способ регистрации перемещений мыши — использовать оптический датчик. В некоторых оптических системах мышь перемещается по спе- циальному коврику, представляющему собой сетку горизонтальных и вертикальных линий. Оптический датчик фиксирует момент пересечения мышью этих линий. Дру- гие оптические мыши могут работать на любой поверхности, некоторые из них могут быть беспроводными, а связь между ними и процессором компьютера осуществляет- ся с помощью цифровой радиосвязи. Поскольку мышь можно поднять и поставить на другое место без изменения положения курсора на экране, ее используют для осуществления относительных из- менений положения курсора. В верхней части мыши расположены одна, две, три или четыре кнопки, позволяющие подавать сигнал для выполнения таких операций, как
108 Глава 2. Краткий обзор графических систем а) б) Рис. 2.41. Поле клавиш (панель а) и наборные диски (панель б) для ввода данных. (Перепечатано с разрешения компании Vector General) Рис. 2.42. Z-мышь с тремя кнопками, шариком вни- зу, колесиком для большого пальца сбоку и трекбо- лом сверху (перепечатано с разрешения Multipoint Technology Corporation) фиксация положения курсора или вызов функции. Сейчас большая часть графиче- ских систем общего назначения оснащается мышью и клавиатурой как основными устройствами ввода. К основному дизайну мыши могут добавляться дополнительные элементы, позво- ляющие увеличить количество возможных параметров ввода. У Z-мыши на рис. 2.42 есть три кнопки, колесико для большого пальца сбоку, трекбол сверху и обычный шарик внизу. Такой дизайн обеспечивает шесть степеней свободы для выбора по- ложения в пространстве, угла поворота и других параметров. С помощью Z-мыши можно выбрать объект, изображенный на мониторе, развернуть его и передвинуть в любом направлении. Кроме того, Z-мышь можно использовать для координации точки и направления наблюдения на трехмерной сцене. К числу областей использова- ния Z-мыши относятся виртуальная реальность, автоматизированное проектирование и анимация.
2.4. Устройства ввода 109 Рис. 2.43. Подвижный джойстик (перепечатано с разрешения компании CalComp Group, Sanders As- sociates, Inc.) ТРЕКБОЛЫ И ПРОСТРАНСТВЕННЫЕ МАНИПУЛЯТОРЫ Трекбол — это приспособление в виде шарика, который можно вращать пальцами или ладонью, что приводит к перемещению курсора по экрану. Потенциометры, соеди- ненные с шариком, измеряют величину и направление поворота. Клавиатуры порта- тивных компьютеров часто оснащаются трекболом с целью экономии места, которое необходимо для мыши. Трекбол может помещаться на других устройствах, таких как Z-мышь, изображенная на рис. 2.42, или существовать как отдельный дополнитель- ный элемент, содержащий две или три кнопки управления. Более расширенное понятие двухмерного трекбола — это пространственный ма- нипулятор (spaceball) (рис. 2.44), который обеспечивает шесть степеней свободы. В отличие от трекбола, пространственный манипулятор на самом деле не двигается. Тензодатчики измеряют давление на пространственный манипулятор, и таким обра- зом, вдавливая или вытягивая шарик в различных направлениях, вводят положение в пространстве и ориентация. Пространственные манипуляторы используются для за- дания положения в трехмерном пространстве. С их помощью выполняются операции в системах виртуальной реальности, при моделировании, в анимации, автоматизиро- ванном проектировании и в других приложениях. ДЖОЙСТИК Еще одно устройство для задания положения — это джойстик, который состоит из небольшого вертикального рычага (называемого по-английски “stick”), помещенного на подставке. Джойстик используется для кругового управления курсором на экране. Большинство джойстиков, таких как тот, что показан на рис. 2.43, служат для выбора положения на экране путем реального перемещения рычага; другие реагируют на давление на рычаг. Некоторые джойстики размещают на клавиатуре, а некоторые создаются в виде отдельных самостоятельных элементов.
110 Глава 2. Краткий обзор графических систем Расстояние, на которое перемещается джойстик в любом направлении от свое- го центрального положения, соответствует относительному перемещению курсора по экрану в этом направлении. Потенциометры, которые находятся в подставке джойсти- ка, измеряют величину перемещения, а пружины возвращают рычаг в центральное положение после того, как воздействие на него прекращается. Можно запрограмми- ровать одну или несколько кнопок, чтобы они работали как входные переключатели, отвечающие за определенные действия, которые должны выполняться после выбора положения на экране. Существует еще один тип подвижных джойстиков, в которых с помощью рычага активизируются переключатели, заставляющие курсор перемещаться с постоянной скоростью в выбранном направлении. Восемь переключателей, расположенных по кругу, позволяют выбрать с помощью рычага любое из восьми направлений переме- щения курсора по экрану. У джойстиков, чувствительных к давлению, которые еще называют изометрическими джойстиками, есть неподвижный рычаг. Сила нажатия на рычаг измеряется с помощью тензодатчиков и преобразуется в перемещение кур- сора на экране в направлении приложения давления. ИНФОРМАЦИОННЫЕ ПЕРЧАТКИ На рис. 2.44 показана “информационная" перчатка, которой пользуются для того, чтобы брать “виртуальные предметы”. Перчатка состоит из ряда датчиков, регистри- рующих движения руки и пальцев. Для передачи информации о положении и ори- ентации руки используется электромагнитное взаимодействие между передающими и принимающими антеннами. Каждая передающая и принимающая антенна может представлять собой набор из трех взаимно перпендикулярных катушек, образующих трехмерную декартову систему координат. Входные данные, полученные с помощью перчатки, служат для изменения положения или выполнения каких-то действий над предметом в виртуальном пространстве. Двухмерную проекцию сцены можно уви- деть на мониторе, а трехмерную — с помощью специального шлема. ЦИФРОВОЙ ПРЕОБРАЗОВАТЕЛЬ Обычное устройство для черчения, рисования или интерактивного выбора положе- ния — это цифровой преобразователь. Такие устройства создаются для ввода значе- ний координат либо в двух-, либо в трехмерном пространстве. В инженерных или архитектурных приложениях цифровые преобразователи часто используются для ска- нирования рисунка или объекта и для ввода набора дискретных значений координат. Затем заданные координаты объединяются с прямолинейными элементами, в резуль- тате чего получается приблизительная форма кривой или поверхности.
2.4. Устройства ввода 111 Рис. 2.44. Сцена из виртуальной реаль- ности, изображенная на двухмерном мо- ниторе. Входные данные получены с по- мощью “информационной” перчатки и пространственного манипулятора (пере- печатано с разрешения The Computer Graphics Center, Дармштадт, Германия) Рис. 2.45. Настольный планшет SummaSketch III с 16-кнопочным ручным курсором (пере- печатано с разрешения Summagraphics Cor- poration) Один из видов цифровых преобразователей — это графический планшет (его также называют планшетом для ввода данных), который используется для ввода ко- ординат в двухмерном пространстве путем манипуляций ручным курсором или пером в выбранных точках на плоской поверхности. В ручном курсоре есть окулярная сет- ка, позволяющая видеть местоположение, а перо — это устройство, имеющее форму карандаша, которое служит для указания положения на планшете. На рис. 2.45 и 2.46 показаны примеры настольного и напольного планшетов с ручным курсором, который может иметь две, четыре или шестнадцать кнопок. Примеры ввода инфор- мации с помощью пера и планшета показаны на рис. 2.47 и 2.48. В цифровой си- стеме для художников на рис. 2.48 для регистрации положения пера в трехмерном пространстве используется электромагнитный резонанс. Это позволяет художнику имитировать различные мазки кисти, прикладывая к поверхности планшета разное давление. Размер планшета варьируется от 12 на 12 дюймов для настольных моделей до 44 на 60 дюймов или больше для напольных моделей. Графические планшеты позволяют выбирать координаты точки с точностью до 0,2 мм в настольных моделях и приблизительно 0,05 мм или меньше в больших моделях.
112 Глава 2. Краткий обзор графических систем Рис. 2.46. Планшет Microgrid III с 16-кнопочным ручным курсором, разработанный для оцифров- ки больших рисунков (перепечатано с разреше- ния Summagraphics Corporation) Рис. 2.47. Настольный планшет NotePad с пером (перепечата- но с разрешения CalComp Digitizer Division, части корпорации CalComp, Inc.) Многие графические планшеты создаются с прямоугольной сеткой проводов, встроенных в поверхность планшета. По этим проводам последовательно пропус- каются электромагнитные импульсы, и в катушке включенного пера или ручного курсора индуцируется электрический сигнал, который служит для регистрации точки на планшете. В зависимости от метода, для определения точки на планшете исполь- зуется интенсивность сигнала, импульсный код или фазовый сдвиг.
2.4. Устройства ввода 113 Рис. 2.48. Система цифрового преобразо- вателя для художников, с беспроводным пером, чувствительным к давлению (пере- печатано с разрешения Wacom Technology Corporation) Рис. 2.49. Трехмерная цифровая система для компьютеров Apple Macintosh (перепечата- но с разрешения Mira Imaging) В акустическом (или звуковом) планшете для регистрации положения пера ис- пользуются звуковые волны. Для регистрации звука, издаваемого электрическим раз- рядом на конце пера, можно использовать полосовые или точечные микрофоны. Поло- жение пера вычисляется по времени, за которое звук достигает микрофонов в разных точках. Преимущество двухмерного акустического планшета в том, что микрофоны можно разместить на любой поверхности и таким образом получить рабочую область “планшета”. Например, микрофоны можно разместить на странице книги, рисунок с которой оцифровывается. В трехмерных цифровых преобразователях для регистрации положения исполь- зуется звуковая или электромагнитная передача. Один из способов электромагнит- ной передачи похож на тот, который применяется в информационных перчатках: для
114 Глава 2. Краткий обзор графических систем Рис. 2.50. Ручной сканер, который можно ис- пользовать для ввода текста или графических изображений (перепечатано с разрешения Thun- derware, Inc.) вычисления положения пера используется взаимодействие между передатчиком и приемником во время движения пера по поверхности объекта. На рис. 2.49 изоб- ражен цифровой преобразователь, записывающий координаты точек на поверхности трехмерного объекта. Когда на неметаллическом предмете выбираются точки, на экране компьютера появляется каркасная схема поверхности. После того как каркас- ное изображение построено, его можно раскрасить с помощью различных эффектов освещения, чтобы получилось реалистичное изображение предмета. Разрешающая способность такой системы — от 0,8 до 0,08 мм в зависимости от модели. СКАНЕРЫ ИЗОБРАЖЕНИЙ Рисунки, графики, фотографии или текст можно записывать для последующей ком- пьютерной обработки с помощью сканера изображений, проводя устройством опти- ческого сканирования над информацией, которую нужно записать. После этого цвет или градация оттенков серого цвета запоминается и записывается в виде массива дан- ных. Получив внутреннее описание рисунка, над ним можно выполнять различные действия, например, поворачивать его, изменять масштаб или вырезать и перемещать
2.4. Устройства ввода 115 Рис. 2.51. Настольные сканеры: а) сканер с барабаном и б) планшетный сканер (перепечатано с разрешения Aztek, Inc., Лейк Форест, Калифорния) Рис. 2.52. Широкоформатный сканер (пере- печатано с разрешения Aztek, Inc., Лейк Фо- рест, Калифорния) отдельные части. Кроме того, с помощью различных методов обработки изображе- ний можно изменять массив данных этого рисунка. При сканировании текста над сохраненными документами можно выполнять различные операции редактирования. Сканеры бывают разных размеров и обладают различными возможностями. Малень- кий ручной сканер показан на рис. 2.50, тогда как на рис. 2.51 и 2.52 представлены модели большего размера. СЕНСОРНАЯ ПАНЕЛЬ Как понятно из названия, сенсорные панели позволяют выбирать изображенные объ- екты или точки на экране прикосновением пальца. Обычная область применения сен- сорных панелей — это выбор опций обработки изображения, представленных в виде меню, состоящего из графических пиктограмм. Некоторые мониторы, такие как плаз- менная панель, которая показана на рис. 2.53, выпускаются с сенсорными экранами. Другие системы можно приспособить для сенсорного ввода, прикрепив над мони-
116 Глава 2. Краткий обзор графических систем Рис. 2.53. Плазменные панели с сенсорными экранами (перепечатано с разрешения компании Photonics Systems) тором прозрачное устройство с сенсорным механизмом (рис. 2.54). Сенсорный ввод можно записывать с помощью оптических, электрических или акустических методов. В оптических сенсорных панелях используется ряд инфракрасных светоизлуча- ющих диодов (СИД), расположенных вдоль одного вертикального края рамки. Све- тодетекторы расположены вдоль противоположного вертикального и горизонтальных краев. Эти детекторы регистрируют, какие лучи перекрываются, когда к панели прика- саются. Два пересекающихся луча, которые перекрываются, определяют горизонталь- ную и вертикальную координаты выбранной точки экрана. Точки можно выбирать с точностью приблизительно 1/4 дюйма. При близко расположенных СИД можно пе- рекрыть два горизонтальных и два вертикальных луча одновременно. В этом случае фиксируется среднее положение между двумя перекрытыми лучами. СИД работают на инфракрасных частотах, так что пользователь этого света не видит. Электрическая сенсорная панель состоит из двух прозрачных пластин, разделен- ных небольшим расстоянием. Одна из этих пластин покрыта проводящим веществом, а другая пластина покрывается веществом с большим сопротивлением. При прикос- новении к внешней пластине она вступает в контакт с внутренней пластиной. При таком контакте возникает перепад напряжений на пластине с высоким сопротивле- нием, который преобразуется в значения координат выбранной точки на экране. да* Рис. 2.54. Верхние (с высоким сопротивлени- ем) слои сенсорного экрана (перепечатано с разрешения Elo TouchSystems, Inc.)
2.4. Устройства ввода 117 Рис. 2.55. Световое перо с кнопочным вы- ключателем {перепечатано с разрешения In- teractive Computer Products) В акустических сенсорных панелях в горизонтальном и вертикальном направле- ниях вдоль стеклянной пластинки генерируются высокочастотные звуковые волны. Прикосновение к экрану приводит к тому, что часть волны отражается от пальца и возвращается назад к излучателю. Координаты точки прикосновения к экрану вычис- ляются путем измерения временного интервала между излучением каждой волны и ее отражением обратно к излучателю. СВЕТОВОЕ ПЕРО На рис. 2.55 показан один из типов светового пера. Такие приспособления, имею- щие вид карандаша, используются для выбора точек на экране путем регистрации света, исходящего из точек на экране ЭЛТ. Они воспринимают короткие вспышки света, излучаемого люминесцентным покрытием, в тот момент, когда электронный луч попадает в определенную точку. Другие источники света, например, фоновое освещение в комнате, световым пером, как правило, не регистрируются. Включенное световое перо, направленное на пятно на экране в то время, когда электронный пучок попадает на это пятно, генерирует электрический импульс, который служит причиной регистрации положения электронного пучка. Как и в устройствах с курсором, коорди- наты, записанные с помощью светового пера, можно использовать для определения положения объекта или выбора опции обработки. Несмотря на то что световыми перьями все еще продолжают пользоваться, они уже не так популярны, как раньше, поскольку у них есть некоторые недостатки по сравнению с другими появившимися устройствами ввода. Например, когда световое перо направлено на экран, часть изображения на экране закрывается самим пером и рукой. А при продолжительном использовании светового пера рука может уставать. Кроме того, для некоторых приложений световое перо требует специальной доработ- ки, поскольку оно не может регистрировать положение темных участков. Для того чтобы с помощью светового пера можно было выбирать точки в любом месте экрана, нужно, чтобы каждый пиксель в этой области излучал какой-то свет с ненулевой интенсивностью. Кроме того, иногда световые перья дают ложную интерпретацию из-за фонового освещения в комнате.
118 Глава 2. Краткий обзор графических систем Рис. 2.56. Система распознавания речи (пе- репечатано с разрешения Threshold Technol- ogy, Inc.) ГОЛОСОВЫЕ СИСТЕМЫ В некоторых графических рабочих станциях в качестве устройств ввода с помощью голосовых команд используются устройства распознавания речи. Голосовая система ввода может использоваться для инициации графических операций или ввода дан- ных. Принцип действия таких систем заключается в согласовании ввода с заранее определенным словарем, состоящим из отдельных слов и фраз. Чтобы сформировать словарь, следует насколько раз произнести командные сло- ва. Затем система анализирует каждое слово и составляет словарь часто употребляе- мых слов и соответствующих функций, которые должны при этом выполняться. По- сле этого, когда задается голосовая команда, система ищет в словаре соответствующее значение. Для каждого оператора, пользующегося такой системой, нужен отдельный словарь. Входные данные для голосовой системы обычно произносятся в микрофон, встроенный в шлем, как показано на рис. 2.56, а микрофон разрабатывается таким образом, чтобы минимизировать фоновые звуки. Голосовые системы имеют некото- рое преимущество перед другими устройствами ввода, поскольку при вводе команды внимание оператора не отвлекается на переключение от одного устройства к другому. 2.5. УСТРОЙСТВА ВЫДАЧИ ДОКУМЕНТАЛЬНЫХ КОПИЙ Мы можем получить документальную копию созданного изображения в нескольких форматах. Для презентации или для создания архива можно отправить файлы с изоб- ражениями на специальные устройства или в бюро обслуживания, где из них можно сделать накладные прозрачки, 35-миллиметровые слайды или фильм. Кроме того, эти изображения можно перевести на бумагу, направив выход графической системы на принтер или графопостроитель. Качество изображений, полученных с помощью устройства вывода, зависит от размера точек и их количества на один дюйм, или количества строк, которое можно изобразить в одном дюйме. Для создания непрерывного изображения в высококаче-
2.5. Устройства выдачи документальных копий 119 Рис. 2.57. Изображение, созданное с помощью матричного принтера, иллюстрирующее изменение плот- ности точек, образующих узор, в результате чего получаются тем- ные и светлые участки (перепеча- тано с разрешения Apple Computer, Inc.) ственных принтерах положения точек смещаются, так что соседние точки наклады- ваются друг на друга. Принтеры бывают ударные и безударные. Ударные принтеры выдавливают сим- волы на бумаге через красящую ленту. Построчно-псчатающес устройство — это при- мер ударного устройства, в котором оттиски символов помещаются на лентах, цепях, барабанах или колесиках. В безударных принтерах и графопостроителях для пере- носа изображения на бумагу используются лазерные технологии, струйная печать, электростатические и электротермальные методы. В символьных ударных принтерах часто сеть матричная печатающая головка с прямоугольным массивом из торчащих проволочных штырьков, количество которых зависит от качества принтера. Отдельные символы или графические узоры получа- ются путем втягивания определенных штырьков таким образом, чтобы оставшиеся штырьки образовывали узор, который нужно напечатать. На рис. 2.57 показано изоб- ражение, напечатанное на матричном принтере. В лазерных устройствах лазерный луч создает распределение зарядов на вращаю- щемся барабане, покрытом фотоэлектрическим веществом, таким как селен. Струй- ный метод заключается в разбрызгивании струи краски по горизонтальным строкам на рулон бумаги, намотанной на барабан. Электрически заряженная струя краски отклоняется электрическим полем и создает матричный узор из точек. А в элек- тростатических устройствах отрицательный заряд наносится на бумагу, по одной целой строке через весь лист за раз. Затем эта бумага подвергается воздействию по- ложительно заряженного тонера. Это приводит к тому, что тонер притягивается к отрицательно заряженным участкам и прилипает к ним, создавая заданное изобра- жение. Еще одна технология — это электротермальный принтер. В таких системах матричная печатающая головка нагревается, в результате чего получается рисунок на термочувствительной бумаге.
120 Глава 2. Краткий обзор графических систем Рис. 2.58. Настольный перьевой графо- построитель с разрешением 0,025 мм (перепечатано с разрешения Summa- graphics Corporation) С помощью некоторых ударных принтеров можно получить выход с ограни- ченной цветовой гаммой, воспользовавшись разноцветными лентами. В безударных принтерах применяются различные методики, позволяющие сочетать три разных кра- сителя (голубой, красный и желтый) и получать цветные рисунки. В лазерных и элек- тростатических устройствах три краски наносятся при отдельных проходах; струй- ные принтеры выпускают все три цвета одновременно при одном проходе каждой печатающейся строки. Чертежные схемы и другие чертежи, как правило, делаются с помощью струй- ных или перьевых графопостроителей. Перьевой графопостроитель состоит из одного или нескольких перьев, которые находятся на каретке, или поперечине, захватываю- щей лист бумаги. С помощью перьев разных цветов и ширин делаются различные затенения и рисуются линии разных стилей. В перьевых графопостроителях могут использоваться как чернильные, так и шариковые ручки и даже фломастеры. Бума- га при этом может либо лежать на плоской поверхности, либо быть намотанной на барабан или ленту. Поперечина может быть подвижной или стационарной, а перо двигается взад и вперед по перекладине. Бумага закрепляется с помощью зажимов, вакуума или электростатического заряда. Пример настольного планшетного перьево- го графопостроителя приведен на рис. 2.58, а большой рулонный графопостроитель показан на рис. 2.59. 2.6. ГРАФИЧЕСКИЕ СЕТИ До сих пор мы, главным образом, рассматривали графические приложения изолиро- ванных систем, рассчитанных на одного пользователя. Однако во многих графических приложениях обычным явлением считается многопользовательская среда и компью- терные сети. Различные ресурсы, такие как процессоры, принтеры, графопостроители и файлы данных, могут быть распределены в сети и одновременно использоваться несколькими пользователями.
2.7. Гоафика в сети Internet 121 Рис. 2.59. Большой рулонный перьевой графопо- строитель с автоматической сменой восьми много- цветных перьев и разрешением 0,0127 мм (перепе- чатано с разрешения Summagraphics Corporation} Графический монитор в сети обычно называется графическим сервером или про- сто сервером. Часто монитор оснащается стандартными устройствами ввода, такими как клавиатура и мышь или трекбол. В этом случае система может служить для ввода информации, а также как выходной сервер. Компьютер в сети, который выполня- ет программу графического приложения, называется клиентом, а выход программы изображается на сервере. Рабочая станция, которая содержит процессоры, а также монитор и устройство ввода, может функционировать и как сервер, и как клиент. Работая в сети, компьютер-клиент передает команды для изображения картинки на монитор (сервер). Как правило, для этого перед передачей команды объединяются в пакеты. Таким образом, графические программные пакеты часто содержат команды для передачи пакета, а также команды для создания изображений. 2.7. ГРАФИКА В СЕТИ INTERNET Очень большая доля графической продукции сегодня создается в сети Internet, гло- бальной сети компьютерных сетей. Компьютеры в сети Internet связываются с по- мощью TCP/IP (протокола управления передачей/протокола Internet). Кроме того, “всемирная паутина ” World Wide Web предоставляет гипертекстовую систему, кото- рая позволяет пользователям находить и просматривать документы, в которых содер- жится текст, графическая или звуковая информация. Ресурсы, например, графические файлы, идентифицируются по унифицированному указателю информационного ресур-
122 Глава 2. Краткий обзор графических систем ca (URL). Каждый URL, который иногда еще называют универсальным указателем информационного ресурса, состоит из двух частей: 1) протокола для передачи до- кумента и 2) сервера, который содержит документ и (не обязательно) адрес сервера. Например, URL http: / /www. siggraph. org указывает на документ, который сле- дует передать с помощью протокола передачи гипертекстовых файлов (http), и на то, что сервером должен быть www. siggraph. org, домашняя страница Special Interest Group in Graphics (SIGGRAPH) of the Association for Computing Machinery. Еще один обычный тип URL начинается с ftp: //, что соответствует “сайту ftp”, где програм- мы или другие файлы можно загрузить с помощью протокола передачи файлов (FTP). Документы в сети Internet могут создаваться с помощью языка HTML (Hypertext Markup Language). Создание языка HTML обеспечило простой способ описания до- кументов, содержащих тексты, графические изображения или ссылки (гиперссылки) на другие документы. Несмотря на то что ресурсы можно было делать так, чтобы они были доступны по адресам HTML и URL, вначале найти информацию в сети Internet было сложно. Впоследствии Национальный центр суперкомпьютерных приложений (NCSA) разработал браузер под названием Mosaic, который облегчил поиск Web- ресурсов пользователями. Позже Mosaic превратился в браузер, который называется Netscape Navigator. Язык HTML предлагает простой способ создания графических файлов в сети Internet, но его возможности ограничены. Поэтому для графических приложений в сети Internet были разработаны другие языки, которые мы рассмотрим в разделе 2.8. 2.8. ГРАФИЧЕСКОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ Есть два обширных класса программного обеспечения для компьютерной графики: пакеты специального назначения и общие программные пакеты. Пакеты специального назначения разрабатываются для непрограммистов, которые хотят создавать рисунки, графики или таблицы в каких-то областях, не беспокоясь о том, какие графические процедуры могут понадобиться для создания такого изображения. Интерфейс пакета специального назначения, как правило, представляет собой набор меню, позволяю- щих пользователю общаться с программой на своем собственном языке. В качестве примеров таких приложений можно назвать программы рисования для художников и различные архитектурные, деловые, медицинские и инженерные системы АП. Па- кеты общего назначения, наоборот, предлагают библиотеку графических функций, которые можно использовать в языках программирования, таких как С, C++, Java или Fortran. К числу основных функций обычной графической библиотеки относятся функции для описания элементов рисунка (прямых линий, многоугольников, окруж- ностей и других объектов), задания цветовых значений, выбора ракурса объекта на экране и выполнения поворотов или других преобразований. Несколько примеров графических программных пакетов общего назначения — это GL (Graphics Library),
2.8. Гсафическое программное обеспечение 123 OpenGL, VRML (Virtual-Reality Modeling Language), Java 2D и Java 3D. Набор графи- ческих функций часто называют программным интерфейсом приложения компью- терной графики (Computer-Graphics Application Programming Interface — CG API), поскольку библиотека предоставляет программный интерфейс, связывающий язык программирования (такой как C++) и аппаратные средства. Поэтому, если мы пи- шем программу-приложение на языке C++, графические программы позволяют нам создать картинку и изобразить ее с помощью устройства вывода. КООРДИНАТНЫЕ ПРЕДСТАВЛЕНИЯ Для создания изображения с помощью программного пакета, в первую очередь, нуж- но задать геометрическое описание объекта, который следует изобразить. Это опи- сание определяет положение и форму объекта. Например, прямоугольник задается через положения его углов (граней), а сфера определяется через положение ее центра и радиус. За некоторыми исключениями, в программных пакетах общего назначения необходимо, чтобы геометрические описания задавались в стандартной правосторон- ней декартовой системе координат (приложение А). Если значения координат рисунка задаются в какой-то другой системе координат (сферической, гиперболической и т.д.), то, прежде чем вводить их значения в программный пакет, их нужно преобразовать в декартовы координаты. В некоторых пакетах, разработанных для специальных при- ложений, допускается использование других систем координат, которые подходят для этих приложений. В общем случае в процессе создания и изображения сцены используется несколь- ко различных декартовых координатных систем. Во-первых, можно задавать формы отдельных объектов, таких как деревья или мебель, в отдельной системе координат для каждого объекта. Такие системы координат называются координатами моделиро- вания, локальными или главными координатами. Задав формы отдельных объектов, можно составить сцену (“создать ее модель”) путем расстановки объектов по соответ- ствующим местам в системе координат сцены, которая называется внешней системой координат. Этот этап подразумевает преобразование отдельных систем координат моделирования в координаты с заданным положением и ориентацией относительно внешней системы координат. В качестве примера можно составить велосипед, за- дав каждую из его деталей (колеса, раму, седло, руль, шестеренки, цепь и педали) в отдельной системе координат моделирования. Затем все составные части собирают- ся вместе во внешней системе координат. Если оба колеса велосипеда одинаковые по размеру, то в локальной системе координат можно описать только одно колесо. А затем описание колеса вставляется в описание велосипеда во внешней системе координат в двух местах. Для описания не слишком сложных сцен часть объектов можно вставлять непосредственно в общую структуру сцены во внешних координа- тах, пропуская этапы задания координат моделирования и преобразования координат моделирования во внешние координаты. Геометрическое описание в системе коор-
124 Гпава 2. Краткий обзор графических систем динат моделирования и во внешней системе координат могут задаваться в любой удобной форме, как целые числа или как числа с плавающей запятой, без учета огра- ничений для отдельных устройств вывода. Для некоторых сцен может понадобиться задать геометрию объекта через доли фута, тогда как для других приложений больше подойдут миллиметры или километры, или даже количество световых лет. После того как заданы все элементы сцены, чтобы создать изображение, общее описание во внешних координатах обрабатывают различными программами в одной или нескольких системах координат устройств вывода. Этот процесс называется кон- вейером наблюдения (viewing pipeline). Вначале внешние координаты преобразуются в координаты наблюдения, соответствующие тому изображению сцены, которое мы хотим увидеть. В основе этой системы координат лежит положение и ориентация гипотетической камеры. После этого координаты объекта преобразуются в двухмер- ную проекцию сцены, которая соответствует тому, что мы увидим на устройстве вывода. Затем эта сцена записывается в нормированных координатах, где значение каждой координаты попадает в диапазон от —1 до 1 или от 0 до 1, в зависимости от системы. Нормированные координаты еще называют нормированными координа- тами прибора, поскольку такое описание делает графический пакет независимым от диапазона координат любого специального устройства вывода. Еще нам нужно опре- делить видимые поверхности и обрезать части рисунка, выходящие за пределы поля зрения, которое мы хотим показать на экране устройства вывода. Наконец, стандарты развертки рисунка преобразовываются и попадают в буфер регенерации растровой системы, чтобы превратиться в изображение. Систему координат устройства изобра- жения обычно называют координатами устройства (или экранными координатами в том случае, если это монитор). Часто и нормированные координаты, и координаты экрана описываются в левосторонней системе координат, так что увеличение поло- жительного расстояния от плоскости ху (экрана или плоскости изображения) можно интерпретировать как удаление от точки наблюдения. На рис. 2.60 схематически изображена последовательность координатных пре- образований, от координат моделирования до координат прибора, необходимых для создания изображения, которое состоит из двух трехмерных объектов. Изначальные координаты моделирования (хтс, Уте, zmc) на этом рисунке преобразуются во внеш- ние координаты, затем — в координаты визуализации и проекции, а после этого — в левосторонние нормированные координаты, и наконец — в координаты прибора (xdc, У de) в такой последовательности: (фтс) Уто Zmc) > (xwC) Уи>о Zwc) > (xvc ; Усс > Zvc) * (фрс> Урс-Zpe) * У net Znc) * (xdoydc)' Координаты прибора (x,jr, y,ic) — это целые числа в диапазоне от (0, 0) до 1Х, J/max) Для отдельного устройства вывода. Кроме двухмерных координат (хг]г, уг](.) на
2.8. Гсафическое программное обеспечение 125 Монитор Г рафопостроитель Другие устройства вывода Координаты прибора Рис. 2.60. Последовательность координатных преобразований от координат моделирования до коорди- нат прибора для трехмерной сцены. Форму объектов можно задавать отдельно в системах координат моделирования. Затем эти формы размещаются на сцене во внешней системе координат. Далее описания во внешних координатах проходят через конвейер наблюдения и преобразуются в координаты наблюде- ния и проектирования, а затем — в нормированные координаты. На последнем этапе индивидуальные драйверы прибора передают описание сцены в нормированных координатах на устройство вывода для создания изображения поверхности изображения, для каждой координаты прибора записывается информа- ция о глубине точки, которая используется в различных алгоритмах визуализации и обработки поверхностей. ГРАФИЧЕСКИЕ ФУНКЦИИ В графических пакетах общего назначения пользователям предлагается ряд функций для создания рисунков и выполнения действий над ними. Эти функции можно класси- фицировать по тому, имеют ли они дело с графическим выходом, входом, атрибутами, преобразованиями, визуализацией, делением изображений или общим контролем. Основные блоки, из которых составляются изображения, называются графиче- скими выходными примитивами. К ним относятся символьные строки и геометриче- ские объекты, такие как точки, прямые линии, ломаные линии, закрашенные цветные участки (как правило, многоугольники) и формы, которые задаются массивами цвет- ных точек. Кроме того, в некоторых графических пакетах предлагаются функции для изображения более сложных форм, таких как окружности, конусы и цилиндры. Функции для создания результирующих примитивов предоставляют основные сред- ства для создания изображений.
126 Глава 2. Краткий обзор графических систем Атрибуты — это свойства результирующих примитивов; т.е. атрибут описывает то, как следует изображать отдельный примитив. Сюда относится описание цвета, типа линий, шрифт текста и узоры заполнения отдельных участков. Размер, положение или ориентацию объекта на сцене можно менять с помощью геометрических преобразований. В некоторых графических пакетах есть дополни- тельный набор функций для преобразований моделирования, которые используются для построения сцены, где описания отдельных объектов задаются в локальных коор- динатах. В таких пакетах обычно предлагается механизм описания сложных объектов (таких как электрический контур или велосипед) с помощью иерархической струк- туры (дерева). В других пакетах просто предоставляются функции геометрических преобразований, подробности моделирования оставляются программисту. После того как сцена составлена, с помощью функций для описания формы объ- ектов и их атрибутов графический пакет создает проекцию изображения на устрой- стве вывода. Преобразования наблюдения помогают выбрать точку наблюдения на экране, вид проекции, которую следует использовать в данном случае, и место на мониторе, где будет расположено изображение. Существуют и другие стандартные функции для управления областью изображения на экране путем задания его коор- динат, размера и структуры. Для трехмерных сцен определяются видимые объекты и налагаются соответствующие условия освещения. В интерактивных графических приложениях используются различные типы вход- ных устройств, в том числе мышь, планшет или джойстик. Для проверки и обработки потока данных, поступающего от этих интерактивных устройств, используются функ- ции ввода. Некоторые графические пакеты предлагают также функции для деления описания изображения на именованный набор составляющих частей. Могут быть и другие функции, позволяющие выполнять различные действия над этими компонентами. Наконец, в графических пакетах содержится ряд служебных задач, таких как за- крашивание экрана монитора заданным цветом и инициализация параметров. Функ- ции, выполняющие эту рутинную работу, можно объединить под общим названием операции управления. СТАНДАРТЫ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ Первостепенная цель, преследуемая в стандартизованных графических програм- мах, — это их универсальность. Когда разрабатываются пакеты со стандартными графическими функциями, такие программы легко переносятся с одной машины на другую и могут использоваться в различных реализациях и приложениях. При отсут- ствии стандартов программу, разработанную для одной машины, часто нельзя было бы перенести на другую систему без существенных изменений самой программы.
2.8. Графическое программное обеспечение 127 Международные и национальные организации по составлению стандартов во многих странах объединили свои усилия с целью разработки общепринятого стандар- та компьютерной графики. В результате приложенных усилий эта работа над стандар- тами привела к созданию в 1984 году базовой графической системы (Graphical Kernel System — GKS). Эта система была принята в качестве первого стандарта графического программного обеспечения Международной организацией по стандартизации (Inter- national Standards Organization — ISO) и различными национальными организациями по стандартизации, в том числе и Американским национальным институтом стан- дартизации (ANSI). Несмотря на то что GKS изначально разрабатывалась как пакет для двухмерной графики, вскоре появилось трехмерное дополнение к GKS. Вторым разработанным и принятым организациями по стандартизации стандартом программ- ного обеспечения был PHIGS (Programmers Hierarchical Interactive Graphics Stan- dard— иерархическая интерактивная графическая система программиста), который был продолжением GKS. Стандарт PHIGS отличался более широким диапазоном воз- можностей иерархического моделирования объектов, задания цветов, закрашивания поверхностей и выполнения различных действий над изображениями. Впоследствии появилось продолжение PHIGS под названием PHIGS+, в котором предоставлялись возможности трехмерного закрашивания поверхностей, которых не было в PHIGS. В то время когда разрабатывались пакеты GKS и PHIGS, все популярнее стано- вились графические рабочие станции производства компании Silicon Graphics, Inc., SGI. Эти рабочие станции выпускались вместе с набором стандартных функций под названием GL (Graphics Library — графическая библиотека), который очень скоро стал довольно популярным пакетом в кругах тех, кто имел дело с компьютерной гра- фикой. Таким образом, пакет GL стал де-факто графическим стандартом. Функции пакета GL разрабатывались для быстрого закрашивания в реальном времени, и вскоре этот программный пакет распространился и на другие аппаратные средства. В итоге, в начале 1990-х был разработан пакет OpenGL как аппаратно-независимая версия пакета GL. Сейчас этот пакет поддерживается и обновляется организацией OpenGL Architecture Review Board, которая представляет собой консорциум представителей многих графических компаний и организаций. Библиотека OpenGL разработана спе- циально для эффективной обработки трехмерных данных, но она может работать и с описаниями двухмерных сцен как с частным случаем трехмерного изображения, где все значения координаты z равны 0. Графические функции в любом пакете, как правило, задаются как набор описаний, которые не зависят от какого бы то ни было языка программирования. Затем задается привязка к языку для определенного языка программирования высокого уровня. Эта привязка задает синтаксис, позволяющий пользоваться различными графическими функциями этого языка. Каждая привязка к языку задается так, чтобы можно было максимально использовать соответствующие возможности языка и управлять раз- личными моментами, связанными с синтаксисом, такими как типы данных, задание
128 Гпава 2. Краткий обзор графических систем параметров и обработка ошибок. Спецификации для реализации графического пакета в определенном языке устанавливаются Международной организацией по стандарти- зации. Привязки пакета OpenGL к языкам С и C++ одинаковы. Существуют и другие привязки для пакета OpenGL, такие как привязки к языкам Ada и Fortran. В последующих главах мы будем пользоваться привязкой к языкам C/C++ для па- кета OpenGL в качестве основы для изучения основных графических понятий и для разработки и применения графических программных пакетов. Примеры программ на языке C++ иллюстрируют применение пакета OpenGL и общие алгоритмы реализа- ции графических функций. ДРУГИЕ ГРАФИЧЕСКИЕ ПАКЕТЫ Были разработаны и многие другие библиотеки для программирования в области ком- пьютерной графики. Некоторые из них предлагают общие графические стандартные функции, а некоторые предназначены для специальных приложений или отдельных аспектов компьютерной графики, таких как анимация, виртуальная реальность или графика в сети Internet. Пакет под названием Open Inventor предоставляет набор объектно-ориентированных стандартных функций для описания сцен, которые нужно изобразить с обращениями к OpenGL. Язык моделирования виртуальной реальности — Virtual-Reality Modeling Language (VRML), который начинался как подмножество пакета Open Inventor, поз- воляет нам создавать трехмерные модели виртуальных миров в сети Internet. Изоб- ражения на Web-страницах можно создавать и с помощью графических библиотек, разработанных для языка Java. С помощью Java 2D, можно создавать, например, двухмерные сцены в рамках аплетов языка Java. Или можно рисовать трехмерные Web-изображения с помощью Java 3D. А с помощью Renderman Interface производ- ства компании Pixar Corporation можно генерировать сцены, используя разнообраз- ные модели освещения. И, наконец, графические библиотеки часто предлагаются как часть систем другого типа, таких как программы Mathematica, MatLab и Maple. 2.9. ЗНАКОМСТВО С OpenGL Основная библиотека функций в пакете OpenGL предлагается для спецификации графических примитивов, атрибутов, геометрических преобразований, преобразова- ний наблюдения и многих других операций. Как отмечалось в последнем разделе, OpenGL разрабатывался таким образом, чтобы быть независимым от аппаратных средств, поэтому многие операции, такие как функции ввода и вывода, не входят в число функций основной библиотеки. Несмотря на это, стандартные функции ввода и вывода, а также множество дополнительных функций доступны во вспомогательных библиотеках, разработанных для программ OpenGL.
2.9. Знакомство с OpenGL 129 ОСНОВНОЙ СИНТАКСИС OpenGL Перед именами функций основной библиотеки OpenGL (ее еще называют корневой библиотекой OpenGL) ставится префикс gl, а каждое слово, которое входит в имя функции, начинается с прописной буквы. Следующие примеры иллюстрируют такой принцип именования. glBegin, glClear, glCopyPixels, glPolygonMode Определенные функции требуют, чтобы одному (или нескольким) из ее аргумен- тов присваивалось значение символьной константы, обозначающей, например, имя параметра, значение параметра или определенный режим. Все такие константы начи- наются с прописных букв GL. Кроме того, слова, составляющие имя этой константы, пишутся приписными, а в качестве разделителя между словами, составляющими од- но имя, используется знак подчеркивания (_). Ниже приведено несколько примеров из нескольких сотен символьных констант, которые могут использоваться функциями пакета OpenGL. GL_2D, GLJRGB, GL_CCW, GL_POLYGON, GL_AMBIENT_AND_DIFFUSE Функции пакета OpenGL также воспринимают особые типы данных. Например, параметр функции OpenGL может воспринимать значения, которые задаются как 32- разрядные целые числа. Но размер спецификации целого числа на разных машинах может отличаться. Для обозначения особого типа данных в пакете OpenGL исполь- зуются специальные встроенные названия типов данных. GLbyte, GLshort, GLint, GLfloat, GLdouble, GLboolean Каждое название типа данных начинается с прописных букв GL, а остальная часть названия — это стандартное обозначение типа данных, написанное строчными. Некоторым аргументам функций OpenGL можно присваивать значения с помо- щью массива, который содержит набор значений. Это опция для спецификации спис- ка значений в виде указателя на массив, а не путем спецификации каждого элемента из списка явно в виде аргумента параметра. Характерный пример применения этой опции — задание значений координат xyz. РОДСТВЕННЫЕ БИБЛИОТЕКИ Кроме основной (корневой) библиотеки OpenGL, существует еще ряд связанных с ней библиотек для выполнения специальных операций. Набор программ OpenGL (OpenGL Utility — GLU) предоставляет стандартные функции, позволяющие настра- ивать матрицы проекции и визуализации, описывать сложные объекты через при- ближения прямых и многоугольников, изображать квадратичные и би-сплайны с по- мощью линейного приближения, закрашивать поверхности и др. Каждая реализация
130 Глава 2. Краткий обзор графических систем пакета OpenGL включает библиотеку GLU, а все имена функций GLU начинают- ся с приставки glu. Существуют и объектно-ориентированные инструментальные средства, основанные на OpenGL, под названием Open Inventor, которые предостав- ляют стандартные функции и предопределенные формы объектов для интерактивных трехмерных приложений. Этот инструментарий написан на языке C++. Чтобы создать графическое изображение с помощью пакета OpenGL, прежде все- го нужно открыть на рабочем экране окно изображения. Это просто прямоугольная область экрана, на которой будет строиться наше изображение. Нельзя создать окно изображения непосредственно с помощью основных функций OpenGL, поскольку эта библиотека содержит только не зависящие от прибора графические функции, а операции управления окном зависят от компьютера, на котором мы работаем. Однако существует несколько библиотек систем окон, которые поддерживают функции для различных машин. Расширение OpenGL для системыX-Windows (GLX) предлагает на- бор стандартных функций, которые начинаются с приставки glX. В системах Apple для операций управления окном можно пользоваться интерфейсом Apple GL (AGL). Имена функций в этой библиотеке начинаются с приставки agl. Для систем Microsoft Windows стандартные функции WGL предлагает интерфейс Windows-to-OpenGL. Эти функции начинаются с букв wgl. Presentation Manager to OpenGL (PGL) — это интер- фейс для OS/2 компании IBM, в котором для обозначения стандартных функций в биб- лиотеке используется приставка pgl. A OpenGL Utility Toolkit (GLUT) предлагает биб- лиотеку функций для работы с любой системой окон на экране. Библиотеке функций GLUT соответствует префикс glut. Кроме того, в этой библиотеке содержатся мето- ды, позволяющие описывать и закрашивать кривые и поверхности второго порядка. Поскольку GLUT — это интерфейс для других систем окон со специальными устройствами, мы можем воспользоваться программой GLUT и сделать так, чтобы наши программы не зависели от приборов. Информацию о последней версии GLUT и процедуры загрузки исходных кодов можно найти на Web-сайте: http://reality.sgi.com/opengl/glut3/glut3.html ФАЙЛЫ ЗАГОЛОВКОВ Во всех наших графических программах должен быть файл заголовка для корневой библиотеки OpenGL. Для большинства приложений нужна еще и библиотека GLU. И мы должны включать файл заголовка для системы окон. Например, для системы Microsoft Windows файл заголовка для доступа к стандартным функциям WGL — это windows . h. Этот файл заголовка должен находиться перед файлами заголовков для библиотек OpenGL и GLU, поскольку в нем записан макрос, необходимый для библиотек OpenGL версии Microsoft Windows. Поэтому исходный файл в этом случае будет начинаться так:
2.9. Знакомство с OpenGL 131 ♦include <windows.h> ♦include <GL/gl.h> ♦include <GL/glu.h> Однако если для выполнения операций управления окном пользоваться библио- текой GLUT, то не нужно включать файлы gl. h и glu. h, поскольку в библиотеке GLUT уже подразумевается, что они будут учтены правильным образом. Поэтому можно заменить файлы заголовков для библиотек OpenGL и GLU на ♦include <GL/glut.h> Можно было бы включить еще и файлы gl. h и glu. h, но это было бы излишним и повлияло бы на универсальность программы. Кроме того, нам часто нужно будет включать файлы заголовков, которые необхо- димы для кода C++. Например, такие. ♦include <stdio.h> ♦include <stdlib.h> ♦include <math.h> В новом стандарте ISO/ANSI для C++ эти файлы заголовков называются cstdio, cstdlib и cmath. УПРАВЛЕНИЕ ОКНАМИ ИЗОБРАЖЕНИЯ С ПОМОЩЬЮ БИБЛИОТЕКИ GLUT Для начала можно рассмотреть минимальный набор операций, необходимых для со- здания изображения. Поскольку мы будем пользоваться библиотекой GLUT, нашим первым шагом будет инициализация библиотеки GLUT. Эта функция инициализации может также обрабатывать любые аргументы в командной строке, но мы не будем использовать эти параметры в наших первых программах-примерах. Инициализация GLUT осуществляется с помощью команды glutlnit (&argc, argv); Затем на экране нужно создать окно изображения с соответствующим названием в строке заголовка. Это делается с помощью такой функции: glutCreateWindow ("Пример программы OpenGL"); Здесь единственным аргументом этой функции может быть любая строка симво- лов, которые мы хотим использовать для названия окна изображения. Затем нужно задать, что именно будет содержаться в этом окне изображения. Для этого с помощью функций OpenGL создается изображение и передается определе- ние функции GLUT glutDisplayFunc, которая связывает наш рисунок с окном изображения. В качестве примера предположим, что у нас есть код OpenGL для опи-
132 Глава 2. Краткий обзор графических систем сания отрезка прямой в процедуре под названием lineSegment. Затем с помощью следующей функции описание линейного элемента передается в окно изображения. glutDisplayFunc (lineSegment); Но окна изображения еще нет на экране. Чтобы завершить операции по обра- ботке окна, нам нужна еще одна функция из библиотеки GLUT. После выполнения следующего оператора активизируются все окна изображений, которые были созда- ны, вместе со своим графическим содержимым. glutMainLoop ( ); Эта функция должна стоять на последнем месте в программе. Она служит для изображения начальных графических элементов и вводит программу в бесконечный цикл, в котором проверяются входные данные, поступающие от таких устройств, как мышь или клавиатура. Наш первый пример не будет интерактивным, поэтому программа будет просто продолжать изображать заданную картинку до тех пор, по- ка мы не закроем окно изображения. В последующих главах мы рассмотрим, как можно модифицировать наши программы OpenGL, чтобы можно было работать с интерактивным вводом. Несмотря на то что местоположение и размер созданного нами окна изображения определяется по умолчанию, эти параметры можно задать с помощью дополнитель- ных функций библиотеки GLUT. Функция glutlnitWindowPosition использу- ется для задания исходного положения левого верхнего угла окна изображения. Это положение определяется через целые значения координат экрана. Начало отсчета на- ходится в верхнем левом углу экрана. Например, с помощью следующего оператора задается, что верхний левый угол окна изображения должен находиться на 50 пиксе- лей вправо от левого края и на 100 пикселей вниз от верхнего края экрана. glutlnitWindowPosition (50, 100); Аналогично функция glutlnitWindowSize используется для того, чтобы за- дать изначальную ширину и высоту окна изображения в пикселях. Таким образом, мы задаем окно изображения с изначальной шириной и высотой в 300 пикселей (рис. 2.61) с помощью оператора glutlnitWindowSize (400, 300); После того как окно изображения появилось на экране, можно изменить его расположение и размер.
2.9. Знакомство с OpenGL 133 Рис. 2.61. Окно изображения размером 400 на 300, которое находится в точке (50, 100) отно- сительно верхнего левого угла экрана Можно также задать ряд других опций окна изображения, таких как буферизация и выбор цветового режима, использовав функцию glutlnitDisplayMode. Аргу- ментами этой функции выступают символьные константы библиотеки GLUT. На- пример, с помощью следующей команды задается, что для окна изображения будет использоваться один буфер регенерации, а для выбора цветовых значений — цветовой режим RGB (красный, зеленый, синий). glutlnitDisplayMode (GLUT_SINGLE | GLUT_RGB); Значения постоянных, которые передаются этой функции, объединяются с по- мощью логической операции ИЛИ. В действительности однократная буферизация и цветовой ражим RGB задаются по умолчанию. Но сейчас мы воспользуемся этой функцией, чтобы напомнить о том, что это опции, выбранные для нашего изобра- жения. Позже мы подробнее рассмотрим цветовые режимы, а также другие опции изображения, такие как двойная буферизация для приложений, связанных с анима- цией, и выбор параметров для изображения трехмерных сцен. ПОЛНАЯ ПРОГРАММА OpenGL Еще осталось несколько задач, которые необходимо выполнить для того, чтобы со- брать все, что нужно для полной программы. Следует выбрать цвет фона для окна изображения, а также создать процедуру, в которой содержатся функции, подходящие для того рисунка, который мы хотим изобразить.
134 Глава 2. Краткий обзор графических систем С помощью цветовых значений RGB устанавливается белый цвет фона окна изображения, как показано на рис. 2.61. Это делается с помощью функции OpenGL glClearColor (1.0, 1.0, 1.0, 0.0); Первые три аргумента этой функции присваивают красной, зеленой и синей цветовым составляющим значение 1.0. Таким образом, получается белый цвет ок- на изображения. Если бы вместо 1.0 мы задали цвет каждого компонента равным 0.0, то получился бы черный фон. А если каждой из красной, зеленой и синей со- ставляющей присвоить какие-то одинаковые промежуточные значения между 0.0 и 1.0, то мы бы получили некий оттенок серого цвета. Четвертый параметр в функ- ции glClearColor называется альфа-фактором для заданного цвета. Одно из на- значений альфа-фактора — это параметр “смешивания”. Когда активизируются опе- рации смешивания пакета OpenGL, значение альфа-фактора может использоваться для определения результирующего цвета двух перекрывающихся объектов. Значе- ние альфа-фактора 0.0 говорит о том, что объект полностью прозрачный, а значение альфа-фактора 1.0 указывает на непрозрачный объект. Некоторое время операции сме- шивания выполняться не будут, поэтому значение альфа несущественно для наших первых программ-примеров. Сейчас мы просто положим альфа-фактор равным 0.0. Хотя команда glClearColor присваивает цвет окну изображения, она не по- мещает его на экран. Чтобы увидеть окно изображения на экране, нужно вызвать следующую функцию OpenGL. glClear (GL_COLOR_BUFFER_BIT); Аргумент функции GL_COLOR_BUFFER_BIT является символьной константой OpenGL, указывающая на то, что в буфере цвета (буфере регенерации) находят- ся значения битов, которые следует присвоить переменным, указанным в функции glClearColor. (Другие буферы будут рассматриваться в последующих главах.) Кроме определения цвета фона для окна изображения, можно выбирать различ- ные цветовые схемы для объектов, которые мы хотим изобразить на экране. Для нашей первой программы-примера мы просто зададим цвет объекта как красный и отложим обсуждение различных цветовых опций до главы 4. glColor3f (1.0, 0.0, 0.0); Суффикс 3f в функции glColor указывает на то, что мы задаем три цветовые составляющие RGB с помощью значений с плавающей запятой (floating point — f). Эти значения должны попадать в диапазон от 0.0 до 1.0. Таким образом, мы задаем красный цвет = 1.0, а зеленый цвет = синему цвету = 0.0. Что касается нашей первой программы, то мы просто изображаем двухмерный отрезок прямой. Для этого нам нужно сообщить программе OpenGL, как мы хотим “спроектировать” наш рисунок на окно изображения, поскольку создание двухмерно- го изображения рассматривается программой OpenGL как частный случай трехмер-
2.9. Знакомство с OpenGL 135 ного. Поэтому, несмотря на то, что мы всего лишь хотим изобразить очень простую двухмерную линию, OpenGL обрабатывает наш рисунок с помощью операций полной трехмерной визуализации. Мы можем задать вид проекции (режим) и другие пара- метры визуализации, которые нам нужны, с помощью следующих двух функций. glMatrixMode (GL_PROJECTION) ; gluOrtho2D (0.0, 200.0, 0.0, 150.0); Это означает, что для отображения содержимого двухмерной (2D) прямоугольной области со внешними координатами на экран следует использовать ортогональную проекцию, и что значения координаты х этого прямоугольника должны лежать в диа- пазоне от 0.0 до 200.0, а значения координаты у — в диапазоне от 0.0 до 150.0. Какие бы объекты мы не задавали в пределах этого прямоугольника внешних координат, они будут попадать в окно изображения. Ничего из того, что находится за пределами этого диапазона координат, изображаться не будет. Итак, с помощью функции биб- лиотеки GLU gluOrtho2D задается, что система координат окна изображения будет такой: точка с координатами (0.0, 0.0) находится в нижнем левом углу окна изображе- ния, а точка с координатами (200.0, 150.0) — в верхнем правом углу окна. Поскольку мы описываем только двухмерный объект, действие ортогональной проекции будет ограничиваться “вставкой” нашего рисунка в окно изображения, которое мы задали раньше. Сейчас мы воспользуемся прямоугольником внешних координат с таким же характеристическим отношением, как и у окна изображения, так что наш рисунок ис- кажаться не будет. Позже будет рассматриваться, как сохранить характеристическое отношение, которое не зависит от спецификации окна изображения. Наконец, нужно вызвать соответствующие стандартные функции OpenGL, чтобы создать наш отрезок прямой. Следующий код задает двухмерный прямолинейный отрезок с целочисленными декартовыми координатами его концов (180, 15) и (10, 145). В главе 3 будет дано подробное объяснение этих функций, а также других функций OpenGL, позволяющих создавать графические примитивы. glBegin (GL_LINES); glVertex2i (180, 15); glVertex2i (10, 145); glEnd ( ); Теперь мы готовы к тому, чтобы собрать все части воедино. Следующая програм- ма OpenGL состоит из трех процедур. Мы поместили все функции инициализации и присваивания соответствующих одноразовых параметров в процедуру init. Геомет- рическое описание “рисунка”, который мы хотим изобразить, содержится в процедуре lineSegment, которая обозначается функцией библиотеки GLUT glutDisplay- Func. А в процедуре main записаны функции библиотеки GLUT, отображающие окно и наш отрезок прямой на экран. На рис. 2.62 показано окно изображения и отрезок прямой красного цвета, полученный с помощью этой программы.
136 Гпава 2. Краткий обзор графических систем ♦include <GL/glut.h> // (или другие, в зависимости // от используемой системы) void init (void){ glClearColor (1.0, 1.0, 1.0, 0.0); // Задает белый цвет // окна изображения. glMatrixMode gluOrtho2D (0 (GL_PROJECTION); .0, 200.0, 0.0, // // 150.0); Задает параметры проектирования. } void lineSegment (void) { glClear (GL_COLOR_BUFFER_BIT); /* Очищает окно изображения. */ glColor3f (1.0, 0.0, 0.0); // Задает красный цвет отрезка. glBegin (GL_LINES) ; glVertex2i (180, 15); // Описывает геометрию отрезка. glVertex2i (10, 145); glEnd ( ); glFlush ( ); /* Обрабатывает все функции OpenGL как можно быстрее. */ } void main (int argc, char** argv){ glutlnit (&argc, argv); // Инициализация GLUT. glutlnitDisplayMode (GLUT_SINGLE | GLUT_RGB); /* Установка режима дисплея. */ glutlnitWindowPosition (50, 100); /* Задает верхнее левое положение окна изображения. */ glutlnitWindowSize (400, 300); // Задает ширину и высоту // окна изображения. glutCreateWindow ("En Example OpenGL Program"); /* Создает окно изображения. */ init ( ); // Процедура инициализации. glutDisplayFunc (lineSegment); // Посылает графическое // изображение в окно. glutMainLoop ( ); // Изображает все и ожидает. } В конце процедуры lineSegment стоит функция, glFlush, которую мы еще не обсуждали. Это просто стандартная функция для ускорения выполнения функций OpenGL, записанных в буферах, которые находятся в различных местах вычисли- тельной системы, в зависимости от того, как реализована сама программа OpenGL. В загруженной сети, например, могут быть задержки при обработке данных в некото- рых буферах. Но вызов функции glFlush приводит к освобождению таких буферов и обработке функций OpenGL.
2.10. Резюме 137 Рис. 2.62. Окно изображения и отре- зок прямой, полученный с помощью демонстрационной программы Процедура lineSegment, которую мы установили для описания нашего рисун- ка, называется функцией обратного вызова изображения. И эта процедура описыва- ется так, что она “регистрируется” функцией glutDisplayFunc как стандартная функция, которая вызывается всякий раз, когда может понадобиться заново вывести на экран окно изображения. Это может произойти, например, если окно изображения передвигается. В последующих главах мы посмотрим на другие типы функций об- ратного вызова и связанные с ними стандартные функции библиотеки GLUT, которые используются для их регистрации. В общем случае, программы OpenGL строятся в виде набора функций обратного вызова, которые вызываются при выполнении опре- деленных действий. 2.10. РЕЗЮМЕ В этой ознакомительной главе был сделан обзор основных аппаратных средств и элементов программного обеспечения систем компьютерной графики. К элементам оборудования относятся мониторы, устройства выдачи документальных копий, раз- личные виды систем ввода и оборудования для взаимодействия с виртуальной ре- альностью. Некоторые программные системы, такие как пакеты АП и программы для рисования, разрабатываются для специальных приложений. Другие программ- ные продукты предлагают библиотеки общих графических стандартных функций, которыми можно пользоваться в рамках такого языка программирования, как C++, и создавать рисунки для любых приложений. Преобладающее большинство устройств с графическими дисплеями — это раст- ровые мониторы с регенерацией, основанные на телевизионной технологии. В раст-
138 Глава 2. Краткий обзор графических систем ровых системах для записи цветовых значений для каждой точки экрана (пикселя) используется буфер кадра. Затем картинки рисуются на экране путем извлечения этой информации из буфера кадра (который также называют буфером регенерации) при прохождении электронного луча ЭЛТ по каждой строке развертки сверху донизу. В более старых векторных дисплеях изображения создаются путем построения пря- молинейных отрезков, соединяющих заданные точки экрана. Затем информация об изображении записывается в виде набора команд по построению линий. Существует множество других дисплеев. В частности, быстрыми темпами разви- вается технология дисплеев с плоским экраном, и эти устройства сегодня уже исполь- зуются во многих системах, включая и настольные, и портативные компьютеры. Плаз- менные панели и жидкокристаллические дисплеи — это два примера дисплеев с плос- ким экраном. К числу других способов создания изображений можно отнести систе- мы трехмерной и стереоскопической визуализации. Системы виртуальной реальности могут оснащаться либо стереоскопическим шлемом, либо обычным монитором. Для ввода графической информации можно выбирать приспособления из целого ряда возможных. Клавиатура, блок кнопок и круговая шкала используются для вво- да текста, значений переменных или опций программирования. Самое популярное приспособление-“указатель” — это мышь, но для управления положением курсора на экране также используются шаровые и пространственные манипуляторы, джойсти- ки, клавиши управления курсором и колесики. В виртуальном пространстве обычно пользуются “информационными” перчатками. Другие устройства ввода — это скане- ры изображений, цифровые преобразователи, сенсорные панели, световые перья и голосовые системы. К устройствам выдачи документальных копий графических рабочих станций, кроме устройств для создания слайдов, прозрачек и пленок, относятся обычные прин- теры и графопостроители. Принтеры выдают копии с помощью матричных, лазерных, струйных, электростатических или электротермальных методов. Графики и таблицы можно строить с помощью чернильного графопостроителя или устройства, в котором сочетаются принтер и графопостроитель. Стандартные графические программные пакеты, которые были разработаны и приняты Международной организацией по стандартизации и Национальным инсти- тутом стандартизации США, — это GKS, 3D GKS, PHIGS и PHIGS+. Другие пакеты, которые также стали стандартными, — это GL и OpenGL. Существует множество графических библиотек, которыми можно пользоваться в рамках языков программи- рования, в том числе Open Inventor, VRML, RenderMan, Java 2D и Java 3D. Такие системы, как Mathematica, MatLab и Maple, часто предлагают набор функций для графического программирования. Обычно для графических программных пакетов необходимо, чтобы координаты задавались в декартовой системе отсчета. Каждый объект сцены можно описать в от- дельной декартовой системе координат моделирования, которая затем отображается
Литература 139 во внешнюю систему координат для построения сцены в целом. Внешние координаты трехмерного объекта проектируются на двухмерную плоскость, затем, преобразуясь в нормированные координаты прибора, превращаются в окончательные координаты дисплея. Переход от координат моделирования к нормированным координатам при- бора не зависит от отдельного устройства вывода, которое может использоваться в данном приложении. Затем драйверы прибора, как правило, преобразовывают нор- мированные координаты в целочисленные значения координат прибора. Функции, которые содержатся в графических программных пакетах, можно раз- делить на следующие категории: графические результирующие примитивы, атрибу- ты, геометрические преобразования и преобразования моделирования, преобразова- ния визуализации, функции ввода, операции построения изображения и служебные операции. Система OpenGL состоит из аппаратно-независимого набора стандартных функ- ций (который называется корневой библиотекой), служебной библиотеки (GLU) и служебного инструментария (GLUT). Во вспомогательном наборе стандартных функ- ций, предлагаемых библиотекой GLU, можно найти функции для создания сложных объектов, задания параметров для приложений, связанных с двухмерной визуализа- цией, работы с операциями закрашивания поверхностей, а также выполнения неко- торых других вспомогательных задач. В библиотеке GLUT содержится обширный набор функций для управления окном изображения, взаимодействия с системой окон на экране и для создания некоторых трехмерных форм. Библиотеку GLUT можно использовать в качестве интерфейса для любой компьютерной системы. Для этих же целей подходят библиотеки GLX, Apple GL, WGL или другие программные пакеты, предназначенные для специальных приложений. ЛИТЕРАТУРА В общих чертах электронные дисплеи рассматриваются в книгах [314, 347]. Дисплеи с плоским экраном обсуждаются в статье [78]. Дополнительную информацию о структуре растровых графи- ческих систем можно найти в монографии [99]. Трехмерные и стереоскопические дисплеи рассмат- риваются в работах [137, 164]. Дисплеи, которые надеваются на голову, и системы виртуальной реальности обсуждаются в статье [55]. Стандартные источники информации по OpenGL — это [320, 399]. Open Inventor исследуется у [384]. У [213] можно проконсультироваться по поводу VRML. Описание RenderMan можно найти в книге [365]. Примеры графических программ на языке Java 2D даны в монографиях [143, 155, 177]. Графическое программирование с использованием Java 3D исследуется в работах [246, 312, 334, 372]. Информацию о PHIGS и PHIGS+ можно найти у [25, 114, 154, 156]. Информацию о двух- мерном стандарте GKS и развитии графических стандартов можно получить из источника [153]. Дополнительная литература по GKS — [92].
140 Гпава 2. Краткий обзор графических систем УПРАЖНЕНИЯ 2.1. Назовите рабочие характеристики следующих технологий создания изображений: растро- вые системы с регенерацией, векторные системы с регенерацией, плазменные панели и жидкокристаллические дисплеи. 2.2. Назовите несколько областей применения каждой технологии создания изображений из упражнения 2.1. 2.3. Найдите разрешающую способность (количество пикселей на один сантиметр) в направ- лениях х и у для монитора, который используется в вашей системе. Найдите характери- стическое отношение и объясните, как в вашей системе можно сохранить относительные пропорции изображаемых объектов. 2.4. Рассмотрим три различные растровые системы с разрешениями 640 на 480, 1280 на 1024 и 2560 на 2048. Буфер кадра какого размера (в байтах) необходим для каждой из этих систем, чтобы с ее помощью можно было записывать 12 бит на пиксель? Сколько памяти необходимо для каждой системы, чтобы записать 24 бит на пиксель? 2.5. Предположим, что нужно разработать растровую RGB-систему с размером экрана 8 на 10 дюймов и с разрешением 100 пикселей на один дюйм в каждом направлении. Если нужно записать в буфер кадра 6 бит на пиксель, то каким количеством памяти (в байтах) должен обладать буфер кадра? 2.6. Как долго будет загружаться буфер кадра 640 на 480 с 12 бит на пиксель, если за одну секунду может передаваться 105 бит? Как долго будет загружаться буфер кадра с 24 бит на пиксель с разрешением 1280 на 1024 при такой же скорости передачи? 2.7. Предположим, что у нас есть компьютер, в котором дается 32 бит на слово, а скорость передачи равна 1 мкс (один миллион команд в секунду). Как долго будет заполняться буфер кадра лазерного принтера в 300 dpi (точек на дюйм) с размером страницы 8 % на 11 дюймов? 2.8. Рассмотрим две растровые системы с разрешениями 640 на 480 и 1280 на 1024. К скольким пикселям в секунду может иметь доступ контроллер дисплея каждой системы, если он обновляет экран со скоростью 60 кадров в секунду? Каково время доступа к одному пикселю для каждой системы? 2.9. Предположим, что у нас есть монитор с областью изображения в 12 дюймов шириной и 9,6 дюймов высотой. Если разрешающая способность составляет 1280 на 1024, а характе- ристическое отношение равно 1, каким будет диаметр каждой точки? 2.10. Сколько времени тратится на сканирование каждой строки пикселей при обновлении экрана в растровой системе с разрешением 1280 на 1024 при скорости обновления 60 кадров в секунду? 2.11. Рассмотрим растровый монитор с прогрессивной (не чередующейся) разверткой размером п на т (т строк развертки и п пикселей в каждой строке развертки), со скоростью об- новления г кадров в секунду, временем горизонтальной трассировки thoriz и временем вертикальной трассировки tvert. Какая часть полного времени регенерации одного кадра тратится на возврат электронного луча? 2.12. Какая часть полного времени регенерации одного кадра тратится на возврат электронного луча в растровой системе с прогрессивной разверткой при разрешающей способности 1280 на 1024, скорости регенерации 60 Гц, времени горизонтальной трассировки 5 мкс и времени вертикальной трассировки 500 мкс? 2.13. Предположите, что в определенной полноцветной (24 бит на пиксель) растровой RGB- системе есть буфер кадра 512 на 512. Назовите число возможных различных цветов (уровней интенсивности). Сколько цветов можно было бы изобразить одновременно?
Упражнения 141 2.14. Сравните недостатки и преимущества трехмерного монитора с зеркалом с переменным фо- кусным расстоянием и стереоскопической системы. 2.15. Назовите различные элементы для ввода и вывода, которые обычно используются в системах виртуальной реальности. Объясните также, как пользователь взаимодействует с виртуаль- ной сценой, изображенной с помощью различных устройств вывода, таких как двухмерные и стереоскопические мониторы. 2.16. Объясните, как можно использовать системы виртуальной реальности в приложениях, свя- занных с проектированием. Какие еще области применения систем виртуальной реальности вы знаете? 2.17. Назовите некоторые области применения дисплеев с большим экраном. 2.18. Объясните разницу между графической системой общего назначения, разработанной для программистов, и системой, разработанной для специального применения, например, для создания архитектурных проектов. 2.19. Объясните разницу между корневой библиотекой OpenGL, библиотеками GLU и GLUT. 2.20. Какая команда используется для того, чтобы задать светло-серый цвет окна изображения в пакете OpenGL? Какая команда использовалась бы для того, чтобы этот цвет был черным? 2.21. Назовите операторы, которые необходимы для того, чтобы задать окно изображения OpenGL, нижний правый угол которого находится в точке с координатами (200, 200), ширина окна равна 100 пикселям, а высота — 75 пикселям. 2.22. Объясните, что означает название “функция обратного вызова изображения OpenGL”.
BA 3 Выходные графические примитивы Сцена из фильма о человеке-волке. Анимационная фигура этого примитивного ликантропа смоделирована 61 костью и 8 слоями шерсти. В каждом кадре компьютерного анимационного фильма фигурирует 100 000 многоугольных поверхностей (перепечатано с разрешения NVIDIA Corporation)
3.1. Системы координат 3.2. Задание двухмерной внешней системы координат в OpenGL 3.3. Функции точек в OpenGL 3.4. Функции прямых линий в OpenGL 3.5. Алгоритмы построения прямых линий 3.6. Параллельные алгоритмы построения прямых 3.7. Запись значений в буфер кадра 3.8. Функции кривых в OpenGL 3.9. Алгоритмы для построения окружности 3.10. Алгоритмы для построения эллипсов 3.11. Другие кривые 3.12. Параллельные алгоритмы для построения кривых 3.13. Адресация пикселей и геометрия объектов 3.14. Закрашенные примитивы 3.15. Закрашенные многоугольники 3.16. Функции для закрашивания многоугольников в OpenGL 3.17. Массивы вершин в OpenGL 3.18. Примитивы пиксельных массивов 3.19. Функции пиксельных массивов в OpenGL 3.20. Примитивы символов 3.21. Функции для изображения символов в OpenGL 3.22. Деление рисунка на части 3.23. Таблицы отображений в OpenGL 3.24. Функция изменения формы окна изображения в OpenGL 3.25. Резюме ниверсальный программный пакет для графических приложений, кото- рый иногда называют программным интерфейсом компьютерной гра- фики (Computer-Graphics application programming interface — CG API), содержит библиотеку функций, которую можно использовать для созда- ния рисунков с помощью такого языка программирования, как C+t Как отмечалось в разделе 2.8, набор функций библиотеки можно разделить на несколько категорий. Одним из первых действий при создании рисунка является описание составляющих частей изображаемой сцены. Элементами рисунка могут быть деревья и элементы ландшафта, мебель и стены, витрины магазинов и участки улицы, автомобили и рекламные щиты, атомы и молекулы или звезды и галактики. Для каждого типа сце- ны нужно описать структуру отдельных предметов и координаты их расположения на сцене. Функции графического пакета, которые используются для описания раз- личных элементов рисунка, называются выходными графическими примитивами или просто примитивами. Выходные примитивы, описывающие геометрию объекта, как правило, называют геометрическими примитивами. Самые простые геометрические примитивы — это точки и прямые отрезки. К числу дополнительных геометрических примитивов, которые встречаются в графических программных пакетах, относятся окружности и другие конические сечения, поверхности второго порядка, сплайновые кривые и поверхности, а также цветные многоугольники. В большей части графиче-
144 Глава 3. Выходные графические примитивы ских систем есть несколько функций для изображения строк символов. После того как в выбранной системе координат задана геометрия рисунка, выходные примитивы проектируются на двухмерную плоскость, соответствующую области изображения устройства вывода, и происходит преобразование из стандарта развертки в целочис- ленные значения положений пикселей, которые записываются в буфер кадра. В этой главе описываются графические примитивы, существующие в OpenGL. Кроме того, здесь рассматриваются аппаратные алгоритмы реализации примитивов. Изучение алгоритмов реализации для графических библиотек позволяет осознать воз- можности этих пакетов. Кроме того, это помогает понять, как работают функции, и, может быть, как их можно усовершенствовать, а также самостоятельно реализовать стандартные графические процедуры в некоторых специализированных приложени- ях. Исследования в области компьютерной графики постоянно приводят к откры- тию новых, усовершенствованных способов реализации, которые дают нам методы, применимые к таким специализированным приложениям, как графика в Internet, и позволяют разрабатывать графические дисплеи с более реалистичным изображением. 3.1. СИСТЕМЫ КООРДИНАТ Чтобы описать рисунок, сначала выбирается удобная декартова система координат, которая называется внешней системой координат и может быть либо двух-, либо трехмерной. Затем описываются предметы на рисунке, для чего с помощью значений внешних координат точек задаются их геометрические спецификации. К примеру, прямолинейный отрезок определяется положениями двух его концов, а многоуголь- ник описывается набором координат его вершин. Значения координат этих точек хра- нятся в описании сцены вместе с остальной информацией об этих объектах, такой как их цвет и координатные границы, т.е. минимальные и максимальные значения координат х, у и z для каждого объекта. Набор координатных границ называют так- же ограничивающим прямоугольником данного объекта. Затем объекты изображают- ся — информация о сцене передается стандартным процедурам визуализации, которые определяют видимые поверхности и, в конечном итоге, ставят в соответствие объек- там значения координат на экране монитора. Для записи такой информации о сцене, как коды цвета, в определенные места буфера кадров используется процесс преобра- зования в стандарт развертки, и на устройстве вывода изображаются объекты сцены. ЭКРАННЫЕ КООРДИНАТЫ Местоположение на экране монитора выражается через целочисленные экранные ко- ординаты, которые соответствуют положениям пикселей в буфере кадра. Значения координат пикселей дают номер строки развертки (значение координаты у) и номер столбца (значение координаты х в этой строке развертки). При аппаратном выпол-
3.1. Системы координат 145 Рис. 3.1. Положения пикселей, которые отсчитываются от левого нижнего угла экрана нении таких процессов, как обновление экрана, как правило, положения пикселей отсчитываются от левого верхнего угла экрана. Тогда строкам развертки присваива- ются значения от 0 (верхняя строка экрана) до какого-то целочисленного значения Утах (нижняя строка экрана), а положения пикселей в каждой строке развертки ну- меруются от 0 до л:п1ах в направлении слева направо. В то же время с помощью программных команд можно задать любую удобную систему отсчета положений на экране. Например, можно задать диапазон точек с целочисленными координатами и началом координат в нижнем левом углу экрана (рис. 3.1) или воспользоваться для описания рисунка нецелочисленными декартовыми координатами. Затем значения координат, используемых для описания геометрии сцены, с помощью стандартных процедур визуализации преобразуются в целочисленные значения положений пиксе- лей в буфере кадра. В алгоритмах для строк развертки графические примитивы задаются через ко- ординатные представления, т.е. определяются положения пикселей, которые следует изображать. Например, если заданы координаты конечных точек линейного отрезка, алгоритм построения изображения должен вычислить положения тех пикселей, кото- рые лежат на прямой, соединяющей эти точки. Поскольку пиксель занимает конечную площадь экрана, это должно учитываться при выполнении алгоритмов. В настоящее время центр области, занимаемой пикселем, принято сопоставлять с каждым це- лочисленным значением координаты на экране. (В разделе 3.13 будут рассмотрены альтернативные схемы обращения к пикселям.) Определив положение пикселей для данного объекта, в буфер кадра нужно запи- сать соответствующие коды цвета. Чтобы сделать это, предположим, что дана низко- уровневая процедура вида setPixel (х, у);
146 Глава 3. Выходные графические примитивы Эта процедура записывает текущий код цвета в буфер кадра с целочисленными координатами (х, у) относительно произвольно выбранного на экране начала отсче- та. Иногда может понадобиться извлечь текущее значение из буфера кадра для опре- деленного положения пикселя. Поэтому предположим, что существует следующая низкоуровневая функция, позволяющая получить код цвета из буфера кадра. getPixel (х, у, color); В этой функции параметр color может принимать целочисленные значения, которые соответствуют комбинации RGB-кодов для заданного пикселя с координатами (х, у). Для двухмерного изображения нам нужно задать только коды цвета в точках (х, у), а для трехмерных сцен необходима дополнительная информация об экранных координатах. В этом случае экранные координаты записываются как трехмерные зна- чения, где третья координата обозначает глубину данной точки объекта относительно точки наблюдения. Для двухмерных сцен все значения глубины равны 0. АБСОЛЮТНЫЕ И ОТНОСИТЕЛЬНЫЕ КООРДИНАТЫ Все рассмотренные выше системы координат формулировались через значения абсо- лютных координат. Это означает, что задаются действительные положения точек в используемой системе координат. Однако в некоторых графических пакетах положения точек можно также задавать с помощью относительных координат. Этот способ удобен для построения чертежей с помощью перьевых графопостроителей, создания художественных изображений, а также для издательских целей и печатной работы. Воспользовавшись этим способом, можно задавать координаты точки относительно последнего положения, к которому обращалась система (его называют текущим положением). Например, если точка с координатами (3, 8) — это последнее положение, к которому обращалась програм- ма, то относительные координаты (2, —1) соответствуют абсолютным координатам (5, 7). В таком случае, перед тем, как задать какие-либо координаты для функций примитивов, используется дополнительная функция, устанавливающая текущее по- ложение. Тогда, чтобы описать такой объект, как набор соединенных между собой прямолинейных отрезков, нужно задать только последовательность относительных координат (смещений) после того, как будет установлено исходное положение. Гра- фические системы могут предлагать опции, позволяющие задавать положение точки с помощью либо относительных, либо абсолютных координат. Далее, если явно не оговорено противное, будем считать, что все координаты задаются в абсолютных системах отсчета.
3.2. Задание двухмерной внешней системы координат в OpenGL 147 Рис. 3.2. Координатные границы внешней рамки окна на экране дисплея, которые определяются функцией glOrtho2D 3.2. ЗАДАНИЕ ДВУХМЕРНОЙ ВНЕШНЕЙ СИСТЕМЫ КООРДИНАТ В OpenGL В нашей первой программе-примере (раздел 2.9) была введена команда gluOrtho2D, которая представляет собой функцию, используемую для задания любой двухмерной декартовой системы координат. Аргументы этой функции — это четыре значения, определяющие границы изменения координат х и у для того рисунка, который тре- буется изобразить. Поскольку функция gluOrtho2D описывает ортогональную про- екцию, нужно убедиться в том, что значения координат помещены в проекционную матрицу OpenGL. Кроме того, перед определением диапазона внешних координат в качестве проекционной матрицы можно использовать единичную матрицу. Это га- рантирует, что значения координат не будут прибавляться к каким-либо значениям, возможно, ранее внесенным в проекционную матрицу. Таким образом, систему ко- ординат для использованных выше двухмерных примеров на экране дисплея можно задать с помощью следующих операторов. glMatrixMode (GL_PROJECTION); glLoadldentity ( ); gluOrtho2D (xmin, xmax, ymin, ymax); При этом левый нижний угол окна на экране дисплея будет описываться коор- динатами (a^min, жпйп), а Правый верхний угол — координатами (жтах, Утах), как показано на рис. 3.2.
148 Глава 3. Выходные графические примитивы 3.3. После этого можно задать один или несколько графических примитивов, при изображении которых используется система координат, описанная в операторе glu- Ortho2D. Если размеры этих примитивов будут вписываться в координатные преде- лы окна на экране дисплея, то будут изображены все примитивы. В противном случае будут видны только те части примитивов, которые попадают в диапазон координат окна. Кроме того, при задании геометрического описания рисунка все координаты примитивов OpenGL должны выражаться в абсолютной системе координат относи- тельно системы отсчета, которая определена в функции gluOrtho2D. ФУНКЦИИ ТОЧЕК В OpenGL Чтобы описать геометрию точки, ее положение задается во внешней системе коор- динат. Затем эти значения вместе с другими геометрическими параметрами, которые могут описывать данную сцену, обрабатываются стандартными процедурами визуа- лизации. Пока мы не зададим другие значения атрибутов, примитивы OpenGL будут изображаться с размерами и цветом, определенными по умолчанию. Изначально цвет примитивов белый, а размер точки равен размеру одного пикселя на экране. Чтобы задать координаты единственной точки, используется следующая функция OpenGL. glVertex* ( ) ; Здесь звездочка означает, что для данной функции необходимы индексные коды. Эти индексные коды обозначают размерность пространства, тип числовых данных, которые используются в качестве значений координат, и возможность представле- ния координат в виде вектора. Функция glVertex должна находиться в программе между функциями glBegin и glEnd. Аргумент функции glBegin определяет тип графического примитива, который следует изобразить, а функция glEnd не требу- ет аргументов. При выводе на экран точки аргументом функции glBegin является символьная константа GL_POINTS. Таким образом, положение точки в OpenGL опи- сывается так. glBegin (GL_POINTS); glVertex* ( ) ; glEnd ( ); И хотя термином vertex (вершина) в строгом смысле называют “угловую” точку многоугольника, точку пересечения сторон угла, точку пересечения эллипса с его главной осью или другие подобные точки геометрических фигур, функция glVer- tex в OpenGL описывает положение любой точки. Таким образом, для задания точек, прямых линий и многоугольников применяется одна функция, а для описания объек- тов, составляющих сцену, чаще всего используются прямоугольные участки.
3.3. Функции точек в OpenGL 149 200 150 100 50 + 50 100 150 Рис. 3.3. Изображение трех точек, полученное с помощью функции glBegin (GL_POINTS) Координаты точек в OpenGL могут задаваться в двух, трех или четырех изме- рениях. Для того чтобы задать размерность пространства, в функции glVertex используются индексы 2, 3 или 4. Четырехмерное описание указывает на представ- ление с помощью однородных координат, где однородный параметр h (четвертая координата) — это масштабный коэффициент для значений декартовых координат. Представление в виде однородных координат удобно при выражении операций пре- образований в матричной форме, и они подробно рассмотрены в главе 5. Поскольку в OpenGL двухмерное пространство считается частным случаем трехмерного, любые координаты (х, у) эквивалентны (х, у, 0) при h = 1. Далее нужно обозначить, какой тип данных используется для описания числовых значений координат. Это осуществляется с помощью второго индексного кода функ- ции glVertex. Тип числовых данных обозначают следующие индексы: i (integer), s (short), f (fbat) и d (double). Наконец, значения координат в функции glVertex мо- гут перечисляться в явном виде, или может использоваться единственный аргумент, который задает положения координат в виде массива. Если применяется описание координат в виде массива, нам нужно прибавить третий индекс: v (vector). Ниже приведен пример вывода на экран трех точек, находящихся на одинаковом расстоянии друг от друга на двухмерном прямолинейном отрезке с тангенсом угла наклона, равным 2 (рис. 3.3). Координаты задаются в виде пар целых чисел. glBegin (GL_POINTS); glVertex2i (50, 100); glVertex2i (75, 150); glVertex2i (100, 200); glEnd ( ); Как показано ниже, значения координат для вышеприведенных точек можно задать в виде массивов int pointl [ ] =50, 100; int point2 [ ] = 75, 150; int point3 [ ] = 100, 200;
150 Глава 3. Выходные графические примитивы и вызвать функции OpenGL для построения трех точек. glBegin (GL_POINTS); glVertex2iv (pointl); glVertex2iv (point2); glVertex2iv (points); glEnd ( ); А вот пример описания положений двух точек в трехмерной внешней системе коор- динат. В этом случае координаты задаются в явном виде как значения с плавающей запятой. glBegin (GL_POINTS); glVertex3f (-78.05, 909.72, 14.60); glVertexSf (261.91, -5200.67, 188.33); glEnd ( ); Кроме того, для описания положений точек в пространствах различной размер- ности можно определить класс или структуру (struct) C+t Например, так. class wcPt2D { public: GLfloat x, у; ); С помощью этого определения класса можно задавать двухмерные координаты точек во внешней системе координат. wcPt2D pointPos; pointPos.x = 120.75; pointPos.у = 45.30; glBegin (GL_POINTS); glVertex2f (pointPos.x, pointPos.y); glEnd ( ); Функции OpenGL для построения точек также можно использовать в рамках процедуры С-Н- для реализации команды setPixel. 3.4. ФУНКЦИИ ПРЯМЫХ В OpenGL В графических пакетах, как правило, предлагаются функции для описания одного или нескольких прямолинейных отрезков, причем каждый отрезок прямой определяется координатами двух его концов. В пакете OpenGL координаты одного конца выбира- ются с помощью функции glVertex, точно так же, как это делалось для координат точки, а в среду glBegin/glEnd заключается список функций glVertex. Однако теперь в качестве аргумента функции glBegin используется символьная константа,
3.4. Функции прямых в OpenGL 151 Рис. 3.4. Прямолинейные отрезки, которые можно изобразить в OpenGL с помощью списка из пяти наборов координат конечных точек: а) набор несоединенных отрезков, полученный с помощью константы прямой линии GL_LINES; б) ломаная линия, полученная с помощью функции GL_LINE_STRIP; в) замкнутая ломаная линия, полученная с помощью функции GL_LINE_LOOP которая указывает, что данный перечень координат нужно понимать как координаты концов прямолинейных отрезков. Существует три символьные константы OpenGL, которые можно использовать для определения того, как следует соединять точки из данного перечня, чтобы получился набор прямолинейных отрезков. По умолчанию каждая символьная переменная дает изображение сплошных линий белого цвета. Набор прямолинейных отрезков, соединяющих каждую последующую па- ру точек-концов из перечня, задается с помощью константы линии-примитива GL_LINES. В общем случае это даст набор несоединенных между собой линий, если только некоторые значения координат не повторяются. Если задать только одну точку, то ничего изображаться не будет, а если число точек (концов отрезков) в списке будет нечетным, то последнее значение не обрабатывается. Например, если есть пять значений координат, пронумерованных от pl до р5, и каждое из этих значений пред- ставляет собой двухмерный массив, то следующий код даст изображение, показанное на рис. 3.4, а. glBegin (GL_LINES); glVertex2iv (pl); glVertex2iv (p2); glVertex2iv (p3); glVertex2iv (p4); glVertex2iv (p5); glEnd ( ); Таким образом, получаем один прямолинейный отрезок, соединяющий первую и вторую точки, и другой отрезок, соединяющий третью и четвертую точки. В данном случае количество заданных точек — концов отрезков нечетное, поэтому последний набор координат не учитывается. С помощью константы-примитива OpenGL GL_LINE_STRIP можно построить ломаную линию. В этом случае будет изображена последовательность соединенных между собой отрезков, которая начинается в первой точке перечня и заканчивает-
152 Глава 3. Выходные графические примитивы ся в последней. Первый отрезок изображаемой ломанной линии соединяет первую и вторую точки; второй отрезок соединяет вторую и третью точки, и так далее до последнего конца отрезка. Список должен содержать как минимум два значения ко- ординат, чтобы создать изображение. Для тех же пяти значений координат, что и в предыдущем примере, приведенный ниже код выводит на экран изображение, пред- ставленное на рис. 3.4, б. glBegin (GL_LINE_STRIP); glVertex2iv (pl); glVertex2iv (p2); glVertex2iv (p3); glVertex2iv (p4); glVertex2iv (p5); glEnd ( ); Третий примитив прямой линии в OpenGL — это GL__LINE_LOOP, который дает за- мкнутую ломаную линию. К последовательности отрезков из предыдущего примера добавляется еще один отрезок, соединяющий последнюю точку последовательности с первой точкой ломанной линии. Если выбрать этот вариант построения линии, для данного списка концов отрезков будет получено изображение, представленное на рис. 3.4, в. glBegin (GL_LINE_LOOP); glVertex2iv (pl); glVertex2iv (p2); glVertex2iv (p3); glVertex2iv (p4); glVertex2iv (p5); glEnd ( ); Как отмечалось ранее, элементы рисунка описываются во внешней системе коор- динат, т.е. в конечном счете отображаются в систему координат устройства вывода. Затем геометрическая информация о рисунке подвергается преобразованию в стан- дарт развертки и переводится в положения пикселей. В следующем разделе рассмот- рены алгоритмы преобразования стандартов развертки, позволяющие реализовывать функции прямых линий OpenGL. 3.5. АЛГОРИТМЫ ПОСТРОЕНИЯ ПРЯМЫХ ЛИНИЙ Прямолинейный отрезок на сцене определяется координатами его концов. Чтобы изобразить прямую линию на растровом мониторе, графическая система сперва долж- на спроектировать положения концов отрезка, переведя их в целочисленные значения экранных координат, и определить ближайшие положения пикселей, лежащих вдоль линии, соединяющей эти концы отрезка. Затем в буфер кадра загружается цвет ли-
3.5. Алгоритмы построения прямых линий 153 ••• ••• ••• •ее Рис. З.б. Прямая линия, (•ГО, УО) И (хепд, 1/end) Рис. 3.5. Эффект зубчатых линий (“лесен- ки”), возникающий, когда линия изобража- ется как ряд пикселей соединяющая концы отрезка с координатами нии с соответствующими координатами пикселей. Считывая информацию из буфера кадра, видеоконтроллер изображает пиксели на экране. В ходе этого процесса про- исходит цифровая обработка прямой линии и преобразование ее в целочисленные значения координат, которые в общем случае только приблизительно передают на- стоящую форму линии. Рассчитанные координаты прямой (10,48; 20,51), например, преобразуются в координаты пикселя (10; 21). Такое округление значений координат до целых чисел приводит к тому, что все линии, кроме горизонтальных и вертикаль- ных, изображаются в виде зубцов (“лесенки”), как показано на рис. 3.5. Характерная зубчатая форма растровых линий особенно заметна в системах с невысоким разре- шением. Их внешний вид можно несколько улучшить с помощью систем с высокой разрешающей способностью. Более эффективные методы сглаживания растровых ли- ний основываются на подборе интенсивности пикселей, находящихся на этой линии (раздел 4.17). УРАВНЕНИЕ ПРЯМОЙ Положение пикселей вдоль прямой линии определяется исходя из геометрических свойств прямой линии. Декартово уравнение прямой линии имеет вид у = т • х + Ь, (3.1) где т — тангенс угла наклона прямой, а b — точка ее пересечения с осью у. Если из- вестно, что два конца отрезка заданы как точки с координатами (xq, уо) и (xend, Уепб),
154 Глава 3. Выходные графические примитивы как показано на рис. 3.6, то можно найти значения тангенса угла наклона т и точки Ь пересечения прямой с осью у по следующим формулам: J/end УО т = --------------, -^end ^0 Ь = уо - т • Х0. (3.2) (3.3) Алгоритмы изображения прямых линий построены на уравнении прямой (3.1) и фор- мулах (3.2) и (3.3). Для любого заданного интервала координат х (бх) вдоль прямой линии из урав- нения (3.2) можно найти соответствующий интервал координат у (бу) как бу = т- бх. (3.4) Аналогично можно найти интервал координат х (&г), соответствующий заданному бу: г Зу бх — . (3.5) т Эти уравнения составляют основу для определения отклоняющих напряжений в та- ких аналоговых дисплеях, как системы векторного сканирования, где возможны от- носительно небольшие изменения величины отклоняющего напряжения. Для прямых с тангенсом угла наклона |m| < 1 бх может устанавливаться пропорциональным небольшому горизонтальному отклоняющему напряжению, и тогда соответствующее вертикальное отклонение задается пропорционально бу, что можно рассчитать по формуле (3.4). Для прямых, тангенс угла наклона которых |m| > 1, бу можно вы- бирать пропорционально небольшому вертикальному отклоняющему напряжению, при этом соответствующее горизонтальное отклонение задается пропорционально бх, рассчитываемому по формуле (3.5). Для прямых с т = 1 бх ~ бу, и напряжения горизонтального и вертикального отклонения равны между собой. В каждом из этих случаев между двумя заданными точками изображается гладкая линия с тангенсом угла наклона т.
3.5. Алгоритмы построения прямых линий 155 В растровых системах прямые линии строятся по пикселям, и размер шага в го- ризонтальном и вертикальном направлении ограничивается разрешением пикселей. Это значит, что нужно “провести выборку” точек прямой линии с дискретными значе- ниями и определить пиксели, самые близкие к данной прямой для каждого элемента выборки. Этот процесс преобразования стандартов развертки для прямых линий по- казан на рис. 3.7, где элементы выборки с дискретными координатами расположены вдоль оси х. АЛГОРИТМ ЦДА Цифровой дифференциальный анализатор (ЦДА) — это алгоритм преобразования стандартов развертки прямой линии, основанный на вычислении либо бу, либо бх по уравнению (3.4) или уравнению (3.5). Прямая разбивается на единичные отрезки по одной координате, а для другой координаты определяются соответствующие целые значения, ближайшие к данной прямой. Рассмотрим сперва прямую линию с положительным тангенсом угла наклона, как на рис. 3.6. Если тангенс угла наклона меньше или равен 1, прямая разбивается на единичные отрезки по координате х (бх = 1), и последовательно вычисляются значения у: Ук+i = Ук + т. (3.6) Индекс к пробегает целые значения от 0 (первая точка) и увеличивается на 1 до тех пор, пока не будет достигнута последняя точка. Поскольку т может быть любым действительным числом между 0,0 и 1,0, каждое рассчитанное значение у следует округлять до ближайшего целого числа, соответствующего положению пикселя на экране в обрабатываемом столбце х. Для прямых линий с положительным тангенсом угла наклона, превышающим 1,0, координаты х и у меняются ролями. Прямая разбивается на единичные отрезки по у (бу = 1), и последовательно вычисляются значения х как + —. (3.7) т В этом случае каждое рассчитанное значение х округляется до ближайшего значения координаты пикселя в текущей строке развертки у. В основе уравнений (3.6) и (3.7) лежит предположение о том, что линии обра- батываются в направлении от левого конца до правого (рис. 3.6). Если обработка выполняется в обратном направлении, т.е. первая точка находится справа, то либо бх — -1 и Ук+1 =Ук~т, (3.8)
156 Глава 3. Выходные графические примитивы либо (если тангенс угла наклона больше, чем 1) бу ~ —1 при 1 sfc+i = rrfc---. (3.9) т Аналогичные вычисления выполняются с помощью уравнений (3.6)-(3.9), что поз- воляет определить положения пикселей на прямой с отрицательным тангенсом угла наклона. Таким образом, если абсолютное значение тангенса угла наклона меньше единицы, а начальная точка находится слева, мы полагаем бх = 1 и вычисляем зна- чения у с помощью уравнения (3.6). Если начальная точка расположена справа (для такого же тангенса угла наклона), мы полагаем бх = —1 и находим положения у с помощью уравнения (3.8). Для отрицательного тангенса угла наклона с абсолют- ным значением больше 1 мы используем бу = — 1 и уравнение (3.9) или бу = 1 и уравнение (3.7). Этот алгоритм сведен в следующей процедуре, входом которой служат два це- лочисленных значения экранных координат концов отрезка прямой. Параметрам dx и dy присваиваются значения горизонтальной и вертикальной разностей между точ- ками, обозначающими концы отрезка. Разность с большей абсолютной величиной определяет значение параметра steps. Начиная с координат пикселя (хО, уО), мы определяем смещение, необходимое на каждом шаге для того, чтобы найти следую- щее положение пикселя на этой прямой. Этот процесс повторяется steps раз. Если величина dx больше, чем величина dy, а хО меньше, чем xEnd, то значения приро- стов по направлениям х и у будут равны 1 и т соответственно. Если же разность по координате х больше, но при этом хО больше, чем xEnd, то для создания следующей точки на прямой используются декременты — 1 и — т. В любом случае в направлении у используется единичный прирост, а в направлении х — прирост ♦include <stdlib.h> ♦include <math.h> inline int round (const float a) { return int (a + 0.5); } void lineDDA (int xO, int yO, int xEnd, int yEnd) int dx = xEnd - xO, dy = yEnd - yO, steps, k; float xlncrement, ylncrement, x = xO, у = yO; { if (fabs (dx) > fabs (dy)) steps = fabs (dx); else steps = fabs (dy); xlncrement = float (dx) I float (steps); ylncrement = float (dy) / float (steps); setPixel (round (x), round (y)); for (k =0; k < steps; k++){
3.5. Алгоритмы построения прямых линий 157 х +» xlncrement; у += уIncrement; setPixel (round (х), round (у)); } } Алгоритм ЦДА — это более быстрый способ вычисления положений пикселей, чем тот, при котором непосредственно используется уравнение (3.1). В нем опера- ция умножения, фигурирующая в уравнении (3.1), исключена за счет использования растровых характеристик, так что при перемещении по прямой и переходе от одного пикселя к другому прибавляются нужные приросты по направлению х или у. Тем не менее, если отрезки достаточно длинные, то из-за накопления ошибок округления при последовательном прибавлении прироста возможно смещение положение пиксе- ля относительно фактического направления прямой. Более того, операции округления и арифметика с плавающей запятой в этой процедуре все еще требуют очень больших затрат времени. Выполнение алгоритма ЦДА можно ускорить, разделив приросты т и ~ на целую и дробную части, чтобы все вычисления сводились к операциям с целыми числами. Способ вычисления приростов при целочисленном шаге об- суждается в разделе 4.10, а в следующем разделе рассмотрен более общий подход, который можно применять как к прямым, так и к кривым линиям. АЛГОРИТМ ПОСТРОЕНИЯ ПРЯМЫХ ЛИНИЙ БРЕЗЕНХЕМА В этом разделе рассмотрен точный и эффективный растровый алгоритм создания пря- мых линий, разработанный Брезенхемом (Bresenham), в котором вычисляются только целочисленные значения приростов. Кроме того, алгоритм построения прямых Бре- зенхема можно адаптировать для изображения окружностей и других кривых. На рис. 3.8 и 3.9 показаны части экрана дисплея, в которых рисуются прямолинейные отрезки. По вертикальной оси откладывается номер строки развертки, а по горизон- тальной — номер столбца пикселей. В этих примерах по координате х берется еди- ничный интервал, и на каждом шаге выборки необходимо определить, какое из двух возможных положений пикселей ближе к прямой. Начиная с левого конца отрезка, по- казанного на рис. 3.8, нам нужно для каждой последующей точки выборки решить, изображать пиксель с координатами (11, 11) или пиксель с координатами (11, 12). Аналогично на рис. 3.9 показано направление прямолинейного отрезка, левый конец которого находится в пикселе с координатами (50, 50). Здесь нужно выбрать коор- динаты следующего пикселя: (51, 50) или (51, 49). В алгоритме построения прямой линий Брезенхема для этого проверяется знак целочисленного параметра, значение которого пропорционально разности между расстояниями по вертикали от положений этих двух пикселей до действительного направления прямой.
158 Глава 3. Выходные графические примитивы Рис. 3.8. Участок дисплея, на котором изображен отрезок прямой с началом в пикселе, находящемся в столбце 10 и в строке развертки 11 Рис. 3.9. Участок дисплея, на котором изображен отрезок прямой с отрицательным тангенсом угла наклона, начинающийся в пикселе, расположенном в столбце 50 и строке развертки 50 Рис. 3.10. Часть экрана с пикселем в столбце и строке развертки Уь, который будет изображаться в качестве продолжения прямоли- нейного отрезка с наклоном 0 < т < 1 Для иллюстрации метода Брезенхема рассмотрим процесс преобразования стан- дартов развертки для прямой с положительным тангенсом угла наклона, меньше 1,0. В этом случае положения пикселей на прямой определяются разбиением на единич- ные интервалы по координате х. Начиная с левого конца (х'о, уф) данной прямой, при переходе к следующему соседнему столбцу (координата х) наносится на график пиксель, который по своему номеру строки развертки у является самым близким к направлению прямой. На рис. 3.10 показан k-й шаг этого процесса. Предположим, что мы определили, что следует наносить пиксель с координатами (хк, Ук)- Далее необходимо решить, какой пиксель должен изображаться в столбце Хк+i = х^ + 1. Выбор нужно сделать из пикселей с координатами (хк + 1, у к) и (Хк + 1, ук + !)•
3.5. Алгоритмы построения прямых линий 159 Рис. 3.11. Расстояния по вертикали между положениями пикселей и координатой прямой у в точке выборки tj. + 1 В точке выборки с координатами хк + 1 обозначим расстояния по вертикали от пикселей до математической прямой как diower и dupper (рис. 3.11). Координата у математической прямой в столбце пикселей хк + 1 находится как у = т(хк + 1) + Ь. (З.Ю) Тогда Slower = У У к = = т(хк + 1) + b - ук (3.11) и •^tipper = (.Ук Ч" 1) У — = Ук + I - т(хк + 1) - Ь. (3.12) Чтобы определить, какой из этих двух пикселей ближе к заданной прямой, можно про- вести эффективную проверку, основанную на разности двух расстояний до пикселей: Slower ^upper 2ш(т|. 4" 1) 2уд. + 26 1. (3.13) Параметр принятия решения рк для к-ro шага алгоритма построения прямой линии находится путем такого преобразования уравнения (3.13), чтобы в него входили толь- ко целочисленные расчеты. Это можно сделать, проведя замену т = ку/кх, где Ду и Дж — вертикальные и горизонтальные расстояния между концами отрезка, и вычислить параметр принятия решения как Рк = A3-(Slower — ^upper) ~ = 2Ду • хк — 2Дж • ук 4- с. (3.14)
160 Глава 3. Выходные графические примитивы Знак параметра рк будет таким же, как и знак cZi0Wer — Supper, поскольку в нашем примере Дж > 0. Параметр с — это постоянная со значением 2Ду + Дж(2b — 1), которая не зависит от координат пикселя и находится в ходе рекурсивных вычислений, необходимых для расчета рк- Если пиксель с координатой yk окажется “ближе” к реальному направлению прямой, чем пиксель с координатой yk + 1 (т.е. <^iower < Supper), то параметр принятия решения рк будет отрицательным. В этом случае на график наносится нижний пиксель. В противном случае наносится верхний пиксель. Изменение значения координаты вдоль направления прямой происходит при еди- ничном шаге как в направлении х, так и в направлении у. Следовательно, с помощью схемы целочисленного прироста можно найти значения последующих параметров принятия решения. На шаге к + 1 параметр принятия решения находится из уравне- ния (3.14) как Pfc+i = 2Ду • xk+i - 2Дж • yfc+i + с. Вычитая уравнение (3.14) из предыдущего уравнения, получим Pfe+i - Рк - 2Лу(хк+1 - %к) ~ 2Дж(уь+1 - yk). Однако Хк+i = Хк + 1, поэтому Рк+i =Рк + 2&у-2Дх(ук+1 -ук), (3.15) где член Ук+~к — Ук равен либо 0, либо 1, в зависимости от знака параметра рк. Такой рекурсивный расчет параметров принятия решения выполняется в каждой точке с целым значением координаты х, начиная с координаты левого конца отрезка. Первый параметр ро находится из уравнения (3.14) в начальной точке с координатами (ж0, Уо), при этом т находится как Ду/Дж: Ро = 2Ду — Дж. (3.16) Подытожим метод построения прямой линии Брезенхема для прямой с положи- тельным тангенсом угла наклона, меньше 1, с помощью следующего алгоритма. При выполнении преобразования стандартов развертки постоянные 2Ду и 2Ду — 2Дж рассчитываются один раз для каждой прямой, поэтому арифметика алгоритма огра- ничивается только целочисленным сложением и вычитанием этих двух констант.
3.5. Алгоритмы построения прямых линий 161 Алгоритм Брезенхема построения прямой линии для |тп| <1,0 1. Ввести два конца отрезка и поместить левый конец в точку с координатами (а?о, 2/о). 2. Задать в буфере кадра цвет точки (xq, уоУ, т.е. построить первую точку. 3. Вычислить постоянные Дж, Ду, 2Ду и 2Ду — 2Дж и найти начальное значение параметра принятия решения: ро = 2Ау — Дж. 4. Для каждого жд вдоль прямой, начиная с к = 0, провести следующую проверку. Если рь, < 0, то следующую точку следует изображать на месте пикселя с координатами (жд + 1, уд) и Рк+1 =Рк + 2Ду. В противном случае следующую точку следует изображать на месте пикселя с координатами (жд + 1, уд + 1) и Рк+1 =Рк + 2Ду - 2Дж. 5. Выполнить этап 4 Дж — 1 раз. ПРИМЕР 3.1 Построение прямой линии методом Брезенхема Чтобы проиллюстрировать этот алгоритм, оцифруем отрезок прямой с концами (20, 10) и (30, 18). Тангенс угла наклона этого отрезка равен 0,8 при Дж = 10, Ду = 8. Исходное значение параметра принятия решения: Ро = 2£+у — Дж = 6, а приросты для вычисления последующих параметров принятия решения равны 2Ду = 16, 2Ду — 2Дж = —4. Откладываем начальную точку (жо, уо) = (20, 10) и с помощью параметра при- нятия решения определяем последующие положения пикселей по направлению прямой.
162 Глава 3. Выходные графические примитивы k Pk ("£fc+l, Z/fc+1) & Рк (-tfc+1, Ук+1) 0 6 (21, 11) 5 6 (26, 15) 1 2 (22, 12) 6 2 (27, 16) 2 —2 (23, 12) 7 —2 (28, 16) 3 14 (24, 13) 8 14 (29, 17) 4 10 (25, 14) 9 10 (30, 18) График, состоящий из пикселей, расположенных по направлению этой прямой, показан на рис. 3.12. Рис. 3.12. Положения пикселей прямолинейного отрезка с концами (20, 10) и (30, 18), нанесен- ные согласно алгоритму построения прямой ли- нии Брезенхема Реализация алгоритма построения прямой линии Брезенхема для тангенса угла наклона в диапазоне 0 < т < 1 приведена в следующей процедуре. Здесь вводятся координаты концов отрезка, а пиксели отображаются от левого конца до правого. ♦include <stdlib.h> ♦include <math.h> /* Процедура построения отрезка (Брезенхема) для |ш| <1,0. */ void lineBres (int х0, int у0, int xEnd, int yEnd) { int dx = fabs (xEnd - xO), dy = fabs(yEnd - yO); int p = 2 * dy - dx; int twoDy = 2 * dy, twoDyMinusDx = 2 * (dy - dx); int x, y;
3.5. Алгоритмы построения прямых линий 163 /* Определяется, какой конец принять в качестве начального * положения. */ if (хО > xEnd) { х = xEnd; у = yEnd; xEnd = хО; } else { х = хО; у = уО; } setPixel (х, у); while (х < xEnd) { х++; if (Р < 0) р += twoDy; else { у++; р += twoDyMinusDx;} setPixel (х, у); } Алгоритм Брезенхема можно обобщить для прямых линий с произвольным тан- генсом угла наклона, рассмотрев симметрию различных октантов и квадрантов плос- кости ху. Для прямой с положительным тангенсом угла наклона, превышающим 1,0, роли координат х и у меняются местами. Это означает, что в направлении координа- ты у делаются единичные шаги, и при этом последовательно вычисляются значения координаты х, ближайшие к направлению прямой. Кроме того, программу можно из- менить таким образом, чтобы построение прямой начиналось с другого конца. Если в качестве исходной точки прямой с положительным тангенсом угла наклона берется правый конец, то х и у уменьшаются при каждом шаге справа налево. Чтобы гаран- тировать, что независимо от начальной точки будут изображаться одни и те же пик- сели, когда вертикальные расстояния от пикселей до прямой равны (diower = Supper)» всегда выбирается верхний (или нижний) пиксель. При отрицательном тангенсе уг- ла наклона процедура аналогична, только на этот раз одна координата увеличивается при уменьшении другой. Наконец, можно отдельно рассматривать некоторые частные случаи: горизонтальные (Ду = 0), вертикальные (Дж = 0) и диагональные прямые (|Дж| = |Ду|) можно непосредственно заносить в буфер кадров без обработки с помощью алгоритма построения прямых линий.
164 Глава 3. Выходные графические примитивы ИЗОБРАЖЕНИЕ ЛОМАНЫХ ЛИНИЙ Для процедуры построения ломаных линий следует п — 1 раз вызвать процедуру построения прямой линии, в результате чего изображаются прямые линий, соединен- ные в п точках. При каждом последующем вызове функции сообщается пара наборов координат, необходимых для построения следующего отрезка прямой, причем первой точкой в каждой паре является последняя точка предыдущего отрезка. После того как в буфер кадра заносится код цвета пикселей, составляющих первый отрезок, обраба- тывается следующий, начиная с пикселя, идущего после первого конца этого отрезка. Таким образом можно избежать дублирующегося присвоения точкам — концам отрез- ка кода цвета. Более подробно способы защиты от наложения изображаемых объектов рассмотрены в разделе 3.13. 3.6. ПАРАЛЛЕЛЬНЫЕ АЛГОРИТМЫ ПОСТРОЕНИЯ ПРЯМЫХ В обсуждавшихся выше алгоритмах построения прямых линий положения пиксе- лей определяются последовательно. Параллельная обработка позволяет одновремен- но рассчитывать положения нескольких пикселей на прямой, распределяя вычисления между различными доступными процессорами. Одним из способов решения задачи распределения является модификация существующего последовательного алгорит- ма, позволяющая воспользоваться преимуществами, которые предлагают несколько процессоров. Кроме того, можно придумать другой алгоритм обработки, когда по- ложения пикселей эффективно вычисляются по параллельной схеме. При создании параллельного алгоритма важным вопросом является равномерное распределение за- дач по обработке данных среди доступных процессоров. Итак, если доступно пр процессоров, параллельный алгоритм построения пря- мой линии Брезенхема получается путем деления прямой на пр частей с созданием отрезков на каждом подынтервале. Для прямой линии с тангенсом угла наклона О < т < 1, 0 и координатами левого конца отрезка (xq, уо) прямую можно разде- лить в положительном направлении оси х. Расстояние между начальными точками соседних частей по координате х находится следующим образом: „ Дт + п„ — 1 Дх„ =---------₽----, (3.17) пр где Дх — длина линии, а длина отрезков Дхр, на которые разбивается эта линия, вычисляется с помощью целочисленного деления. Пронумеровав полученные части и процессоры от 0 до пр — 1, начальную координату х k-т сегмента находим как Хк = хо + кАхр. (3.18)
3.6. Параллельные алгоритмы построения прямых 165 Рассмотрим такой пример. Если пр = 4 процессора и Дт — 15, то длина каждой части будет равна 4, а начальные координаты х полученных частей — хд, хд + 4, то + 8 и го + 12. При такой схеме разбиения в некоторых случаях длина последнего (крайнего справа) подынтервала будет меньше, чем длина остальных отрезков. Кроме того, если координаты концов отрезка будут не целыми числами, то округление может привести к тому, что разные отрезки на прямой будут иметь разную длину. Чтобы применить к этим подынтервалам алгоритм Брезенхема, нужно знать на- чальное значение координаты у и начальное значение параметра принятия решения для каждого подынтервала. Изменение Дур в направлении координаты у для каждо- го отрезка рассчитывается по наклону прямой т и длине отрезков Дтр, на которые разбивается прямая: Дур = тДхр. (3.19) Таким образом, для fc-го сегмента начальное значение координаты у будет равным Ук = Уо + round(fcAyp). (3.20) Исходное значение параметра принятия решения для алгоритма Брезенхема в начале fc-го подынтервала находится из уравнения (3.14): рд. = (/сДхр)(2Ду) — round(fcAyp)(2Ax) + 2Ду — Дх. (3.21) Затем каждый процессор рассчитывает положения пикселей на выделенном ему подынтервале, используя предыдущее значение начального параметра принятия ре- шения и начальные координаты (х^, Ук)- При определении начальных значений ук и рк вычисления с величинами с плавающей запятой можно свести к арифметическим действиям с целыми числами, выполнив замену т = £±у/2хх и перегруппировав члены уравнения. Параллельный алгоритм Брезенхема можно применить и к прямой, тангенс угла наклона которой больше 1,0, разделив прямую на сегменты по коор- динате у и рассчитывая для полученных частей начальные значения координаты х. При отрицательном тангенсе угла наклона значения координат в одном направлении увеличиваются, а в другом — уменьшаются. Еще один способ реализации параллельного алгоритма в растровых системах — соотнести с каждым процессором определенную группу пикселей на экране. При достаточном количестве процессоров с каждым из них можно соотнести один пиксель из какой-то области экрана. Этот подход применяется для изображения прямых, где каждому пикселю в пределах координатных областей заданной прямой ставится в соответствие один процессор и вычисляется расстояние от пикселей до самой прямой. Количество пикселей в ограничивающем прямоугольнике заданной прямой равно Дт • Ду (рис. 3.13). Перпендикулярное расстояние d от прямой на рис. 3.13 до пикселя с координатами (х, у) находится следующим образом: d — х -Е В у -Е С. (3.22)
166 Глава 3. Выходные графические примитивы Tend То Ду -«-Дх->- J_________L *0 *end Рис. 3.13. Ограничивающий прямоугольник для прямой, расстояния между конечными координатами которой равны Да: и Ду где -Ду длина прямой Дх длина прямой _ х0Ау - у0Ах о —-------------- длина прямой причем А = в = длина прямой = \/ Дх2 + Ду2. Когда для данной прямой будут найдены константы А, В и С, каждый процессор должен выполнить две операции умножения и две операции сложения, чтобы рас- считать расстояние до пикселя d. Пиксель изображается, если d меньше заданного параметра толщины линии. Вместо того чтобы разбивать экран на отдельные пиксели, можно с каждым про- цессором сопоставить либо строку развертки, либо столбец пикселей, в зависимости от наклона прямой. После этого каждый процессор будет вычислять точку пересече- ния прямой с горизонтальной строкой или вертикальным столбцом пикселей, соответ- ствующих этому процессору. Для прямой, тангенс угла наклона которой |т| <1,0, каждый процессор просто решает уравнение прямой относительно у при заданном значении номера столбца х. Для прямой, тангенс угла наклона которой больше 1,0, каждый процессор решает уравнение прямой относительно х при заданном значении номера строки развертки у. Хотя при таком прямом подходе на машинах с после- довательной обработкой вычисления проводятся медленно, их можно эффективно ускорить с помощью большого числа процессоров.
3.7. Запись значений в буфер кадров 167 Утах (О, ())(!. О) (2, О) addr (О, О) (х/,О) (о)1) (АУ) о ______________________ о ' *тах Экран (*тах’ -Утах) Буфер кадра Рис. 3.14. Положения пикселей на экране записываются в буфер кадра построчно в порядке возрас- тания номера строки 3.7. ЗАПИСЬ ЗНАЧЕНИЙ В БУФЕР КАДРОВ Последним этапом процедуры изображения прямолинейных отрезков и других объ- ектов является запись кодов цвета в буфер кадра. Поскольку алгоритмы преобразо- вания стандартов развертки выдают координаты пикселей в последовательных еди- ничных интервалах, для эффективного обращения к буферу кадров на каждом шаге процесса преобразования стандартов развертки также можно использовать операции приращения. В качестве примера рассмотрим такой частный случай. Предположим, что обра- щение к массиву буфера кадра происходит в порядке возрастания номера строки, и что положениям пикселей присваиваются координаты от (0, 0) в левом нижнем углу экрана до (хтах, Утах) в правом верхнем углу (рис. 3.14). Для двухуровневой системы (один бит на пиксель) битовый адрес положения пикселя (х, у) находится как addr(x, у) = addr(0, 0) + y(xmax + 1) + х. (3.23) Следуя по строке развертки, адрес в буфере кадра пикселя с координатами (х + 1, у) можно найти как следующий сдвиг от адреса пикселя с координатами (х, у): addr(x + 1, у) = addr(x, у) + 1. (3.24) Перемещаясь по диагонали от точки (х, у) на следующую строку развертки, находим точку, адрес которой в буфере кадра будет (х + 1, у + 1), addr(x + 1, у + 1) = addr(x, у) + хтах + 2, (3.25) где постоянная хтах + 2 рассчитывается заранее один раз для всех отрезков. Ана- логичные вычисления приростов можно получить с помощью уравнения (3.23) для единичных шагов в отрицательном направлении координат х и у на экране. Каждый расчет адреса включает только одну операцию целочисленного сложения.
168 Глава 3. Выходные графические примитивы Реализация этих процедур зависит от возможностей конкретной системы и про- ектных требований программного пакета. Для систем, которые могут изображать каждый пиксель с несколькими значениями интенсивности, вычисление адреса из буфера кадра, кроме определения положения пикселя на экране, включают еще и вычисление ширины пикселя (количества битов). ФУНКЦИИ КРИВЫХ В OpenGL В корневую библиотеку OpenGL не включены в качестве функций-примитивов функ- ции создания таких кривых основных типов, как окружности или эллипсы. Однако в этой библиотеке есть функции для изображения сплайнов Безье, представляющих со- бой полиномы, которые задаются набором дискретных точек. В библиотеке OpenGL Utility (GLU) есть процедуры для создания трехмерных поверхностей второго поряд- ка, таких как сферы и цилиндры, а также функции для построения рациональных би-сплайнов, т.е. сплайнов, включающих более простые кривые Безье. С помощью рациональных би-сплайнов можно изображать окружности, эллипсы и другие двух- мерные поверхности второго порядка. Кроме того, в пакете OpenGL Utility Toolkit (GLUT) есть процедуры, с помощью которых можно изображать такие трехмерные поверхности второго порядка, как сферы и конусы, а также некоторые другие фи- гуры. Однако все эти стандартные процедуры намного сложнее, чем те основные примитивы, с которыми мы познакомились в этой главе, поэтому обсуждение этой группы функций мы отложим до главы 8. Еще один способ создания изображения простой кривой — аппроксимировать ее с помощью ломаной линии. Нужно всего лишь задать набор точек, расположенных на этой кривой, а затем соединить эти точки прямолинейными отрезками. Чем из большего количества отрезков будет состоять ломаная линия, тем более гладкой будет выглядеть кривая. В качестве примера на рис. 3.15 показаны различные изображения ломаных линий, с помощью которых можно аппроксимировать сегмент окружности. Третий способ — это написать собственную функцию для построения кривой, основанную на алгоритмах, рассмотренных в следующих разделах. Далее подробно описываются эффективные методы построения окружности и эллипса, а затем вни- мание уделяется процедурам изображения других конических сечений, полиномов и сплайнов. 3.9. АЛГОРИТМЫ ПОСТРОЕНИЯ ОКРУЖНОСТЕЙ Поскольку окружность — это элемент, который часто используется в рисунках и гра- фиках, во многие графические пакеты включена процедура изображения либо пол- ных окружностей, либо различных дуг. Кроме того, иногда в графической библиотеке можно найти функции изображения различных типов кривых, включая окружности и эллипсы.
3.9. Алгоритмы построения окружностей 169 Рис. 3.15. Дуга окружности, аппрок- симированная с помощью трех (па- нель а), шести (панель б) и двенадцати отрезков прямой (панель в) СВОЙСТВА ОКРУЖНОСТЕЙ Окружность (рис. 3.16) определяется как геометрическое место точек, удаленных на заданное расстояние г от центра с координатами (хс, ус). Для любой точки окруж- ности (х, у) взаимосвязь с этим расстоянием в декартовых координатах выражается через теорему Пифагора как (х - хс)2 + (у - ус)2 = г2. (3.26) Этим уравнением можно воспользоваться для того, чтобы найти положения точек на окружности, перемещаясь по оси х с единичным шагом от хс — г до хс+г и вычисляя в каждой точке соответствующие значения у: У = Ус ± з/г2 - (хс -х)2. (3.27) Однако это не самый лучший способ построения окружности. Одна из проблем, воз- никающих при таком подходе, — это то, что на каждом шаге необходим значительный объем вычислений. Более того, промежутки между положениями изображаемых пик- селей будут неравномерными, что проиллюстрировано на рис. 3.17. Можно было бы регулировать величину этого промежутка, меняя местами координаты х и у (делая шаг по оси у и вычисляя соответствующие значения х), когда абсолютное значение тангенса угла наклона окружности больше 1. Однако это увеличит объем операций в алгоритме и время, необходимое для обработки данных.
170 Глава 3. Выходные графические примитивы Рис. 3.16. Окружность с центром в точке (хс, ус) и радиусом г Рис. 3.17. Верхняя половина окружности, построенной с помощью уравнения (3.27) при (хс, ус) = (0, 0) Еще один способ устранения неодинаковых промежутков, показанных на рис. 3.17, — найти точки на границе круга с помощью полярных координат г и в (рис. 3.16), в которых уравнение окружности выглядит так: х = хс + г cos в; (3.28) У = Ус + Г sin (9. Если изображение создается с помощью этих уравнений при фиксированном шаге по углу, окружность строится из точек, расположенных по кругу через одинаковые интервалы. Чтобы уменьшить объем вычислений, можно сделать угловое расстоя- ние между точками на окружности большим и соединять эти точки прямолинейными отрезками, аппроксимируя ими окружность. Для того чтобы на растровом дисплее по- лучить более гладкую линию, размер углового шага можно задать равным ~. При этом пиксели будут располагаться приблизительно на одинаковом расстоянии друг от дру- га. Отметим также, что, хотя полярные координаты дают равные промежутки между точками, вычисление тригонометрических функций все еще требует много времени. При любом из вышеописанных способов построения окружностей объем вычис- лений можно уменьшить, учтя симметрию окружности. Форма окружности одинако- ва во всех квадрантах. Следовательно, если определить положение кривой в первом квадранте, можно построить часть окружности во втором квадранте плоскости ху, используя симметрию этих двух сегментов относительно оси у. Кроме того, части окружности в третьем и четвертом квадрантах получаются из частей первого и второ-
3.9. Алгоритмы построения окружностей 171 Рис. 3.18. Симметрия окружности. По координатам точки окружно- сти (х, у) в одном октанте получаются точки окружности, обозначен- ные в остальных октантах го с помощью симметрии относительно оси х. Этим путем можно пройти еще дальше и воспользоваться симметрией октантов. Части окружности в соседних октантах од- ного квадранта симметричны относительно биссектрисы квадранта, делящей его на октанты. Эти условия симметрии показаны на рис. 3.18, где точка с координатами (т, у) на одной восьмой части окружности отображается в семь точек на окружности в других октантах плоскости ху. Воспользовавшись такими преимуществами сим- метрии окружности, можно изобразить все пиксели на окружности, рассчитав всего лишь координаты точек в секторе от х = 0 до х — у. Тангенс угла наклона кривой в этом октанте меньше или равен 1,0. В точке х = 0 тангенс угла наклона окружности равен 0, а в точке х = у величина тангенса угла наклона составляет —1,0. Определение координат пикселей окружности с использованием преимуществ симметрии и уравнения (3.26) либо уравнения (3.28) все еще требует существенно- го объема вычислений. В декартово уравнение (3.26) входят операции умножения и извлечения квадратного корня, тогда как параметрические уравнения содержат опера- ции умножения и расчета тригонометрических функций. Более эффективные алгорит- мы построения окружностей основаны на вычислении прироста параметра принятия решения, как это делается в алгоритме построения прямой линии Брезенхема, куда входят только простые операции с целыми числами. Алгоритм построения прямой линии Брезенхема для растровых систем можно адаптировать для построения окружностей, установив на каждом шаге выборки па- раметры принятия решения для определения ближайшего к окружности пикселя. Уравнение окружности (3.26), однако, нелинейно, поэтому для того, чтобы найти расстояния от окружности до пикселей, придется вычислять квадратные корни. В алгоритме построения окружности Брезеноема этих операций можно избежать, срав- нивая квадраты расстояний до пикселей. В то же время, возможно и непосредственное сравнение самих расстояний без возведения в квадрат. Основная идея этого подхода заключается в том, чтобы про- верить точку на половине пути между двумя пикселями и определить, лежит ли эта средняя точка внутри или снаружи границы окружности. Этот метод намного легче применять к другим коническим поверхностям; а для окружности с целочисленным радиусом метод средней точки дает те же самые положения пикселей, что и алгоритм построения окружности Брезенхема. Для прямолинейного отрезка метод средней точ-
172 Глава 3. Выходные графические примитивы ки эквивалентен алгоритму построения прямой линии Брезенхема. К тому же, ошиб- ка, возникающая при выстраивании пикселей вдоль любого конического сечения с по- мощью метода средней точки, не превышает половину расстояния между пикселями. АЛГОРИТМ ПОСТРОЕНИЯ ОКРУЖНОСТИ МЕТОДОМ СРЕДНЕЙ ТОЧКИ Как и в растровом алгоритме построения прямой линии, линия разбивается на еди- ничные интервалы и на каждом шаге определяются координаты пикселей, которые находятся ближе всего к заданной окружности. При известном радиусе г и коорди- натах центра окружности на экране (хс, ус') вначале можно организовать алгоритм таким образом, чтобы рассчитать координаты пикселей вокруг окружности с центром в начале координат (0, 0). После этого каждое рассчитанное положение (х, у) переме- щается в соответствующую ему точку на экране, для чего хс прибавляется к х, ус — к у. На дуге окружности от х — 0 до х = у в первом квадранте тангенс угла наклона кривой меняется 0 до —1. Таким образом, в этом октанте можно брать единичный шаг в положительном направлении координаты х и на основе параметра принятия решения определять, какой из пикселей в каждом столбце находится ближе по вер- тикали к заданной окружности. После этого из соображений симметрии находятся координаты пикселей в остальных семи октантах. Чтобы воспользоваться методом средней точки, зададим функцию окружности как fdrc(x,y) = х2 + у2 -г2. (3.29) Любая точка (х, у), которая лежит на окружности радиуса г, удовлетворяет урав- нению fchc{x, у) = 0. Если точка находится внутри круга, то функция окружности будет иметь отрицательное значение. Если точка лежит за пределами круга, значение функции окружности будет положительным. Подытоживая, можно сказать, что от- носительное положение любой точки с координатами (х, у) определяется проверкой знака функции окружности: если точка (х, у) лежит внутри описанного круга, если точка (х, у) лежит на окружности, (3.30) если точка (х, у) находится за пределами описанного круга. Проверка (3.30) выполняется на каждом этапе выборки для средних положений между пикселями вблизи заданной окружности. Таким образом, функция окружности — это параметр принятия решения в алгоритме средней точки, и для этой функции можно установить операции приращения, как это было сделано для алгоритма построения прямой линии. fcirc(X-> У) \ — 0, > 0.
3.9. Алгоритмы построения окружностей 173 *к *к+ 1 -Ч + 2 Рис. 3.19. Средняя точка между вероятными пикселями окружности в точке выборки + 1 На рис. 3.19 показана средняя точка между двумя возможными пикселями в точке выборки а\ + 1. Предположим, что мы только что поставили точку в пикселе с коорди- натами (хк, уь)- Теперь нужно определить, какой из двух пикселей ближе к заданной окружности — пиксель с координатами (хк + 1, Ук) или пиксель с координатами {хк + 1, Ук — 1)- Параметром принятия решения будет функция окружности (3.29), которая рассчитывается для средней точки между этими двумя пикселями: Рк — /circ ( % к 4" 1; Ук с\ \ ( 1 \ = Ofc + I)2 + I Ук - g ) ~г2- (3.31) Если рк < 0, данная средняя точка лежит внутри окружности, и к заданной окруж- ности будет ближе пиксель, который находится в строке развертки ук- В противном случае средняя точка находится за пределами окружности или лежит на ней, и выби- рается пиксель в строке развертки yk — 1. Последующие параметры принятия решения находятся с помощью операции при- ращения. Рекурсивное выражение для следующего параметра принятия решения по- лучается вычислением функции окружности в точке выборки хк+1 +1 = хк + 2: . ( , 1 Рк+1 — Jcirc I %к+1 4" IjJ/fc+l 2 / J \ 2 = [fafc 4-1)4- I]2 4- ( Ук+1 - ~ или Рк+1 =Рк + 2(хк 4- 1) + (у2+1 - Ук) - (Ук+1 - Ук) 4-1, (3.32) где Ук+i — это либо ук, либо ук — 1, в зависимости от знака рк.
174 Глава 3. Выходные графические примитивы Прирост, с помощью которого находится Pk+i, равен либо 2хд._|_1 + 1 (если отрицательное), либо 2x^+1 +1 — 2у^+1- Члены 2х^._|_1 и 2?/fc+i также можно оценит! через прирост значения как 2xk+i — + 2; 2?/fc+i = 2yfc - 2. В начальном положении (0, г) эти два члена имеют значения 0 и 2г соответственно Каждое последующее значение члена 2x^+1 находится прибавлением 2 к предыду щему значению, а каждое последующее значение члена 2у^+1 находится вычитаниеь 2 из предыдущего значения. Чтобы найти начальный параметр принятия решения, вычисляется функцш окружности в начальном положении (xq, уо) = (О,г)- , Л п_ Ро — fcirc I 11 г 2 ] — I 1\2 = 1 + f г - - г2 или Ро = - г. (3.33; Если радиус г — целое число, то, поскольку все приросты — целые числа, ро можнс просто округлить до Ро = 1 — г (если г — целое число). Как и алгоритм построения прямой линии Брезенхема, метод средней точки коор- динат пикселей на заданной окружности включает операции сложения и вычитание целых чисел, если считать, что параметры окружности задаются в целочисленные экранных координатах. Все этапы алгоритма средней точки можно подытожить сле- дующим образом. Алгоритм построения окружности методом средней точки 1. Ввести радиус г и координаты центра окружности (хс, ус\ затем задать координаты первой точки на окружности, центр которой находится в начале координат: (®о,Уо) = (0, г).
3.9. Алгоритмы построения окружностей 175 2. Найти исходное значение параметра принятия решения: 5 Р0 = ^-г. 3. Для каждого значения Хк, начиная с к = 0, выполнить следующую проверку. Если рк < 0, то следующая точка на окружности с центром в точке (О, 0) будет (ajfc+i, Ук) и Pfc+i=Pfc + 2a;fc+1 + l. Иначе следующей точкой на окружности будет (хк + 1, Ук ~ 1) и Рк+\ = Рк + 2a?fc+i + 1 - 2yfc+1, где 2xk+i = 2хк + 2 и 2yfc+i = 2ук - 2. 4. Найти симметричные точки в остальных семи октантах. 5. Переместить все рассчитанные пиксели с координатами (х, у) на окруж- ность с центром в точке с координатами (хс, ус) и отметить точки с коор- динатами х = х + хс, У = У + Ус- 6. Повторять этапы с 3 по 5 до тех пор, пока не получится х > у. ПРИМЕР 3.2 Изображение окружности методом средней точки Дана окружность радиуса г = 10. Проиллюстрируем алгоритм средней точки для окружности, определив координаты точек в одном октанте окружности первого квадранта от х = 0 до х = у. Начальное значение параметра принятия решения: Ро = 1 — г = —9. Для окружности с центром в начале координат начальная точка — (хо, уо) = (0,10), а начальные приросты для вычисления параметров принятия решения равны 2х0 = 0, 2г/0 = 20. Последующие значения параметра принятия решения для метода средней точки и соответствующие координаты точек окружности перечислены в таблице.
176 Глава 3. Выходные графические примитивы Рис. 3.20. Положения пикселей (закрашенные кру- жочки) на окружности с центром в начале коорди- нат и радиусом г = 10, рассчитанные с Помощью алгоритма средней точки. Незакрашенными кру- жочками показаны симметричные точки в первом квадранте k Pk (хк+1,ук+1) 2xfc+1 2l/fc+i 0 -9 (1, 10) 2 20 1 -6 (2, 10) 4 20 2 -1 (3, 10) 6 20 3 6 (4, 9) 8 18 4 -3 (5, 9) 10 18 5 8 (6, 8) 12 16 6 5 (7, 7) 14 14 Полученные положения пикселей в первом квадранте показаны на рис. 3.20. В следующем коде иллюстрируются процедуры, которыми можно воспользо- ваться при реализации алгоритма средней точки для окружности. Значения радиуса окружности и координат ее центра сообщаются процедуре circleMidpoint. После этого вычисляются координаты пикселей на окружности в первом октанте, которые сообщаются процедуре circlePlotPoints. Эта процедура задает в буфере кадра цвет окружности для всех симметричных точек на окружности с помощью много- кратного вызова процедуры setpixel, которая реализована с помощью функций изображения точек OpenGL. ♦include <GL/glut.h> class screenPt ( private: GLint x, y;
3.9. Алгоритмы построения окружностей 177 public: /* Инициализация по умолчанию с координатами (0, 0). */ screenPt ( ) { х = у = 0; } void setCoords (GLint xCoordValue, GLint yCoordValue) { x = xCoordValue; у = yCoordValue; } GLint getx ( ) const { return x; } GLint gety ( ) const { return y; } void incrementx ( ) { x++; } void decrementy ( ) { y—; } }; void setPixel (GLint xCoord, GLint yCoord) { glBegin (GL_POINTS); glVertex2i (xCoord, yCoord); glEnd ( ); } void circleMidpoint (GLint xc, GLint yc, GLint radius) { screenPt circPt; GLint p = 1 - radius; // Начальное значение // параметра (метод средней точки). circPt.setCoords (0, radius); 11 Задаются координаты //верхней точки окружности. void circlePlotPoints (GLint, GLint, screenPt); /* В каждом квадранте изображается первая точка. */ circlePlotPoints (хс, ус, circPt); /* Вычисляются и изображаются точки во всех октантах.*/ while (circPt.getx ( ) < circPt.gety ( )) { circPt.incrementx ( ); if (p < 0) p += 2 * circPt.getx ( ) + 1; else { circPt.decrementy ( ); p += 2 * (circPt.getx ( ) - circPt.gety ( )) + 1; } circlePlotPoints (xc, yc, circPt); ) }
178 Глава 3. Выходные графические примитивы void circlePlotPoints (GLint хс, GLint ус, screenPt circPt) { setPixel (xc + circPt.getx ( ), yc + circPt.gety ( )); setPixel (xc - circPt.getx ( ), yc + circPt.gety ( )); setpixel (xc + circPt.getx ( ), yc - circPt.gety ( )); setPixel (xc - circPt.getx ( ), yc - circPt.gety ( )); setPixel (xc + circPt.gety ( ), yc + circPt.getx ( )); setPixel (xc - circPt.gety ( ), yc + circPt.getx ( )); setPixel (xc + circPt.gety ( ), yc - circPt.getx ( )); setPixel (xc - circPt.gety ( ), yc - circPt.getx ( )); } 3.10. АЛГОРИТМЫ ПОСТРОЕНИЯ ЭЛЛИПСОВ Грубо говоря, эллипс — это вытянутая окружность. Эллипс можно также описать как модифицированную окружность, радиус которой меняется от максимального значе- ния в одном направлении до минимального значения в перпендикулярном направле- нии. Прямолинейные отрезки, проведенные внутри эллипса по этим двум перпенди- кулярным направлениям, называются большой и малой осями эллипса. СВОЙСТВА ЭЛЛИПСОВ Точное определение эллипса можно дать, воспользовавшись расстояниями от любой точки эллипса до двух фиксированных точек, которые называются его фокусами. Сумма этих двух расстояний одинакова для всех точек эллипса (рис. 3.21). Если расстояния от двух фокусов до любой точки Р = (ж, у) эллипса обозначить d\ и тогда общее уравнение эллипса можно записать как di + (/2 = const. (3.34) Рис. 3.21. Эллипс с фокусами Fi и F2 X
3.10. Алгоритмы построения эллипсов 179 Рис. 3.22. Эллипс с центром в точке (хс, ус), большая полуось которого равна гх, а малая — гу Если выразить расстояния и через координаты фокусов Fj = (xi,yi) и F2 = (.Г 2, У?), то получится у/{х -Х1)2 + (у -У1)2 + У(х - х2)2 + (у - У2)2 = const. (3.35) Возведя это уравнение в квадрат, собрав члены с одинаковыми степенями и снова возведя в квадрат, можно переписать общее уравнение эллипса в виде Ах2 + В у2 + Cxy + Dx + Ey + F = 0, (3.36) где коэффициенты А, В, С, D, Е и F выражаются через координаты фокусов и длины большой и малой осей эллипса. Большая ось — это прямой отрезок, который соединяет одну сторону эллипса с другой и проходит через фокусы. Малой называется ось, которая покрывает меньшее расстояние, под прямым углом пересекая большую ось посередине между двумя фокусами (в центре эллипса). Эллипс можно описать интерактивно через его относительную ориентацию — ввести два фокуса и точку на границе эллипса. Зная координаты этих трех точек, можно найти константу уравнения (3.35). После этого значения коэффициентов урав- нения (3.36) вычисляются и используются для изображения пикселей, расположенных на эллиптической траектории. Уравнения эллипса значительно упрощаются, если направления большой и малой осей совпадают с координатными осями. На рис. 3.22 показан эллипс в “стандартном положении”, когда большая и малая оси направлены параллельно координатным осям х и у. В этом примере параметр гх обозначает половину большой оси (большую полуось), а параметр гу — половину малой оси (малую полуось). Уравнение эллипса, показанного на рис. 3.22, можно следующим образом записать через координаты центра эллипса и параметры гх и гу\ х - тс^2 , (у-ус^ _ гу ) (3.37) X
180 Глава 3. Выходные графические примитивы В полярных координатах г и 9 эллипс в стандартном положении можно также описать с помощью такого параметрического уравнения: X = хс + rx cos 0, У = Ус + Ту sin0. (3.38) Угол 9, который называется углом эксцентриситета эллипса, измеряется по перимет- ру ограничивающей окружности. Если гх> гу, радиус ограничивающей окружности равен г = гх (рис. 3.23). В противном случае радиус равен г = гу. Как и в алгоритме для окружности, объем вычислений можно уменьшить, если учесть условия симметрии. Эллипс в стандартном положении симметричен в квадран- тах, но, в отличие от окружности, не симметричен в двух октантах одного квадранта. Таким образом, нужно найти координаты пикселей на дуге эллипса в одном квадран- те, а затем воспользоваться условиями симметрии и найти кривую в остальных трех квадрантах (рис. 3.24). Рис. 3.24. Симметрия эллипса. Найдя координаты точки (х, у) в одном квадранте, можно узнать координаты точек в трех остальных квадрантах
3.10. Алгоритмы построения эллипсов 181 Рис. 3.25. Области обработки эллипса. В области 1 тангенс угла на- клона эллипса меньше 1; в области 2 тангенс угла наклона больше 1 АЛГОРИТМ СРЕДНЕЙ ТОЧКИ ДЛЯ ЭЛЛИПСА В этом случае подход аналогичен тому, который использовался при растровом изоб- ражении окружности. Если известны параметры гх, гу и (хс, ус), можно определить координаты точек (х, у) эллипса в стандартном положении с центром в начале коор- динат, после этого сместить все точки так, чтобы получился эллипс с центром в точке (хс, Ус)- Если потребуется изобразить эллипс в нестандартном положении, можно раз- вернуть его вокруг центральной точки, чтобы переориентировать большую и малую оси в нужном направлении. На данный момент рассмотрим изображения эллипсов только в стандартном положении. Общие методы изменения ориентации объектов и их положений обсуждаются в главе 5. Метод средней точки для эллипса применяется в обеих частях первого квадранта. На рис. 3.25 показано, как первый квадрант делится на части согласно тангенсу угла наклона эллипса, для которого гх < гу. При обработке этого квадранта в той части, где тангенс угла наклона кривой меньше 1, выполняются единичные шаги в направлении х, а затем в той части, где величина тангенса угла наклона больше 1, выполняются единичные шаги в направлении у. Области 1 и 2 (рис. 3.25) можно обрабатывать различными способами. Можно начать с точки (0, гу) и двигаться по часовой стрелке по эллиптической траектории в первом квадранте, а затем перейти от единичного шага по х к единичному шагу по у, когда тангенс угла наклона станет меньше — 1. Или же можно начать с точки (гж, 0) и выбирать точки в направлении против часовой стрелки, перейдя от единичного шага по у к единичному шагу по х, когда тангенс угла наклона станет больше —1. При наличии параллельных процессоров можно рассчитывать координаты пикселей в двух областях одновременно. Для иллюстрации последовательной реализации алгоритма средней точки возьмем начальное положение в точке (0, гу) и будем перемещаться по эллиптической траектории в первом квадранте по часовой стрелке. Определим функцию эллипса из уравнения (3.37) при (хс, ус) = (0, 0) как /эллипс^, у) — + ГхУ^ ~ ГхГу- (3.39)
182 Глава 3. Выходные графические примитивы Рис. 3.26. Средняя точка между возможными пикселями в точке вы- борки + 1 на эллиптической траектории Эта функция обладает следующими свойствами: {< 0, если (х, у) находится с внутренней стороны границы эллипса, = О, если (х, у) находится на границе эллипса, (3.40) > 0, если (х, у) находится за границей эллипса. Таким образом, функция эллипса /эллипс(ж> У) является параметром принятия реше- ния в алгоритме средней точки. В каждой точке выборки определяется следующий пиксель на эллиптической траектории в соответствии со знаком функции эллипса, ко- торая вычисляется в средней точке между двумя возможными положениями пикселей. Начиная с точки (0, гу), выполняются единичные шаги в направлении х до тех пор, пока не будет достигнута граница между областью 1 и областью 2 (рис. 3.25). Затем мы переключаемся на единичные шаги в направлении у на оставшейся части кривой в первом квадранте. На каждом шаге нужно проверять значение тангенса угла наклона кривой, который находится из уравнения (3.39): dy _ 2rgx dx ^r^y (3-41) На границе между областью 1 и областью 2 dy/dx = —1 и 2гух = 2гху. Следова- тельно, мы выходим за пределы области 1, когда 2ф > 2г2у. (3-42) На рис. 3.26 показана средняя точка между двумя возможными положениями пиксе- лей, которая определяется при точке выборки х^ +1 в первой области. Предположив, что на предыдущем шаге было выбрано положение (xi:, у а-), найдем следующее по- ложение на эллиптической траектории, вычислив параметр принятия решения (т.е. функцию эллипса (3.39)) в этой средней точке: plfc — /эллипс + 1, Ук — 2
3.10. Алгоритмы построения эллипсов 183 / 1 \ z = r2y(xk + I)2+rl[yk--r2xr2y. (3.43) Если p\k < 0, средняя точка находится внутри эллипса, тогда пиксель в строке развертки ук будет ближе к границе эллипса. В противном случае средняя точка лежит за пределами эллипса или на его границе, и выбирается пиксель в строке развертки ук — 1. В следующей точке выборки (х^+1 + 1 = хк + 2) параметр принятия решения для области 1 ищется как plfc+l — /эллипс [ 2^+1 + 1, У к+1 ~ 2 / ~ / 1\2 = г2[(хк + 1) + I]2 + т%(ук+1 - -J -т2т2 или plk+1 = plk + 2r2(zfc + 1) + г2 + г2 (3.44) где Ук+i равно ук либо ук — 1 в зависимости от знака р!к. Параметры принятия решения увеличиваются на следующие величины: {2г^хк+1 + еслир1д.<0, 2r2xfc+1 + г2 - 2г%ук+1, если plk > 0. Приросты для параметров принятия решения вычисляются с использованием толь- ко операций сложения и вычитания, как и в алгоритме для окружности, поскольку значения членов 2ГуХ и 2г2у находятся путем сложения приростов. В начальном положении (0, гу) эти два члена равны 2г2х = О, 2^2 у = 2г2 Ту. (3-45) (3.46) С увеличением х и у их новые значения находятся путем прибавления 2гу к текущему значению увеличивающегося члена, представленного в уравнении (3.45), и вычитания 2гх из текущего значения члена, представленного в уравнении (3.46). На каждом шаге сравниваются новые значения приростов, и при выполнении условия (3.42) мы переходим из области 1 в область 2.
184 Глава 3. Выходные графические примитивы Рис. 3.27. Средняя точка между возможными пикселями в точке выборки — 1 на эллиптической траектории В области 1 начальное значение параметра принятия решения находится через функцию эллипса в начальной точке (хо,Уо) = (0, гу): , _ f Л 1V plo — /эллипс I 1, — 2 J ~ / 1\2 2 , 2 I 1 1 2 2 = ry + ГУ - 2 ) ~Г*ГУ или plo = Г2 - Г2хГу + ^7’2. (3.47) В области 2 выполняется выборка с единичным интервалом в отрицательном направ- лении координаты у, а средняя точка на каждом шаге теперь берется между гори- зонтальными пикселями (рис. 3.27). Для этой области параметр принятия решения находится следующим образом: Р^к = /эллипс + 2 ’ У к ~ = / 1\2 = Г1 \^к + J +гх(^ - !)2-^7у- (3-48) Если > 0, средняя точка находится за пределами эллипса, и выбирается пиксель с координатой х,'К. Если р2^ < 0, средняя точка расположена либо внутри эллипса, либо на его границе, и выбирается пиксель с координатой х,к+\- Чтобы найти взаимосвязь между последовательными параметрами принятия ре- шения в области 2, найдем функцию эллипса для следующего шага дискретизации Ук+х - 1 = yfc - 2: = /эллипс + 2 ,Ук+Х ~ = / 1 \2 = г2 (zfc+i + - J + r2[(yfc - 1) - l]2 - r2rj (3.49)
3.10. Алгоритмы построения эллипсов 185 или p2fc+i = р2к - 2т2(ук - 1) + г+ т2у 1 ^+1 + 2 (3.50) при равном хк или хк + 1 в зависимости от знака р2к. При входе в область 2 в качестве начальной точки (то, уо) берется последнее положение в области 1, и тогда начальный параметр принятия решения для области 2 будет равен р20 = /эллипс + 2 > Уо ~ = / !\2 = г2 hro + 2 ) + r^y° ~ -1)2 - г^гу- (3-51) Чтобы упростить вычисление р2о, положения пикселей можно выбирать в направ- лении против часовой стрелки, начиная с точки (гх, 0). Тогда единичные шаги вы- полняются в положительном направлении оси у до тех пор, пока не будет выбрано последнее положение в области 1. Описанный алгоритм средней точки можно применять и для создания эллипсов с нестандартным положением, воспользовавшись функцией эллипса (3.36) и вычисляя координаты пикселей на всей эллиптической траектории. Кроме того, можно переори- ентировать оси эллипса таким образом, чтобы он перешел в стандартное положение, воспользовавшись методами преобразований, описанными в главе 5, применить ал- горитм средней точки для эллипса, чтобы найти координаты пикселей на кривой, а затем преобразовать найденные координаты пикселей в координаты точек эллипса с исходной ориентацией. Предположим, что гх, гу и координаты центра эллипса известны и представлены в целочисленных экранных координатах. Тогда для того, чтобы определить значения параметров принятия решения в алгоритме средней точки для эллипса, нужны только вычисления с целыми числами. Приросты г2, г2, 2г х и 2г2 находятся один раз в начале процедуры. В приведенном ниже алгоритме перечислены основные шаги, необходимые для изображения эллипса с помощью алгоритма средней точки. Алгоритм средней точки для эллипса 1. Ввести гх, гу и координаты центра эллипса (хс, ус), а затем найти первую точку эллипса с центром в начале координат: (хо,уо) = (0,Гу). 2. Вычислить начальное значение параметра принятия решения в области 1: plo = г2у- Т2хГу + ±г2.
186 Глава 3. Выходные графические примитивы 3. Для каждого значения Хк в области 1, начиная с к = 0, провести следующую проверку. Если pl*. < 0, следующей точкой эллипса с центром (0, 0) будет Ofc+1, У к) и plfc+l = plk + ^ГуХк+1 + Гу. В противном случае следующей точкой эллипса будет (хк + 1, Ук — 1) и р!к+1 = plk + 2г2хк+1 - 2г2ук+1 + г2 при 2r^fc+1 = 2г2хк + 2г2, 2г^ук+1 = 2г2ук - 2г2. Данный процесс продолжается, пока не станет 2г2х > 2гху. 4. Найти начальное значение параметра принятия решения в области 2: / 1\2 p2o = r2^o + -j +r2(yo-l)2 ~г2хт2, где (то, уо) — координаты последней точки из области 1. 5. В каждой точке у к в области 2, начиная с к = 0, выполнить следующую проверку. Если р2к > 0, следующей точкой эллипса с центром в точке (0, 0) будет (xfc, у к - 1) и p2fc+1 = р2к - 2г%ук+1 + г2. В противном случае следующая точка эллипса будет иметь координаты 1, Ук - 1) и p2fc+1 = р2к + 2r2xfc+1 - 2r2yfc+1 + г2. Здесь используются те же самые расчеты для приростов по х и у, что и для области 1. Процесс продолжается до тех пор, пока не будет у = 0. 1. Для обеих областей найти симметричные точки в остальных трех квадрантах. 2. Переместить каждую найденную точку (х, у) на эллиптическую траекторию с центром в точке (хс, ус) и изобразить точки с такими координатами: х = х + хс, У = у + Ус-
3.10. Алгоритмы построения эллипсов 187 ПРИМЕР 3.3. Изображение эллипса методом средней точки Известны входные параметры эллипса гх = 8 и гу = 6. Проиллюстрируем шаги алгоритма средней точки для эллипса, определив растровые положения на эл- липтической траектории в первом квадранте. Начальные значения и приросты параметра принятия решения вычисляются следующим образом: 2г^х = 0 (с приростом 2Гу = 72), 2?’2у = 2г%Гу (с приростом — 2гх = —128). Для области 1 начальной точкой эллипса с центром в начале координат будет (х0, Уо) = 6), а значение начального параметра принятия решения р10 = г^у - т1гу + = -332. Последующие значения параметра принятия решения для метода средней точки и координаты пикселей, образующих эллипс, приведены в таблице. к plfc (^fc+iiyfc+i) 2rj)zfc+1 2^yk+i 0 -332 (1,6) 72 768 1 -224 (2,6) 144 768 2 -44 (3,6) 216 768 3 208 (4, 5) 288 640 4 -108 (5, 5) 360 640 5 288 (6, 4) 432 512 6 244 (7, 3) 504 384 Далее переходим из области 1 в область 2, поскольку 2ryx > 2г%у. Для области 2 начальной точкой будет (то,Уо) = (7,3), а начальный параметр принятия решения равен р2о = /эллипс ^7 + —, 2^ = —151. Затем находятся остальные положения пикселей эллипса в первом квадранте. к plk (Tfc+1,yfc+1) 2г^хк+1 2г^ук+1 0 -151 (8, 2) 576 256 1 233 (8, 1) 576 128 2 745 (8, 0) — — График рассчитанных положений пикселей на эллиптической траектории в пер- вом квадранте показан на рис. 3.28.
188 Глава 3. Выходные графические примитивы Рис. 3.28. Положения пикселей на эллиптической траектории с центром в начале координат и гх = 8 и гу = 6. Иллюстра- ция использования алгоритма средней точки для вычисления положений точек в первом квадранте В следующем фрагменте кода приведены примеры процедур, необходимых для выполнения алгоритма средней точки для эллипса. Значения параметров эллипса Rx, Ry, xCenter и yCenter вводятся в процедуру ellipseMidpoint. Затем коор- динаты точек кривой в первом квадранте рассчитываются и сообщаются процедуре ellipsePlotPoints. Для того чтобы найти координаты пикселей в остальных трех квадрантах, используются условия симметрии, а стандартная процедура set- Pixel задает цвет эллипса в позициях буфера кадра, соответствующих этим точкам. inline int round (const float a) { return int (a + 0.5); } /* * Следующая процедура принимает значения координат центра * эллипса, его большой и малой полуоси, а затем с помощью * алгоритма средней точки находит координаты точек эллипса. */ void ellipseMidpoint (int xCenter, int yCenter, int Rx, int Ry) ( int Rx2 = Rx * Rx; int Ry2 = Ry * Ry; int twoRx2 = 2 * Rx2; int twoRy2 = 2 * Ry2; int p; int x = 0; int у = Ry; int px = 0; int py = twoRx2 * y; void ellipsePlotPoints (int, int, int, int); /* В каждом квадранте изображается первая точка. */ ellipsePlotPoints (xCenter, yCenter, х, у) ; /* Область 1 */ р = round (Ry2 - (Rx2 * Ry) + (0.25 * Rx2));
3.11. Другие кривые 189 while (рх < ру) { х++; рх += twoRy2; if (р < 0) р += Ry2 + рх; else { у—; ру -= twoRx2; р += Ry2 + рх - ру;} ellipsePlotPoints (xCenter, yCenter, х, у); } /* Область 2 */ р = round (Ry2 * (х+0.5) * (х+0.5) + Rx2 * (у-1) * (у- 1) - Rx2 * Ry2); while (у > 0) { у—; ру -= twoRx2; if (Р > 0) р += Rx2 - ру; else { х++; рх += twoRy2; р += Rx2 - ру + рх; } ellipsePlotPoints (xCenter, yCenter, х, у); } } void ellipsePlotPoints (int xCenter, int yCenter, { int x, int y); setPixel (xCenter + x, yCenter + y); setPixel (xCenter - x, yCenter + y); setPixel (xCenter + x, yCenter - y); } setPixel (xCenter - x, yCenter - y); ИЛИ ДРУГИЕ КРИВЫЕ При объектном моделировании, описании траекторий в анимации, построении гра- фиков данных и функций, а также в других графических приложениях могут ока- заться полезными функции построения различных кривых. Чаще всего встречаются такие кривые, как конические сечения, тригонометрические и показательные функ- ции, распределения вероятности, полиномы общего вида и сплайны. Изображения этих кривых можно получить с помощью методов, аналогичных применяющимся для изображения окружностей и эллипсов. Координаты точек на кривой можно най-
190 Глава 3. Выходные графические примитивы ти непосредственно из явного выражения функции у = f (rr) или из параметрических уравнений. Или же можно воспользоваться методом средней точки с нахождением приростов и построить кривую, которая задается в виде неявной функции /(гг, у) = 0. Самый простой способ изображения кривой линии — аппроксимировать ее прямо- линейными отрезками. В этом случае часто полезны параметрические представления, позволяющие получить на траектории кривой точки (концы отрезков), находящиеся на одинаковом расстоянии друг от друга. Такие точки можно также найти из явного выражения, выбрав независимую переменную в соответствии с тангенсом угла на- клона кривой. Там, где величина тангенса угла наклона кривой у = f(x) меньше 1, в качестве независимой переменной выбирается х, и через равные промежутки х находятся значения у. Чтобы получить одинаковые интервалы в той области, где ве- личина тангенса угла наклона больше 1, можно воспользоваться обратной функцией, х = /-1(у), и найти значения х через равные интервалы у. Аппроксимация в виде прямой или кривой линии используется также для по- строения линейного графика набора дискретных значений. Дискретные точки можно соединить прямолинейными отрезками либо воспользоваться методом наименьших квадратов и аппроксимировать набор данных одной прямой линией. Нелинейный ме- тод наименьших квадратов используется при изображении набора данных с помощью некоторой аппроксимирующей функции, обычно в этой роли выступает полином. Кроме эллипса или окружности, определенной симметрией обладают многие функции, и этим можно воспользоваться для уменьшения объема вычислений при расчете координат пикселей на кривой. Например, функция нормального распреде- ления вероятности симметрична относительно своего центра (среднего значения), а все точки в пределах одного периода синусоиды можно получить с помощью точек из интервала 90°. КОНИЧЕСКИЕ СЕЧЕНИЯ В общем случае коническое сечение можно описать с помощью уравнения второго порядка Ах2+ В у2+ Cxy + Dx + Ey + F = Q, (3.52) где значения параметров А, В, С, D, Е и F определяют тип изображаемой кри- вой. Если этот набор коэффициентов известен, конкретный вид конического сече- ния, которое получится из этого уравнения, можно определить, найдя дискриминант В2 - 4АС: {< 0, эллипс (или окружность), = 0, парабола, (3.53) > 0, гипербола.
3.11. Другие кривые 191 Рис. 3.29. Дуга окружности с центром в начале координат, кото- рая задается с помощью начального угла 0j, конечного угла 02 и радиуса г Рис. 3.30. Параболическая траектория подброшенного вверх предмета в направленном вниз гравитационном поле при исходных координатах (то, уо) Например, при А = В = 1, С = 0, D = — 2хс, Е = —2ус и F = х^. + — г2 полу- чаем уравнение окружности (3.26). Уравнение (3.52) описывает также вырожденные конические сечения: точки и прямые линии. В некоторых приложениях дуги окружностей и эллипсов удобно задавать значе- ниями угловых координат начала и конца дуги, как показано на рис. 3.29. Иногда такие дуги определяются координатами их концов. В любом случае, дугу можно по- строить с помощью видоизмененного метода средней точки или аппроксимировать ее набором прямолинейных отрезков. Эллипсы, параболы и гиперболы оказываются особенно полезными в некоторых анимационных приложениях. Эти кривые описывают движение по орбите и дру- гие виды движения объектов под действием гравитационных, электромагнитных или ядерных сил. Орбиты планет Солнечной системы, например, можно аппроксимиро- вать эллипсами; а объект, помещенный в однородное гравитационное поле, движется по параболической траектории. На рис. 3.30 показана стандартная форма парабо- лической траектории, которая описывает движение в гравитационном поле, которое действует на объект в отрицательном направлении координаты у. Яный вид уравне- ния параболической траектории показанного объекта можно записать как У = УО + а(х - х0)2 + Ь(х - х0), (3.54)
192 Глава 3. Выходные графические примитивы Левая ветка Правая ветка Рис. 3.31. Левая и правая ветви гиперболы в стандартном положении, / 'К ось симметрии которой совпадает с осью х где константы а и b описывают начальную скорость vq объекта и ускорение д, вы- званное однородной гравитационной силой. Такое параболическое движение можно также описать с помощью параметрических уравнений, воспользовавшись парамет- ром времени t (измеряется в секундах): х = х0 + vx01, 1 2 у = уо + Vyot - ^gt (3.55) Здесь vxo и vyo — компоненты начальной скорости, а значение д около поверхности Земли составляет приблизительно 9,8 м/с2. Затем рассчитываются положения объекта на этой параболической траектории через определенные промежутки времени. Гиперболические кривые (рис. 3.31) могут пригодиться в различных приложе- ниях, связанных с научной визуализацией. Движение объектов по гиперболическим траекториям возникает при столкновениях заряженных частиц, а также в определен- ных задачах, связанных с гравитацией. Например, кометы или метеориты, которые движутся вокруг Солнца, могут перемещаться по гиперболической траектории и вы- ходить в открытый космос, никогда не возвращаясь оттуда. Выбор одной из веток гиперболы (левой или правой, рис. 3.31) зависит от сил, которые рассматриваются в задаче. Стандартное уравнение для гиперболы с центром в начале координат можно записать как при х < — гх для левой ветки или х > гх для правой. Поскольку это уравнение отличается от стандартного уравнения эллипса (3.39) только знаком между членами гг2 и у2, то координаты точек на гиперболической кривой находятся с помощью слегка видоизмененного алгоритма для эллипса.
3.11. Другие кривые 193 Параболы и гиперболы имеют ось симметрии. Например, парабола, которая опи- сывается уравнением (3.55), симметрична относительно оси х = х0 + vxQVyo/g. Методы, которые используются в алгоритме средней точки для эллипса, можно непо- средственно применять для поиска точек на одной стороне параболической или ги- перболической траектории в двух областях: 1) там, где величина тангенса угла на- клона кривой меньше 1; 2) там, где величина тангенса угла наклона больше 1. Чтобы сделать это, вначале определяется соответствующий вид уравнения (3.52), а затем выбранная функция используется для вычисления параметров принятия решения в двух областях. ПОЛИНОМЫ И СПЛАЙНЫ Полиномиальная функция n-го порядка по х определяется как п у= Z2akxk = fc=0 = ао + й]Х + • • • + ап_\хп~у + апхп, (3.57) где п — неотрицательное целое число, а - константы, причем ап 0. При п = 1 получим прямую линию, при п — 2 — кривую второго порядка, при п — 3 — кубический полином, при п = 4 — кривую четвертого порядка, и т.д. Полиномы используются в ряде графических приложений, в том числе при проектировании формы предметов, описании траекторий в анимации, построении графиков данных по дискретным наборам точек. При проектировании формы предмета или траектории движения, как правило, сначала задается несколько точек, которые определяют общий вид кривой и пред- ставляют собой необходимый контур, а затем по выбранным точкам подбирается подходящий полином. Один из способов подбора кривой — это соединить каждую пару заданных точек кубическим участком кривой. Каждый такой участок следую- щим образом описывается в параметрической форме: х = ах0 + ах1и + ах2и2 + ах3и\ 1 з 0-58) У = ауо + ау1и + ау2и + ay3uJ, где параметр и приобретает значения от 0 до 1. Значения коэффициентов и в преды- дущих уравнениях определяются из граничных условий для участков кривой. Одно из граничных условий заключается в том, что конец одного участка кривой совпадает с началом следующего, а второе условие — это совпадение тангенсов угла наклона
194 Глава 3. Выходные графические примитивы Рис. 3.32. Сплайновая кривая, которая образована из отдельных участ- ков кубических полиномов, соединяющих заданные точки двух кривых на общей границе, таким образом, в результате получается непрерывная гладкая кривая (рис. 3.32). Непрерывные кривые, образованные из полиномиальных фрагментов, называются сплайновыми кривыми или просто сплайнами. Существует несколько способов задания сплайновых кривых, и в главе 8 рассматриваются раз- личные методы построения сплайнов. 3.12. ПАРАЛЛЕЛЬНЫЕ АЛГОРИТМЫ ПОСТРОЕНИЯ КРИВЫХ При построении кривых возможности параллельной обработки используются так же, как при изображении прямых линий. Можно либо адаптировать для этого последо- вательный алгоритм, выделив каждому процессору отдельный участок кривой, либо придумать другой способ и соотнести с процессорами отдельные части экрана. Параллельный метод изображения окружности с помощью средней точки заклю- чается в том, чтобы разделить дугу окружности от 45° до 90° на равные поддуги и сопоставить с каждой из этих поддуг отдельный процессор. Как и в параллель- ном алгоритме Брезенхема для прямой линии, для каждого процессора нужно вы- вести формулу для расчета начального значения у и параметра принятия решения Pk- На каждой поддуге рассчитываются координаты пикселей, а положения точек в остальных октантах окружности можно найти из условий симметрии. Аналогичным образом в параллельном методе средней точки для эллипса эллиптическая дуга в первом квадранте делится на поддуги, которые распределяются между отдельными процессорами. Как и ранее, координаты пикселей в остальных квадрантах находят- ся из условий симметрии. Схема разделения экрана для окружностей и эллипсов заключается в том, чтобы каждому процессору поставить в соответствие отдельную строку развертки, которая пересекается с кривой. В этом случае каждый процессор из уравнения окружности или эллипса находит координаты точки пересечения с кривой. Для изображения эллиптических дуг или других кривых можно просто восполь- зоваться методом распределения строк развертки. Каждый процессор по уравнению кривой определяет точки пересечения данной кривой с выделенной ему в соответ- ствие строкой развертки. Если с процессором соотносятся отдельные пиксели, тогда каждый процессор будет рассчитывать расстояние (или квадрат расстояния) от кривой до выделенного ему пикселя. Если рассчитанное расстояние меньше предопределен- ного значения, тогда пиксель изображается на экране.
3.13. Адресация пикселей и геометрия объектов 195 3.13. АДРЕСАЦИЯ ПИКСЕЛЕЙ И ГЕОМЕТРИЯ ОБЪЕКТОВ При обсуждении растровых алгоритмов изображения графических примитивов пред- полагалось, что координаты в буфере кадров соответствуют центру пикселя на экране. Теперь рассмотрим принцип действия различных схем адресации и альтернативный способ адресации пикселей, который используется в некоторых графических пакетах, включая OpenGL. Описание объекта, которое служит входной информацией графической програм- мы, дается в виде точных положений во внешней системе отсчета, которые пред- ставляют собой бесконечно малые математические точки. Однако, когда происходит преобразование стандартов развертки объекта в буфере кадров, входное описание трансформируется в координаты пикселей, занимающих конечную площадь экрана, поэтому полученное растровое изображение может не совсем точно соответствовать относительным размерам заданного объекта. Если при изображении объекта важно сохранить присущую ему геометрию, эффект превращения математических точек в пиксели с конечной площадью можно компенсировать. Один из путей решения этой проблемы состоит в том, чтобы просто подогнать размеры пикселей изображаемых объектов таким образом, чтобы они соответствовали размерам, заданным в исходном математическом описании сцены. Например, если задается прямоугольник с шири- ной 40 см, то можно подобрать такой экран дисплея, чтобы ширина прямоугольника равнялась 40 пикселям, причем ширина каждого пикселя будет представлять собой один сантиметр. Еще один способ — это так переводить внешние координаты в точки между пикселями на экране, чтобы границы объектов сопоставлялись с границами пикселей, а не с их центрами. КООРДИНАТЫ СЕТКИ ЭКРАНА На рис. 3.33 показан участок экрана с сеткой из линий, обозначающих границы пикселей и проходящих на единичном расстоянии друг от друга. При такой схеме положение на экране задается как пара целых чисел, обозначающих пересечение ли- ний сетки между двумя пикселями. Теперь адрес любого пикселя — это положение его левого нижнего угла, как показано на рис. 3.34, а прямая линия прокладывает- ся между узлами (пересечениями линий) сетки. Например, математическая кривая, представляющая собой ломаную линию с координатами концов (0, 0), (5, 2) и (1, 4) в этом случае выглядела бы так, как показано на рис. 3.35. Используя координаты сетки экрана, площадь, которую занимает пиксель с экран- ными координатами (т, у), теперь можно определить как единичный квадрат, коор- динаты диагональных углов которого — (х, у) и (х + 1, у + 1). У такого способа адресации пикселей есть несколько преимуществ: нет пикселей с полуцелыми ко-
196 Глава 3. Выходные графические примитивы Рис. 3.33. Левая нижняя часть экрана, где координаты определяются по пересечениям линий сетки ординатами, можно точно описывать объекты, также упрощается процесс обработки данных при выполнении многих алгоритмов преобразования стандартов развертки и других растровых процедур. Алгоритмы построения прямых и кривых линий, которые обсуждались в преды- дущих разделах, не изменяются, если входные координаты выражаются в виде коор- динат сетки экрана. Параметром принятия решения в этих алгоритмах теперь будет мера, показывающая разницу расстояний между линиями сетки экрана, а не между центрами пикселей. СОХРАНЕНИЕ ГЕОМЕТРИЧЕСКИХ СВОЙСТВ ИЗОБРАЖАЕМЫХ ОБЪЕКТОВ При переводе геометрического описания объекта в пиксельное представление матема- тические точки и линии преобразовываются в области на экране, имеющие конечную площадь. Если требуется сохранить исходные геометрические величины, заданные входными координатами объекта, нужно учесть конечный размер пикселей при пре- образовании описания объекта в изображение на экране. На рис. 3.36 показана линия, построенная с помощью алгоритма Брезенхема для прямой линии из примера в разделе 3.5. При интерпретации координат концов от- резка (20; 10) и (30; 18) как точных положений пересечений с линиями сетки видим,
3.13. Адресация пикселей и геометрия объектов 197 Рис. 3.35. Линия, представляющая собой два соединенных отрезка прямой, проведенная между точками, заданными координатами сет- ки экрана Рис. 3.36. Линия с конечными точками (20, 10) и (30, 18) и соответствующие пиксели сетки экрана что линия не должна заходить за последнее значение точки пересечения с линиями сетки (30, 18). Если нанести на график пиксель с экранными координатами (30, 18), как это было сделано в примере из раздела 3.5, будет получено изображение линии, которая занимает 11 единиц по горизонтали и 9 единиц по вертикали. В то же время, для математической линии Ах = 10, а Ду = 8. Если адресация пикселей происходит по положениям их центров, длину линии можно подогнать, отбросив один из конеч- ных пикселей. Однако, если рассматривать координаты экрана как границы пикселей (рис. 3.36), линия должна строиться только из тех пикселей, которые находятся “внут- ри” заданной траектории, т.е. между концами отрезка. В нашем примере нужно было изобразить крайний левый пиксель в точке (20, 10), а крайний справа — в точке (29, 17). В таком случае получится изображение прямой линии с такими же геометриче- скими размерами, что и математический отрезок прямой с концами (20, 10) и (30, 18). Для замкнутой области входные геометрические свойства сохраняются, если об- ласть изображается с помощью только тех пикселей, которые находятся внутри гра- ниц объекта. Прямоугольник, который определяется вершинами с экранными коор- динатами, показанными на рис. 3.37, а, например, будет больше, если изобразить его с помощью заполнения пикселей, включая граничные ряды пикселей, которые со-
198 Глава 3. Выходные графические примитивы 0 1 2 3 4 5 6) Рис. 3.37. Преобразование прямоугольника (панель а) с вершинами в точках с координатами (0, 0), (4, 0), (4, 3) и (0, 3) в изображение (панель б), в которое включены правая и верхняя границы, и в изображение (панель в), при котором сохраняются геометрические размеры о IWIWIWIWI__L 0 1 2 3 4 5 единяют заданные вершины (рис. 3.37, б). По определению площадь прямоугольника равна 12 единицам, но при таком изображении, которое представлено на рис. 3.37, б, его площадь равна 20 единицам. На рис. 3.37, в, исходные размеры прямоугольни- ка сохраняются путем изображения только внутренних пикселей. Правая граница заданного прямоугольника находится в точке х = 4. Чтобы сохранить ширину прямо- угольника на экране, крайнему справа пикселю присваивается значение координаты сетки экрана х = 3, поскольку пиксели в этом вертикальном столбце занимают место от х — 3 до х — 4. Аналогично математическая верхняя граница прямоугольника нахо- дится в точке с координатой у = 3, поэтому верхней строке пикселей изображаемого прямоугольника присваивается значение у = 2. Такую компенсацию конечных размеров пикселей можно применять и к другим объектам, в том числе и к тем, границы которых представляют собой кривые линии, чтобы при растровом изображении сохранялись заданные размеры объектов. Окруж- ность с радиусом 5 единиц и центром в точке с координатами (10, 10), например, изображалась бы так, как показано на рис. 3.38 (предполагается, что используется алгоритм средней точки, а значения координат соотносятся с центрами пикселей). Но в таком случае диаметр изображенной окружности будет равен 11 единицам. Чтобы
3.13. Адресация пикселей и геометрия объектов 199 Рис. 3.38. График, полученный с помощью ал- горитма средней точки из уравнения окружности (х - 10)2 + (у — 10)2 = 52 при использовании ко- ординат центров пикселей Рис. 3.39. Измененный график окружно- сти, изображенной на рис. 3.38, на котором сохраняется заданный диаметр окружно- сти в 10 единиц построить окружность с заданным диаметром 10 единиц, следует изменить алгоритм таким образом, чтобы сократить размеры каждой строки развертки и каждого столбца пикселей, как показано на рис. 3.39. Для этого, например, можно строить точки на дуге окружности в третьем квадранте по часовой стрелке, начиная с точки с коорди- натами экрана (10, 5). Для каждой построенной точки семь остальных симметричных точек на окружности будут строиться с увеличением значения координаты х на 1 в строке развертки и уменьшением значения координаты у на 1 в столбце пикселей. Аналогичные методы сохранения заданных пропорций при изображении эллипсов используются и в алгоритмах для эллипсов.
200 Глава 3. Выходные графические примитивы а) б) в) Рис. 3.40. Закрашенные фигуры, заданные с помощью различных границ: а) круг; б) фигура, образованная замкнутой ломаной линией; в) область, образованная границей в виде непра- вильной кривой Рис. 3.41. Каркасная модель цилиндра, на которой показана только передняя (видимая) часть многоугольной сетки, используемой для аппроксимации поверхностей ЗАКРАШЕННЫЕ ОБЛАСТИ При описании элементов рисунка используется еще одна полезная конструкция, кро- ме точек, прямолинейных отрезков и кривых, — область, закрашенная каким-то одним цветом или заполненная определенным узором. Такие элементы рисунка обычно на- зывают цветными фигурами или закрашенными областями. Чаще всего закрашенные фигуры используют для описания поверхностей сплошных объектов, хотя они могут пригодиться и во многих других приложениях. К тому же, закрашенные области, как правило, представляют собой плоские поверхности, главным образом, много- угольники. В то же время существует множество форм участков рисунка, которые может потребоваться закрасить с помощью какой-либо цветовой опции. На рис. 3.40 показано несколько возможных типов закрашенных фигур. На данный момент бу- дем считать, что все изображаемые закрашенные области будут заполняться одним заданным цветом. Другие варианты заполнения будут рассмотрены в главе 4. И хотя форма закрашенной области может быть любой, графические системы, как правило, не поддерживают спецификации произвольных закрашенных фигур. В боль- шей части стандартных процедур требуется, чтобы закрашенная область задавалась в виде многоугольника. Графические функции способны обрабатывать многоугольни- ки намного эффективнее, чем другие виды закрашенных фигур, поскольку границы многоугольников описываются линейными уравнениями. Более того, большинство
3.15. Закрашенные многоугольники 201 криволинейных поверхностей можно достаточно корректно аппроксимировать набо- ром правильных многоугольников, как кривую линию — набором прямолинейных отрезков. А после наложения эффектов освещения и затенения аппроксимированная криволинейная поверхность выглядит вполне реалистично. Аппроксимацию изогну- той поверхности с помощью многоугольных граней иногда называют мозаичным представлением поверхности или аппроксимацией поверхности с помощью сетки многоугольников. На рис. 3.41 показаны боковая и верхняя поверхности металли- ческого цилиндра, аппроксимированные сеткой многоугольников в виде контурной схемы. Изображения таких фигур можно быстро получить в виде каркасных схем, на которых показаны только края многоугольников, по которым получается общее представление о структуре поверхности. После этого каркасную модель можно за- штриховать и получить изображение поверхности из материала, выглядящего есте- ственным образом. Объекты, описанные с помощью набора многоугольных участков поверхности, как правило, называют стандартными графическими объектами или просто графическими объектами. В общем случае можно создать закрашенную область с любой границей, такой как окружность или набор соединенных участков сплайновых кривых. Кроме того, некоторые методы, описанные в следующем разделе, можно адаптировать для вывода на экран закрашенных областей с нелинейными границами. Другие методы закраши- вания поверхностей объектов с изогнутыми границами рассмотрены в главе 4. 3.15. ЗАКРАШЕННЫЕ МНОГОУГОЛЬНИКИ Согласно математическому определению многоугольник — это плоская фигура, ко- торая задается с помощью набора из трех или больше точек — вершин, последова- тельно соединенных прямолинейными отрезками, которые называются ребрами или сторонами многоугольника. Кроме того, в классической геометрии необходимо, что- бы ребра многоугольников не имели общих точек, кроме вершин. Таким образом, по определению все вершины многоугольника должны лежать в одной плоскости, а его края не должны пересекаться. В качестве примеров многоугольников можно привести треугольники, прямоугольники, восьмиугольники и десятиугольники. Иногда много- угольником называют любую плоскую фигуру, граница которой образована замкнутой ломаной линией, а фигуры, края которых не пересекаются, называют стандартны- ми или простыми многоугольниками. Чтобы избежать путаницы в терминологии, под “многоугольниками” будем понимать только те плоские фигуры, которые имеют границу в виде замкнутой ломаной линии, и стороны которых не пересекаются. В приложениях компьютерной графики возможны такие ситуации, когда не все перечисленные вершины многоугольника лежат строго в одной плоскости. Это мо- жет быть связано с ошибкой округления при вычислении значений либо с ошибкой выбора координат вершин или (что более характерно) с аппроксимацией криволиней-
202 Гпава 3. Выходные графические примитивы Рис. 3.42. Многоугольники: а) выпуклый; б) вогнутый ной поверхности набором многоугольных участков. Один из способов исправления этой ситуации — просто разделить заданную сетку многоугольников на треугольники. Однако в некоторых случаях могут существовать причины, по которым необходимо сохранить изначальный вид ячеек сетки, поэтому были придуманы методы аппрокси- мации неплоских многоугольных фигур плоскими объектами. Расчет таких плоских аппроксимаций будет обсуждаться в подразделе, касающемся уравнений плоскости. КЛАССИФИКАЦИЯ МНОГОУГОЛЬНИКОВ Внутренним углом многоугольника называется угол внутри границы многоугольника, образованный двумя соседними сторонами. Если все внутренние углы многоугольни- ка меньше или равны 180°, то многоугольник выпуклый. Существует эквивалентное определение выпуклого многоугольника — весь многоугольник должен лежать по од- ну сторону от бесконечной прямой, являющейся продолжением любой из его сторон. К тому же, если выбрать любые две точки внутри выпуклого многоугольника, то пря- молинейный отрезок, соединяющий эти точки, также будет полностью находиться внутри многоугольника. Многоугольник, который не является выпуклым, называется вогнутым. На рис. 3.42 приведены примеры выпуклого и вогнутого многоугольников. Термином вырожденный многоугольник часто описывают набор вершин, которые являются коллинеарными или координаты которых повторяются. Коллинеарные вер- шины дают прямолинейный отрезок. Вершины с повторяющимися координатами мо- гут дать многоугольную фигуру с лишними линиями, перекрывающимися сторонами или сторонами, длина которых равна 0. Иногда термин вырожденный многоугольник еще применяется к списку вершин, который состоит из менее, чем трех точек. Устойчивые графические пакеты могут не воспринимать вырожденные или неплоские наборы вершин. Однако их распознавание требует дополнительной об- работки, поэтому в графических системах выбор ограничивающих условий, как пра- вило, оставляется на усмотрение программиста. Вогнутые многоугольники также создают дополнительные проблемы. Реализация алгоритмов закрашивания и других графических процедур для вогнутых многоуголь- ников намного сложнее, поэтому, как правило, перед обработкой эффективнее разде- лить вогнутый многоугольник на набор выпуклых. Как и другие алгоритмы предвари-
3.15. Закрашенные многоугольники 203 тельной обработки многоугольников, функции разделения вогнутого многоугольника часто не входят в графическую библиотеку. Для некоторых пакетов, в том числе и OpenGL, необходимо, чтобы все закрашиваемые многоугольники были выпуклыми. Кроме того, в некоторых системах допускается только закрашивание треугольных областей, что значительно упрощает многие алгоритмы создания изображений. РАСПОЗНАВАНИЕ ВОГНУТЫХ МНОГОУГОЛЬНИКОВ У вогнутого многоугольника по крайней мере один внутренний угол больше, чем 180°. Кроме того, продолжения некоторых сторон вогнутого многоугольника будут пересекать другие ребра, а некоторые пары внутренних точек дадут отрезки, пере- секающие границы многоугольника. Следовательно, любой из этих признаков вогну- того многоугольника можно положить в основу алгоритма распознавания вогнутых многоугольников. Если рассматривать каждую сторону многоугольника как вектор, то в проверке на вогнутость может использоваться векторное произведение двух соседних сторон. Для выпуклого многоугольника все такие векторные произведения будут одного знака (положительные или отрицательные). Следовательно, если одни векторные произве- дения будут положительными, а другие — отрицательными, то данный многоуголь- ник — вогнутый. На рис. 3.43 показана реализация метода векторных произведений сторон многоугольника для распознавания вогнутых многоугольников. Еще один способ распознавания вогнутых многоугольников — изучить положения вершин многоугольника относительно продолжения любой из его сторон. Если неко- торые вершины находятся по одну сторону от такого продолжения, а некоторые — по другую, то такой многоугольник относится к вогнутым. х (Е|ХЕ2). >0 (Е2хЕ3), >0 (Е3хЕ4)г<0 (Е4х Е3), > 0 (Е5хЕ6). > 0 (Е6хЕ|).>0 „ , тт ° Рис. 3.43. Для распознавания вогнутых многоугольников последовательно вычисля- ются векторные произведения пар векторов сторон
204 Глава 3. Выходные графические примитивы ДЕЛЕНИЕ ВОГНУТЫХ МНОГОУГОЛЬНИКОВ Вогнутый многоугольник можно разделить на набор выпуклых с помощью векторов сторон и их векторных произведений или, используя положения вершин относитель- но линии продолжения одной из сторон, определить, какие вершины находятся по одну сторону от этой линии, а какие — по другую. Для реализации следующих алго- ритмов допустим, что все многоугольники расположены в плоскости ху. Разумеется, исходный многоугольник, описанный во внешних координатах, может и не лежать в плоскости ху, но его всегда можно переместить в эту плоскость, воспользовавшись методами преобразований, описанными в главе 5. Для реализации векторного метода разделения вогнутого многоугольника, сна- чала необходимо построить векторы сторон. Если известны координаты двух сосед- них вершин Vи Vfc+i, то вектор стороны между ними определяется следующим образом: Efc = Vfc+1 - Vfc. Далее нужно найти векторные произведения соседних векторов сторон по порядку по всему периметру многоугольника. Если компонент z одних векторных произведе- ний будет положительным, а других — отрицательным, то многоугольник вогнутый. В противном случае многоугольник выпуклый. Здесь предполагается, что среди вер- шин нет трех последовательных коллинеарных точек, поскольку в таком случае век- торное произведение двух векторов сторон, содержащих эти вершины, будет равно нулю. Если все вершины коллинеарные, то многоугольник вырожден (представляет собой прямую линию). Векторный метод можно применять, обрабатывая стороны последовательно против часовой стрелки. Если у какого-то векторного произведе- ния появится отрицательный компонент z (как на рис. 3.43), то многоугольник — вогнутый, и его можно разделить, продолжив первый вектор стороны из той па- ры векторов, произведение которых рассматривается. Описанный метод разделения вогнутого многоугольника иллюстрируется в следующем примере. Рис. 3.44. Разделение вогнутого многоугольника с помощью век- торного метода
3.15. Закрашенные многоугольники 205 ПРИМЕР 3.4. Векторный метод разделения вогнутых прямоугольников На рис. 3.44 показан вогнутый многоугольник с шестью сторонами. Векторы сторон этого многоугольника можно записать как Ei = (1,0,0), Е2 = (1,1,0), Е3 = (1,-1,0), Е4= (0,2,0), Е5 = (-3,0,0), Е6 = (0, —2,0), где компонент z равен 0, поскольку все стороны лежат в плоскости ху. Векторное произведение Ej х Ед, двух соседних векторов сторон — это вектор, перпенди- кулярный плоскости ху при компоненте z, равном EjxE^y — EkxEjy: Ei х Е2 = (0,0,1), Е3 х Е4 = (0,0,2), Е5 х Еб = (0,0,6), Е2 х Ез = (0,0, -2) Е4 х Е5 = (0,0,6), Е6 х Ei = (0,0,2). Поскольку векторное произведение Е2 х Ез имеет отрицательный компонент z, разделяем многоугольник по линии вектора Е2. В уравнении прямой для этой стороны тангенс угла наклона равен 1, а координата точки пересечения с осью у равна —1. Далее определяется точка пересечения этой прямой с другими сторона- ми многоугольника, чтобы его можно было разделить на две части. Отрицатель- ных векторных произведений больше нет, поэтому оба новых многоугольника будут выпуклыми. Кроме того, вогнутый многоугольник можно разделить с помощью метода вра- щения. Перемещаясь по сторонам многоугольника в направлении против часовой стрелки, многоугольник разворачивается таким образом, чтобы каждая вершина V по очереди попадала в начало координат. Затем многоугольник разворачивается отно- сительно начала координат по часовой стрелке, так, чтобы следующая вершина V^+i лежала на оси х. Если при этом следующая вершина, Vt+2, находится ниже оси х, то многоугольник вогнутый. Тогда этот многоугольник разделяется по оси х, и обра- зуется два новых многоугольника. Затем эта проверка на выпуклость повторяется для обоих новых многоугольников. Вышеперечисленные шаги повторяются до тех пор, пока не будут проверены все вершины многоугольника. Способы вращения и смеще- ния положения объекта подробно описаны в главе 5. На рис. 3.45 иллюстрируется метод вращения для разделения вогнутого многоугольника.
206 Глава 3. Выходные графические примитивы Рис. 3.45. Разделение вогнутого многоугольника с помощью метода вращения. После перемещения вершины Vj в начало координат и поворота, при котором вершина V3 помещается на ось х, видим, что вершина V4 находится ниже оси х. Поэтому далее разделяем многоугольник по линии V2V3, которая совпадает с осью х РАЗДЕЛЕНИЕ ВЫПУКЛОГО МНОГОУГОЛЬНИКА НА НАБОР ТРЕУГОЛЬНИКОВ Если дан список вершин выпуклого многоугольника, его можно преобразовать в на- бор треугольников. Для этого сначала определяется любая последовательность из трех идущих подряд вершин, которые образуют новый многоугольник (треугольник). После этого из исходного списка вершин удаляется средняя вершина треугольника. Затем та же процедура выполняется с измененным списком вершин, и вырезается еще один треугольник. Формирование треугольников продолжается до тех пор, пока исходный список вершин многоугольника не уменьшится до трех, которые и опре- делят координаты вершин последнего треугольника этого набора. С помощью этого метода вогнутый многоугольник также можно разделять на набор треугольников, продолжая процесс до тех пор, пока три выбранные вершины на каждом этапе будут образовывать внутренний угол, не превышающий 180° (“выпуклый” угол). ПРОВЕРКИ “ВНУТРИ-СНАРУЖИ” В различных графических процессах часто приходится определять внутренние обла- сти объектов. Распознавание внутренней области такого простого объекта, как вы- пуклый многоугольник, окружность или сфера, — процесс, как правило, не сложный. Однако иногда приходится иметь дело с более сложными объектами. Например, мо- жет понадобиться описать такую сложную закрашенную фигуру с пересекающимися сторонами, как на рис. 3.46. В подобных ситуациях не всегда понятно, какие участки плоскости ху следует называть “внутренними”, а какие — “внешними”. Существует два общепринятых алгоритма определения внутренних областей плоских фигур — это правило четного-нечетного и правило ненулевого числа витков.
3.15. Закрашенные многоугольники 207 а) правило четного-нечетного б) правило ненулевого количества витков Рис. 3.46. Определение внутренних и внешних участков замкнутой ломаной линии, содержащей самопересекающиеся элементы Чтобы воспользоваться правилом четного-нечетного, которое еще называют пра- вилом проверки на четность, сначала мысленно проведем прямую линию, соединя- ющую любую точку Р с какой-то удаленной точкой за пределами области коорди- нат замкнутой ломаной линии. Затем сосчитаем количество точек пересечения этой прямой с прямолинейными отрезками. Если число отрезков, пересекающих линию, четное, тогда точка Р считается внутренней. В противном случае точка Р — внешняя. Чтобы найти точное количество точек пересечения с отрезками, нужно убедиться в том, что выбранная прямая не проходит через концы отрезков. На рис. 3.46, а пока- заны внутренние и внешние области, полученные в результате применения правила четного-нечетного для самопересекающейся замкнутой ломаной линии. Этой проце- дурой можно воспользоваться, например, для заполнения заданным цветом внутрен- ней области между двумя концентрическими окружностями или многоугольниками. Еще один способ определения внутренних областей — это правило ненулевого количества витков, при котором считается, сколько раз граница объекта “обора- чивается” (“наматывается”) вокруг отдельной точки в направлении против часовой стрелки. Это число называют количеством витков, а внутренние точки двухмерно- го объекта можно определить по тому, имеют ли они ненулевое количество витков. Правило ненулевого количества витков применяется таким образом: сначала коли- чество витков устанавливаем равным 0, а затем опять представляем себе прямую линию, соединяющую точку Р с удаленной точкой за пределами области координат объекта. Выбранная прямая не должна проходить ни через один конец отрезка. При перемещении по этой линии от точки Р до удаленной точки считается количество прямолинейных отрезков, принадлежащих объекту, которые пересекают эту опорную линию в каждом направлении. При каждом пересечении прямой с отрезком в на- правлении справа налево к количеству витков прибавляется 1, а при пересечении с отрезком, идущим слева направо, отнимается 1. Конечное значение числа витков, по-
208 Глава 3. Выходные графические примитивы еле учета всех пересечений с границами определяет относительное положение точки Р. Если число витков не равно нулю, то точка Р считается внутренней точкой. В про- тивном случае Р относится к внешним точкам. На рис. 3.46, б показаны внутренние и внешние области, определенные с помощью правила ненулевого числа витков для самопересекающейся, замкнутой ломаной линии. Для таких простых объектов, как многоугольники и окружности, правило ненулевого числа витков и правило четного- нечетного дают одинаковые результаты. Но для более сложных форм эти два метода могут дать различные внутренние и внешние области, как показано на рис. 3.46. Чтобы определить направление границы в точке пересечения, можно представить стороны объекта (или отрезки, образующие границу) в виде векторов, а также задать направление опорной линии. После этого для каждой стороны, с которой пересекает- ся опорная линия, вычисляется векторное произведение вектора и, направленного по опорной прямой от точки Р к удаленной точке, и вектора стороны объекта Е. Предпо- ложим, что дан двухмерный объект на плоскости ху. Тогда все векторные произведе- ния будут направлены либо по +z, либо по — z. Если компонент z векторного произве- дения и х Е для определенной точки пересечения положителен, то отрезок пересекает прямую справа налево, и к количеству витков прибавляется 1. В противном случае отрезок пересекает прямую слева направо, и от количества витков отнимается 1. Возможно, еще более простым способом определения направления в точке пере- сечения с границей является использование не векторного, а скалярного произведения векторов. Для этого нужно задать вектор, перпендикулярный вектору и и направлен- ный справа налево, если смотреть вдоль опорной прямой из точки Р в направлении вектора и. Если компоненты вектора и обозначить как (их, иу), компоненты вектора, перпендикулярного к вектору и, будут равны (—иу, их) (приложение А). Если теперь скалярное произведение этого перпендикулярного вектора и вектора, проложенного по границе, положительное, то направление пересечения — справа налево, и к ко- личеству витков нужно прибавить единицу. В противном случае граница пересекает опорную линию слева направо, и от количества витков отнимается единица. Правило ненулевого количества витков часто относит к внутренним некоторые области, которые при применении правила четного-нечетного считаются внешними, а в некоторых приложениях этот метод может быть еще более непредсказуемым. В общем случае, плоские фигуры могут состоять из множества не связанных между собой элементов, и в таком случае для определения внутренних и внешних областей можно использовать направление, которое задается для каждого набора не связанных между собой границ. К числу таких фигур относятся символы (буквы алфавита или знаки пунктуации), вложенные многоугольники, концентрические круги или эллип- сы. Для кривых линий правило четного-нечетного применяется в форме подсчета числа точек пересечения с кривой. Аналогично для правила ненулевого количества витков необходимо найти векторы, направленные по касательной к кривой в точках ее пересечения с опорной прямой, проходящей через точку Р.
3.15. Закрашенные многоугольники 209 Рис. 3.47. Закрашенная область, определенная как сегмент, для которого число витков положительно. Она представля- ет собой объединение двух областей, граница каждой из которых обходится против часовой стрелки Рис. 3.48. Закрашенная область, определенная как сегмент, для которого число витков больше 1. Она представляет со- бой область наложения двух фигур, граница каждой из ко- торых направлена против часовой стрелки Некоторые разновидности правила ненулевого количества витков позволяют несколько иначе определять внутренние области. Например, точку можно считать внутренней, если количество витков для нее положительно или если оно отрица- тельно. Кроме того, можно воспользоваться любым другим правилом и создать ряд закрашенных фигур. Иногда закрашенная область задается в виде комбинации двух областей с помощью логических (булевых) операций при использовании одной из раз- новидностей стандартного алгоритма ненулевого числа витков. Согласно этой схеме сначала для каждой из двух областей находятся простые, непересекающиеся границы. Тогда, если считать, что каждая граница обходится против часовой стрелки, объеди- нение двух областей будет состоять из точек с положительным количеством витков (рис. 3.47). Аналогично область пересечения двух фигур, границы которых обходятся против часовой стрелки, будет содержать только те точки, количество витков которых превышает 1, как показано на рис. 3.48. Чтобы задать закрашенную область, которая представляет собой разность двух областей, скажем, А — В, можно обвести область А границей, направленной против часовой стрелки, а область В — границей, направ- ленной по часовой стрелке. Тогда область разности (рис. 3.49) будет представлять собой набор всех точек, для которых число витков положительное.
210 Глава 3. Выходные графические примитивы Рис. 3.49. Закрашенная область, определенная как сегмент положительным числом витков. Она представляет собой разность А — В двух обла- стей, где граница области А обходится в положи- тельном направлении (против часовой стрелки), а граница области В — в отрицательном (по ча- совой стрелке) ТАБЛИЦЫ МНОГОУГОЛЬНИКОВ Как правило, объекты сцены описываются как наборы многоугольных граней по- верхностей. Фактически графические пакеты часто предлагают функции определения формы поверхности в виде сетки многоугольных участков. Описание каждого объ- екта включает информацию о координатах, с помощью которых задается геометрия многоугольных граней, и другие параметры поверхности, такие как цвет, прозрач- ность и светоотражающие свойства. Поскольку сведения о каждом многоугольнике являются входной информацией, данные размещаются в таблицах, которые исполь- зуются при последующей обработке, выводе на экран и выполнении различных опе- раций с объектами сцены. Эти информационные таблицы многоугольников можно объединить в две группы: геометрические таблицы и таблицы параметров. В гео- метрических информационных таблицах содержатся координаты вершин и парамет- ры, которые позволяют определить пространственную ориентацию многоугольных поверхностей. К информации о параметрах объекта относятся величины, определя- ющие степень прозрачности объекта, отражающую способность его поверхности и текстурные характеристики. Геометрическую информацию об объектах сцены удобно распределить по трем спискам: таблице вершин, таблице сторон и таблице граней поверхности граней. Ко- ординаты всех вершин объекта записываются в таблицу вершин. В таблице сторон содержатся ссылки на таблицу вершин, позволяющие определить вершины, принад- лежащие каждой стороне многоугольника. Наконец, в таблице граней поверхности содержатся ссылки на таблицу сторон, определяющие границы каждого многоуголь- ника. На рис. 3.50 эта схема иллюстрируется для двух соседних многоугольных граней на поверхности объекта. Кроме того, отдельным объектам и составляющим их мно- гоугольным граням можно присвоить специальные указатели на объект или грань, что облегчает обращение к ним. Запись геометрической информации в виде трех таблиц, как показано на рис. 3.50, обеспечивает удобный способ обращения к отдельным элементам (вершинам, сторо- нам и граням) каждого объекта. К тому же, так можно эффективно изображать объ-
3.15. Закрашенные многоугольники 211 Таблица сторон Таблица вершин ^2' х2’ У 2’ z2 У}- хЗ>Уз>Ъ И4: x4,y4,Z4 *5: х5> У5> <5 £2: £3: £4: £5: Еб- И, v2 У2Л3 у*у< У^З У^У, Таблица поверхностных граней Sf £р Е2, Е} $2- Е3, Е4, Е5, Е^ Рис. 3.50. Табличное пред- ставление геометрической информации для двух сосед- них многоугольных поверх- ностных граней, образован- ных шестью сторонами и пя- тью вершинами екты, используя для определения границ многоугольника информацию из таблицы сторон. Еще один вариант расположения данных — использовать только две таблицы: таблицу вершин и таблицу граней. Однако такая схема менее удобна, а при выводе на экран каркасной модели некоторые стороны могут изображаться дважды. Еще один вариант — использовать только таблицу поверхностных граней, но при этом дублиру- ется информация о координатах, поскольку для каждой многоугольной грани в явном виде записываются значения координат всех вершин. Кроме того, взаимосвязь меж- ду сторонами и гранями пришлось бы восстанавливать по списку вершин в таблице поверхностных граней. Чтобы ускорить извлечение информации, информационные таблицы, изображен- ные на рис. 3.50, дополняются некоторыми данными. Например, можно расширить таблицу сторон, включив в нее указатели на таблицу поверхностных граней, чтобы быстрее определять общие стороны многоугольников (рис. 3.51). Это особенно удоб- но для процедур визуализации, в которых затенение поверхности при переходе через ребро от одного многоугольника к другому должно изменяться плавно. Аналогичным образом для более быстрого доступа к данным можно расширить таблицу вершин, дополнив ее ссылками на соответствующие стороны. К дополнительной геометрической информации, которая обычно хранится в ин- формационных таблицах, относится тангенс угла наклона каждой стороны и коорди- натные границы сторон многоугольников, многоугольных граней и каждого объекта
212 Глава 3. Выходные графические примитивы Ei Ei- Из, H,S,,S2 £4: И3,И4,52 Ei И4,И5,52 Ei Из.ИЛ, Рис. 3.51. Таблица сторон поверхностей, изобра- женных на рис. 3.50, дополненная указателями на элементы таблицы многоугольных граней сцены в целом. Поскольку вводятся координаты вершин, можно рассчитать тангенс угла наклона каждой стороны, а также просмотреть все значения координат и опре- делить минимальные и максимальные значения х, у и z для отдельных линий и многоугольников. Информация о тангенсе угла наклона и ограничивающем прямо- угольнике необходима для последующей обработки, такой как визуализация поверх- ностей и идентификация видимых участков поверхности. Поскольку таблицы геометрических данных для сложных объектов и сцен мо- гут содержать очень большие списки вершин и сторон, важно проверить, чтобы все данные не противоречили друг другу и были полными. Когда задаются определения вершины, стороны или грани, особенно в интерактивных приложениях, возможны определенные ошибки при вводе данных, которые приведут к искаженному изоб- ражению объекта. Чем больше информации содержится в виде информационных таблиц, тем легче проверять ее на наличие ошибок. Следовательно, проверку оши- бок легче выполнять, если используются три информационные таблицы (таблица вершин, таблица сторон и таблица граней), поскольку такая схема предлагает наи- более полную информацию. Вот некоторые из проверок, которые могут выполнять графические пакеты: 1) каждая вершина в списке должна значиться крайней точкой по меньшей мере двух сторон; 2) каждая сторона должна быть частью по меньшей мере одного многоугольника; 3) все многоугольники должны быть замкнутыми; 4) у каждого многоугольника должна быть хотя бы одна сторона, общая с другими много- угольниками; 5) если в таблице сторон содержатся указатели на многоугольники, для каждой стороны, имеющей ссылку на многоугольник, должна быть соответствующая ссылка на эту сторону в таблице многоугольников. УРАВНЕНИЯ ПЛОСКОСТИ При создании изображения трехмерной сцены графическая система обрабатывает входные данные с помощью нескольких процедур. К этим процедурам относятся преобразования координат моделирования и внешних координат при прохождении конвейера наблюдения (viewing pipeline), определение видимых поверхностей, приме- нение стандартных процедур визуализации к отдельным граням поверхностей. Неко- торым из этих процедур необходима информация о пространственной ориентации элементов поверхностей. Эту информацию можно получить из координат вершин и уравнений, описывающих многоугольные поверхности.
3.15. Закрашенные многоугольники 213 Каждый многоугольник сцены лежит в какой-то бесконечной плоскости. Общий вид уравнения плоскости — Ax + By + Cz + D = 0, (3.59) где (х, у, z) — произвольная точка на этой плоскости, а коэффициенты А, В, С и D (которые называются параметрами плоскости) — константы, описывающие про- странственные свойства плоскости. Значения констант А, В, С и D можно найти, решив систему из трех уравнений плоскости, подставив в нее координаты трех некол- линеарных точек, лежащих в этой плоскости. Для этого можно выбрать три последо- вательные вершины выпуклого многоугольника (24, у±, Zi), (х2, у2, z2) и (жз, уз, Z3), взятые против часовой стрелки, и решить следующую систему линейных уравнений плоскости относительно отношений A/D, В/D и C/D'. (A/D)xk + (B/D)yk + (C/D)zk = -1, k = 1,2,3. (3.60) Решение этой системы уравнений можно выразить через детерминанты, воспользо- вавшись правилом Крамера. 1 У1 21 XI 1 21 А = 1 У2 22 в = 1 22 1 Уз 23 х3 1 23 (3.61) У1 1 2?1 yi Z] с = У2 1 D = - Х2 У2 22 (3.62) хз уз 1 Х3 УЗ 23 записать выражения для коэффициентов плоскости: Раскрыв детерминанты, можно А = yi(z2 - z3) + y2(z3 - 21) + y3(z3 - z2), В = zi(t2 - ar3) + 22(2:3 - ti) + z3(ti - rr2), C = xj (y2 - уз) + 2?2(уз - У1) + а?з(У1 - Уг), D = -X^y2Z3 - y3z2) - Т2(уз21 - У1£3) - Жз(У122 - У221). Эти выражения справедливы для любых трех точек, в том числе и для тех, для которых D — 0. При вводе данных о координатах вершин многоугольника и другой необходимой информации значения А, В, С и D для каждой многоугольной грани можно найти и записать вместе с другой информацией о многоугольнике.
214 Глава 3. Выходные графические примитивы Может случиться так, что точки, координаты которых определяют многоуголь- ную грань, не лежат в одной плоскости. Эта проблема решается разделением грани на набор треугольников. Можно также найти плоскость, аппроксимирующую данный список вершин. Один из способов расчета аппроксимирующей плоскости — разбить список вершин на поднаборы, каждый из которых содержит три вершины, и найти параметры плоскости А, В, С, D для каждого поднабора. Затем параметры аппрок- симирующей плоскости находятся как среднее значение всех полученных парамет- ров плоскостей. Другой подход — спроектировать список вершин на координатные плоскости. После этого параметр А берется пропорциональным площади проекции многоугольника на плоскость yz, параметр В — пропорциональным площади про- екции на плоскость xz, а параметр С — пропорциональным площади проекции на плоскость ху. Отметим, что этот метод проекций часто используется в приложениях, связанных с построением хода лучей. ПЕРЕДНИЕ И ЗАДНИЕ ГРАНИ МНОГОУГОЛЬНИКА Поскольку обычно многоугольные поверхности, с которыми приходится иметь дело в графических приложениях, представляют собой внешнюю оболочку объекта, необхо- димо уметь различать две стороны каждой поверхности. Та сторона многоугольника, которая направлена внутрь объекта, называется задней, а видимая, или внешняя, сто- рона является передней. Определение положения точек в пространстве относительно передней и задней сторон многоугольника является основной задачей многих графи- ческих алгоритмов, например, алгоритма определения видимых частей объекта. Каж- дый многоугольник лежит в бесконечной плоскости, разделяющей пространство на две части. Говорят, что любая точка, не принадлежащая этой плоскости, которая видна с лицевой стороны поверхности многоугольника, находится перед плоскостью (или снаружи), следовательно, за пределами объекта. Любая точка, которая видна с обрат- ной стороны многоугольника, находится за плоскостью (или внутри). Точка, которая находится за всеми плоскостями поверхностей многоугольника, находится внутри объекта. Нужно помнить о том, что классификация “внутри-снаружи” производится относительно плоскости, содержащей многоугольник, в то время, как предыдущие проверки “внутри-снаружи”, выполняемые с помощью правила четного-нечетного или ненулевого количества витков, относились к внутренней области, окруженной некоторой двухмерной границей. Чтобы определить положения точек в пространстве относительно многоугольных граней объекта, можно воспользоваться уравнением плоскости. Для любой точки (х, у, z), не принадлежащей плоскости с параметрами А, В, С, D, имеем Ax + By + Cz + D=£Q.
3.15. Закрашенные многоугольники 215 Рис. 3.52. Уравнение плоскости заштрихованной многоугольной поверхности единичного куба — х — 1 = О N=(H, В, С) Рис. 3.53. Вектор нормали N для плоскости, которая описывается уравне- х нием Ах + By + Cz + D = 0, перпендикулярен плоскости, а его декартовы компоненты — (А, В, С) Таким образом, по знаку (плюс или минус) выражения Ах + By + Cz + D можно определить, находится ли данная точка за поверхностью многоугольника, лежащего в этой плоскости, или перед ней: если Ax + By + Cz-\-D<0, то точка (х, у, z) находится за плоскостью; если Ах + В у + С Z + D > О, то точка (х, у, z) находится перед плоскостью. Эти проверки с помощью неравенств справедливы для правосторонних декартовых систем координат, в которых параметры плоскости А, В, С и D вычисляются с помощью координат, выбранных строго против часовой стрелки, если смотреть на поверхность в направлении от передней стороны к задней. Например, на рис. 3.52 любая внешняя точка (перед плоскостью заштрихованного многоугольника) удовле- творяет неравенству х — 1 > 0, в то время, как значение координаты х для любой внутренней точки (за плоскостью) меньше 1. Ориентацию многоугольной поверхности в пространстве можно описать с помо- щью вектора нормали к плоскости, содержащей этот многоугольник, как показано на рис. 3.53. Этот вектор нормали к поверхности перпендикулярен плоскости, а его декартовы компоненты — (А, В, С), где параметры А, В и С — это коэффициенты плоскости, рассчитанные по формулам (3.63). Вектор нормали указывает направление от внутренней стороны плоскости к наружной, т.е. от задней стороны многоугольника к передней.
216 Глава 3. Выходные графические примитивы В качестве примера расчета компонентов вектора нормали многоугольника, по которому можно также вычислить параметры плоскости, возьмем три вершины за- штрихованной грани единичного куба на рис. 3.52. Эти точки выбираются в направ- лении против часовой стрелки, если смотреть на куб снаружи в направлении начала координат. Затем координаты этих вершин в указанном порядке подставляются в формулы (3.63), откуда находятся коэффициенты плоскости: А = 1, В = О, С = О, D = — 1. Таким образом, вектор нормали для этой плоскости — N = (1,0, 0), и его направление совпадает с положительным направлением оси х. Следовательно, вектор нормали направлен изнутри куба наружу и перпендикулярен плоскости х = 1. Компоненты вектора нормали можно также найти, вычисляя векторное произ- ведение. Предположим, что дана грань поверхности, имеющая вид выпуклого мно- гоугольника, и правосторонняя декартова система координат. Снова выберем любые три вершины Vi, V2 и V3, взятые против часовой стрелки, если смотреть в направ- лении снаружи внутрь объекта. Сформируем два вектора, один от точки V i до точки V2, а второй — от точки Vi до точки V3 и найдем N как векторное произведение этих двух векторов: N = (V2-V1)x(V3-V1). (3.64) В результате получим значения параметров плоскости А, В и С. После этого можно найти значение параметра D, подставив полученные величины и координаты одной из вершин многоугольника в уравнение плоскости (3.59) и решив его относительно D. Уравнение плоскости можно представить в векторной форме через нормаль N и положение Р любой точки на этой плоскости: N«P = -£>. (3.65) Для выпуклого многоугольника параметры плоскости можно найти и с помощью век- торного произведения векторов двух соседних сторон. Для вогнутого многоугольника можно таким образом выбрать три вершины, чтобы два названных вектора образовы- вали угол, меньше 180°. В противном случае можно взять вектор, обратный по знаку их векторному произведению, что даст вектор нормали для поверхности многоуголь- ника с правильным направлением. 3.16. ФУНКЦИИ ЗАКРАШИВАНИЯ МНОГОУГОЛЬНИКОВ В OpenGL За одним исключением, все процедуры OpenGL описания закрашенных многоуголь- ников похожи на функции описания точки или ломаной линии. Функция glVertex используется для ввода координат одной вершины многоугольника, а весь много- угольник описывается с помощью списка вершин, расположенного между парой
3.16. Функции закрашивания многоугольников в OpenGL 217 Рис. 3.54. Многоугольник со сложной внутренней областью, ко- торую нельзя задать с помощью одного списка вершин команд glBegin/glEnd. Однако есть еще одна дополнительная функция, с помо- щью которой можно изобразить прямоугольник и которая имеет совершенно дру- гой формат. По умолчанию внутренняя часть многоугольника изображается одним цветом, который определяется по текущим установкам цвета. С помощью опций (которые описываются в следующей главе) многоугольник можно заполнить узором, также стороны многоугольника можно сделать прямолинейными границами вокруг закра- шенной внутренней области. Существует шесть различных символьных констант, которые используются в качестве аргумента функции glBegin при описании за- крашенной области многоугольника. Эти шесть постоянных примитивов позволяют изображать один закрашенный многоугольник, набор несоединенных или набор со- единенных закрашенных многоугольников. В пакете OpenGL заполненная область должна задаваться в виде выпуклого мно- гоугольника. Таким образом, список вершин для закрашенного многоугольника дол- жен содержать по меньшей мере три вершины, там не должно быть пересекающихся сторон, а все внутренние углы многоугольника должны быть меньше 180°. Закра- шенная область в виде одного многоугольника может задаваться с помощью одного только списка вершин, и в этом случае невозможны конфигурации, содержащие от- верстия во внутренней области многоугольника, например, подобные представленной на рис. 3.54 (такую фигуру можно описать с помощью двух наложенных друг на друга выпуклых многоугольников). У каждого заданного многоугольника есть две стороны: передняя и задняя. В пакете OpenGL цвет заполнения и другие параметры можно задавать для каждой стороны отдельно, а определение передней (задней) стороны необходимо как в двух-, так и в трехмерных стандартных процедурах визуализации. Следовательно, верши- ны многоугольника должны задаваться в направлении против часовой стрелки, если смотреть на многоугольник “снаружи”, и таким образом определяется передняя сто- рона этого многоугольника.
218 Глава 3. Выходные графические примитивы 50 Рис. 3.55. Изображение закрашенного квадрата, полученное с помощью функции glRect Ч----1------1----Н 50 100 150 200 Поскольку графические изображения очень часто содержат закрашенные пря- моугольные области, пакет OpenGL предлагает специальную функцию изображе- ния прямоугольника, которая непосредственно обрабатывает спецификации вершин в плоскости ху. В некоторых версиях OpenGL приведенная ниже процедура может оказаться более эффективной, чем построение закрашенного прямоугольника с по- мощью функции glVertex. glRect* (xl, yl, x2, y2); Один угол этого прямоугольника находится в точке с координатами (xl, yl), а противоположный угол прямоугольника — в точке с координатами (а;2, у2). Индексы функции glRect обозначают тип данных и то, выражаются ли координаты в ви- де элементов массива. Эти индексы — i (для целых чисел), s (для коротких целых чисел), f (для чисел с плавающей запятой), d (для чисел двойного точности) и v (для векторов). Прямоугольник изображается таким образом, что его стороны парал- лельны координатным осям плоскости ху. В качестве примера приведем следующую команду, с помощью которой определяется квадрат, изображенный на рис. 3.55. glRecti (200, 100, 50, 250); Если задавать значения координат этого прямоугольника в виде массива данных, то такой же самый квадрат можно получить с помощью следующего кода. int vertexl [ ] = 200, 100; int vertex2 [ ] = 50, 250; glRectiv (vertexl, vertex2); Если прямоугольник изображается с помощью функции glRect, то стороны многоугольника прокладываются между вершинами в таком порядке: (xl, yl), (х2, yl), (х2, у2), (xl, у2), а затем обратно к первой вершине. Таким образом, в нашем примере список вершин формируется в направлении по часовой стрелке. Во многих двухмерных приложениях различие между передней и задней стороной многоуголь-
3.16. Функции закрашивания многоугольников в OpenGL 219 ника несущественно. Однако, если действительно требуется приписать передней и задней сторонам прямоугольника различные свойства, тогда в приведенном примере нужно изменить порядок следования двух вершин, чтобы вершины были расположе- ны в направлении против часовой стрелки. В главе 4 будет обсуждаться еще один способ, с помощью которого можно поменять местами переднюю и заднюю стороны многоугольника. Остальные шесть примитивов закрашенных многоугольников в пакете OpenGL задаются с помощью символьной константы в функции glBegin вместе со спис- ком команд glVertex. С помощью константы OpenGL GL_POLYGON можно полу- чить изображение одного закрашенного многоугольника, подобного показанному на рис. 3.56, а. Для этого примера предположим, что дан список из шести точек, обозна- ченных от pl до рб, которые представляют собой координаты вершин двухмерного многоугольника, заданных в направлении против часовой стрелки. Каждая из этих точек представлена массивом координат (х, у). glBegin (GL_POLYGON); glVertex2iv (pl); glVertex2iv (p2); glVertex2iv (p3); glVertex2iv (p4); glVertex2iv (p5); glVertex2iv (p6); glEnd ( ) ; В списке вершин многоугольника должно быть как минимум три вершины. В противном случае ничего изображено не будет. Если поменять порядок точек в списке вершин из предыдущего кода и восполь- зоваться другой константой примитива GL_TRIANGLES, то получится два отдельных закрашенных треугольника, показанных на рис. 3.56, б. glBegin (GL_TRIANGLES); glVertex2iv (pl); glVertex2iv (p2); glVertex2iv (p6); glVertex2iv (p3); glVertex2iv (p4); glVertex2iv (p5); glEnd ( ); В этом случае первые три точки обозначают вершины одного треугольника, следую- щие три точки задают следующий треугольник, и т.д. Для каждого закрашенного тре- угольника вершины задаются в направлении против часовой стрелки. Набор не соеди- ненных между собой треугольников изображается с помощью этой константы прими- тива в том случае, если никакие вершины не будут повторяться. Если список содержит менее трех вершин, ничего изображено не будет, а если количество заданных вершин не будет кратно трем, то последние две или одна точка просто не будут учитываться.
220 Глава 3. Выходные графические примитивы шин: а) один выпуклый закрашенный многоугольник, полученный с помощью константы GL_POLYGON; б) два не соединенных между собой треугольника, полученные с помощью кон- станты GL_TRIANGLES; в) четыре соединенных треугольника, полученные с помощью кон- станты GL_TRIANGLE_STRIP; г) четыре соединенных треугольника, полученные с помощью константы GL_TRIANGLE_FAN Путем еще одной перестановки вершин в списке и замены константы примитива на GL_TRIANGLE_STRIP можно получить изображение соединенных треугольни- ков, показанное на рис. 3.56, в. glBegin (GL_TRIANGLE_STRIP); glVertex2iv glVertex2iv glVertex2iv glVertex2iv glVertex2iv glVertex2iv (pl); (p2); (p6); (p3); (p5) ; (p4) ; glEnd ( ); Предположив, что значения координат в списке из N вершин не повторяются, можно получить N — 2 треугольников. Ясно, что количество вершин должно быть N > 3, иначе ничего изображено не будет. В этом примере N = 6, и получаем четы- ре треугольника. У всех последовательных треугольников есть одна общая сторона
3.16. Функции закрашивания многоугольников в OpenGL 221 с предыдущим треугольником, так что нужно убедиться в том, что список вершин образован таким образом, чтобы изображение было реальным. Каждая вершина из списка, которая идет после первых двух вершин, задает еще один треугольник. Сле- довательно, первые три вершины должны указываться в направлении против часовой стрелки, если смотреть на переднюю (внешнюю) поверхность треугольника. После этого каждый последующий треугольник (набор из трех вершин в таблицах мно- гоугольников) формируется в направлении против часовой стрелки. Для этого все точки п из списка вершин обрабатываются в порядке п = 1, п = 2, ..., п = N — 2, и выбирается порядок соответствующего набора из трех вершин согласно четности порядкового номера точки п. Если п — нечетное, то вершины треугольника в таб- лице многоугольника будут располагаться в таком порядке: п, п + 1, п + 2. Если п четное, то вершины треугольника будут перечисляться в порядке п + 1, п, п + 2. В предыдущем примере для первого треугольника (n = 1) список вершин должен иметь вид (pl, р2, рб). Для второго треугольника (п = 2) вершины перечисляются в таком порядке: (рб, р2, рЗ). Порядок вершин для третьего треугольника (п = 3) — (рб, рЗ, р5). А четвертый треугольник (тг = 4) описывается в таблице многоугольника с помощью вершин, стоящих в порядке (р5, рЗ, р4). Еще один способ построения набора соединенных треугольников — воспользо- ваться методом “веера”, показанным на рис. 3.56, г, где все треугольники имеют одну общую вершину. Такое расположение треугольников можно получить с помощью константы примитива GL_TRIANGLE_FAN и такого порядка шести вершин: (Р1); (р2); (рЗ); (р4); (р5) ; (рб) ; glBegin (GL_TRIANGLE_FAN); glVertex2iv glVertex2iv glVertex2iv glVertex2iv glVertex2iv glVertex2iv glEnd ( ); Для N вершин снова получим N - 2 треугольников, если предположить, что коорди- наты вершин не повторяются, при этом в списке должно быть не меньше трех вершин. Кроме того, вершины должны быть заданы в соответствующем порядке, чтобы мож- но было правильно определить переднюю и заднюю стороны каждого треугольника. Первое значение в списке (в данном случае, pl) — это вершина всех треугольников веера. Если снова пронумеровать треугольники и перечисленные точки как п = 1, п = 2, ..., п = N — 2, то вершины треугольника п в таблицах многоугольников будут перечисляться в порядке 1, п + 1, п + 2. Следовательно, треугольник 1 зада- ется с помощью списка вершин (pl, р2, рЗ); вершины треугольника 2 перечисляются в порядке (pl, рЗ, р4); вершины треугольника 3 задаются в порядке (pl, р4, р5); а список вершин треугольника 4 выглядит так: (pl, р5, рб).
222 Глава 3. Выходные графические примитивы Рис. 3.57. Изображение закрашенных четырех- угольников с помощью списка из координат вось- ми вершин: а) два не соединенных между со- бой четырехугольника, полученные с помощью константы GL_QUADS; б) три соединенных четы- рехугольника, полученные с помощью константы GL_QUAD_STRIP Кроме функций примитивов для общего вида треугольников и многоугольников пакет OpenGL предлагает средства описания двух типов четырехугольников (много- угольников с четырьмя сторонами). С помощью константы примитива GL_QUADS и следующего списка из восьми вершин, которые задаются как двухмерные массивы координат, можно получить изображение, показанное на рис. 3.57, а. glBegin (GL_QUADS); glVertex2iv (pl); glVertex2iv (p2); glVertex2iv (p3); glVertex2iv (p4); glVertex2iv (p5); glVertex2iv (p6); glVertex2iv (p7); glVertex2iv (p8); glEnd ( ); Первые четыре точки определяют вершины одного четырехугольника, следующие четыре точки описывают следующий четырехугольник, и т.д. Для каждого закрашен- ного четырехугольника вершины задаются против часовой стрелки. Если координаты вершин не повторяются, то получается изображение набора не соединенных меж- ду собой четырехугольных закрашенных фигур. Для этого примитива необходимо задать как минимум четыре вершины. В противном случае ничего изображено не будет. Кроме того, если число заданных вершин не будет кратно четырем, то лишние значения просто не будут приниматься во внимание.
3.16. Функции закрашивания многоугольников в OpenGL 223 Переставив вершины в списке из предыдущего примера и заменив константу примитива на GL_QUAD_STRIP, можно получить набор соединенных четырехуголь- ников, показанных на рис. 3.57, б. glBegin (GL_QUAD_STRIP); glVertex2iv (pl); glVertex2iv (p2); glVertex2iv (p4); glVertex2iv (p3); glVertex2iv (p5); glVertex2iv (p6); glVertex2iv (p8); glVertex2iv (p7); glEnd ( ) ; Четырехугольник задается для каждой пары вершин, идущей после первых двух вершин в списке, поэтому вершины нужно перечислять таким образом, чтобы каждый многоугольник имел правильный порядок вершин (против часовой стрелки). Для списка из N вершин получается у — 1 четырехугольников, при условии, что N > 4. Если N не кратно 4, то любые лишние координаты в списке учтены не будут. Эти закрашенные многоугольники и перечисленные вершины можно пронумеровать как п - 1, /г = 2, ..., п = у — 1. Тогда вершины четырехугольника п в таблице многоугольника будут перечислены в таком порядке (по номерам вершин): 2тг — 1, 2тг, 2тг+2, 2п + 1. В данном примере N — 8, поэтому получается 3 четырехугольника. Таким образом, первый четырехугольник (?г = 1) задается с таким порядком вершин (pl, р2, рЗ, р4). У второго четырехугольника (тг = 2) порядок вершин — (р4, рЗ, рб, р5). А порядок вершин третьего четырехугольника (п = 3) — (р5, рб, р7, р8). Во многих графических пакетах криволинейные поверхности изображаются с помощью аппроксимирующих плоских граней. Это объясняется тем, что уравнения плоскости линейны, а обработка линейных уравнений выполняется намного быстрее, чем обработка квадратных уравнений или уравнений других типов кривых. Поэтому OpenGL и другие пакеты предлагают примитивы многоугольников, которыми можно аппроксимировать криволинейные поверхности. Объекты моделируются с помощью сетки многоугольников, а информация о геометрических данных и данные о парамет- рах устанавливаются таким образом, чтобы можно было обрабатывать многоуголь- ные грани. В пакете OpenGL для этой цели можно использовать такие примитивы, как полоса треугольников, веер треугольников и полоса четырехугольников. Высо- кокачественные графические системы, способные изображать миллион или больше закрашенных многоугольников (как правило, треугольников) в секунду, включая при- ложения, связанные с наложением текстур на поверхности и специальных эффектов освещения, имеют встроенные аппаратные средства визуализации многоугольников.
224 Глава 3. Выходные графические примитивы Рис. 3.58. Куб с единичной длиной ребра Рис. 3.59. Значения индексов для массива pt, соответ- ствующие координатам вершин куба, изображенного на рис. 3.58 Несмотря на то что корневая библиотека OpenGL принимает только выпуклые многоугольники, библиотека OpenGL Utility (GLU) предлагает функции, позволяю- щие работать с вогнутыми многоугольниками и другими невыпуклыми объектами с линейными границами. Существует набор стандартных процедур библиотеки GLU для мозаичного представления многоугольников, которые позволяют преобразовать такие фигуры в набор треугольников, треугольные сетки, веера треугольников и пря- молинейные отрезки. Разложив эти объекты на составляющие, их можно обрабаты- вать с помощью основных функций OpenGL.
3.17. Массивы вершин в OpenGL 225 3.17. МАССИВЫ ВЕРШИН В OpenGL Несмотря на то что до сих пор в приведенных примерах использовалось относитель- но немного координатных точек, реальное описание сцены, состоящей из нескольких объектов, может оказаться намного сложнее. Чтобы проиллюстрировать такую ситуа- цию, рассмотрим сначала описание одного очень простого объекта: единичного куба, изображенного на рис. 3.58, координаты которого (для простоты дальнейших рассуж- дений) заданы в виде целых чисел. Прямой метод определения координат вершин заключается в использовании массива с двумя индексами, такого как GLint points [8] [3] = 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, О, О, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1 ; Или же можно сначала определить тип данных координат точки в трехмерном про- странстве, а затем задавать координаты каждой вершины как элементы массива с одним индексом, например, так. typedef GLint vertex3 [3]; vertex3 pt [8] = 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1 ; Далее необходимо определить переднюю сторону каждой из шести поверхностей объекта. Для этого нужно шесть раз вызвать функцию glBegin (GL_POLYGON) или функцию glBegin (GL_QUADS). В любом случае следует убедиться в том, что вершины каждой стороны перечислены против часовой стрелки, если смотреть на наружную поверхность куба. В следующем фрагменте кода все поверхности куба задаются как четырехугольники, при этом используется вызов функции для переда- чи значений индексов стандартным процедурам OpenGL. На рис. 3.59 перечислены индексы массива pt, соответствующие координатам вершин куба. void quad (GLint nl, GLint n2, GLint n3, GLint n4){ glBegin (GL_QUADS); glVertex3iv (pt [nl]); glVertex3iv (pt [n2]); glVertex3iv (pt [n3]); glVertex3iv (pt [n4]); glEnd ( ); } void cube ( ){ quad (6, 2, 3, 7); quad (5, 1, 0, 4) ; quad (7, 3, 1, 5) ; quad (4, 0, 2, 6); quad (2, 0, 1, 3); quad (7, 5, 4, 6);
226 Глава 3. Выходные графические примитивы Таким образом, для описания каждой поверхности необходимо шесть функций OpenGL, а всего есть шесть поверхностей, которые нужно описать. Если прибавить описание цвета и других параметров, то в нашей программе для изображения куба легко можно будет насчитать сто или даже больше обращений к функциям, а для сцен, состоящих из нескольких сложных объектов, потребуется намного больше функций. Как видно из предыдущего примера с кубом, для полного описания сцены может понадобиться задать сотни или даже тысячи значений координат. К тому же, суще- ствуют различные параметры свойств и параметры визуализации, которые нужно за- давать для определенных объектов. Таким образом, для описания объекта или сцены необходимо огромное количество обращений к функциям, что увеличивает требуе- мые ресурсы системы и замедляет выполнение графических программ. Со сложными изображениями связана даже еще большая проблема — поверхности объектов (таких как куб, изображенный на рис. 3.58), как правило, имеют общие вершины. При ис- пользовании тех методов, которые описывались до сих пор, эти общие точки придется задавать не один раз. Чтобы частично решить эти проблемы, в пакете OpenGL предлагается механизм уменьшения числа обращений к функциям, необходимого для обработки информа- ции о координатах. С помощью массива вершин можно таким образом упорядочить информацию, необходимую для описания сцены, чтобы требовалось всего несколько вызовов функций. Для этого необходимо выполнить следующие действия. 1. Вызвать функцию glEnableClientState (GL_VERTEX_ARRAY), чтобы ак- тивизировать возможность создания массива вершин в OpenGL. 2. Воспользоваться функцией glVertexPointer для задания местоположения и формата данных для координат вершин. 3. Изобразить сцену с помощью стандартной процедуры, такой как glDrawEle- ments, которая может обрабатывать несколько примитивов с помощью неболь- шого числа вызовов функций. В качестве примера используем массив pt, заданный ранее для куба, и выполним эти три пункта в следующем фрагменте программы. glEnableClientState (GL_VERTEX_ARRAY); glVertexPointer (3, GL_INT, 0, pt); GLubyte vertlndex [ ] = (6, 2, 3, 7, 5, 1, 0, 4, 7, 3, 1, 5, 4, 0, 2, 6, 2, 0, 1, 3, 7, 5, 4, 6); glDrawElements (GL_QUADS, 24, GL_UNSIGNED_BYTE, vertlndex); С помощью первой команды glEnableClientState (GL_VERTEX_ARRAY) ак- тивизируется возможность (в данном случае создания массива вершин) со стороны клиента системы клиент-сервер. Поскольку данные о рисунке хранятся у клиента (на машине, запускающей главную программу), то массив вершин также должен нахо-
3.17. Массивы вершин в OpenGL 227 диться там. Как отмечалось в главе 2, сервер (например, рабочая станция) отдает команды и выводит рисунок на экран. Разумеется, одна и та же машина может быть и клиентом, и сервером. Возможность пакета OpenGL создавать массив вершин от- ключается с помощью следующей команды. glDisableClientState (GL_VERTEX_ARRAY); После этого с помощью функции glVertexPointer задается местоположение и формат координат вершин объекта. Первый параметр функции glVertexPointer (в данном примере это 3) обозначает число координат, которое задается для каждой вершины. Тип данных для координат вершин описывается с помощью символьной константы OpenGL, которая служит вторым параметром этой функции. В нашем при- мере тип данных — GL_INT. Другие типы данных описываются с помощью символь- ных констант GL_BYTE, GL_SHORT, GL_FLOAT и GL_DOUBLE. С помощью третьего параметра задается смещение (в байтах) между соседними вершинами. Данный ар- гумент позволяет использовать в одном массиве различные типы информации, такие как координаты и цвета. Поскольку в нашем примере задается только информация о координатах, этому параметру смещения присваивается значение 0. Последний пара- метр в функции glVertexPointer указывает массив вершин, в котором содержатся значения координат. Все индексы вершин куба записываются в массив vert Index. Все они явля- ются индексами массива pt, соответствующими значениям координат вершин. Дан- ный список индексов применяется в качестве последнего параметра функции gl- DrawElements, а затем он же используется примитивом GL_QUADS в качестве пер- вого параметра при изображении набора четырехугольных поверхностей куба. Вто- рой параметр обозначает количество элементов в массиве vertlndex. Поскольку для четырехугольника нужно знать только четыре вершины, а мы задаем 24, функция glDrawElements изображает еще одну сторону куба, образованную следующими четырьмя вершинами, и так до тех пор, пока не будут обработаны все 24 вершины. Таким образом, в результате вызова одной этой функции будет получено изображение всех граней куба. Третий параметр функции glDrawElements сообщает тип значе- ний индексов. Поскольку в нашем примере индексы представляют собой небольшие целые числа, тип данных описывается как GL_UNSIGNED_BYTE. При обозначении индексов могут использоваться еще два типа данных — GL_UNSIGNED_SHORT и GL_UNSIGNED_INT. Чтобы упростить обработку описания сцены, в массив вершин кроме значений координат можно ввести некоторую дополнительную информацию. В этом масси- ве можно указать коды цвета и другие параметры объекта. Доступ к ним можно получить с помощью функции glDrawElements. Для повышения эффективности можно также объединять различные массивы, а способы реализации таких массивов параметров рассматриваются в следующей главе.
228 Глава 3. Выходные графические примитивы 3.18. —I- *тах Рис. 3.60. Изображение пиксельного массива размером п на т в координатной области экрана ПРИМИТИВЫ ПИКСЕЛЬНЫХ МАССИВОВ Кроме прямых линий, многоугольников, окружностей и других примитивов, в гра- фических пакетах часто встречаются стандартные процедуры изображения фигур, которые задаются с помощью прямоугольного массива кодов цвета. Прямоугольную сетку узора можно получить путем оцифровки (сканирования) фотографии или дру- гого рисунка или создания фигуры с помощью графической программы. После этого каждый код цвета в массиве переносится в одно или несколько положений пиксе- лей на экране. Как отмечалось в главе 2, пиксельный массив кодов цвета обычно называют пиксельным отображением. К параметрам пиксельного массива можно отнести ссылки на матрицу цветов, размер матрицы, а также положение и размер области экрана, занятой кодами цвета. На рис. 3.60 приведен пример отображения пиксельного массива цветов в одной области экрана. Еще один тип пиксельного массива получается, когда каждому элементу матри- цы присваивается значение 0 или 1. В таком случае массив является просто би- товым отображением, которое иногда еще называют маской, подразумевая, что пикселю присваивается (или с ним объединяется) или не присваивается предопре- деленный цвет.
3.19. Функции пиксельных массивов в OpenGL 229 3.19. ФУНКЦИИ ПИКСЕЛЬНЫХ МАССИВОВ В OpenGL В пакете OpenGL есть две функции, которые можно использовать для описания фигур или узоров, заданных с помощью прямоугольного массива. Одна из них — битовое отображение, а другая — пиксельное отображение. Кроме того, в пакете OpenGL предлагается несколько стандартных процедур сохранения, копирования и различных операций с массивами пиксельных значений. ФУНКЦИЯ БИТОВОГО ОТОБРАЖЕНИЯ OpenGL Массив бинарного узора задается с помощью функции glBitmap (width, height, хО, yO, xOffset, yOffset, bitshape); Параметры width и height в этой функции обозначают соответственно количе- ство столбцов и строк в массиве bitShape. Каждому элементу массива bitShape присваивается значение 1 или 0. Значение 1 указывает на то, что соответствующий пиксель следует изображать заранее заданным цветом. В противном случае битовое отображение не изменяет значения пикселя. (Как вариант, значение 1 может указы- вать, что заданный цвет следует наложить на код цвета, записанный в буфере кадра в этом положении.) Параметры хО и уО определяют точку, которую следует рассмат- ривать как “начало координат” прямоугольного массива. Эта точка отсчета задается относительно левого нижнего угла массива bitShape, а значения хО и уО могут быть как положительными, так и отрицательными. Кроме того, нужно задать поло- жение буфера кадра, с которого начинается наложение данного узора. Это положение называется текущим растровым положением, и изображение битового массива за- ключается в переносе его начала координат (хО, уО) в текущее растровое положение. После изображения битового массива значения, присваиваемые параметрам xOff- set и yOffset, используются как смещения координат для обновления текущего растрового положения в буфере кадра. Значения координат хО, yO, xOffset и yOffset, а также текущее растровое положение сохраняются в виде чисел с плавающей запятой. Конечно, битовое отобра- жение применяется в пикселях с целочисленными координатами. Однако координаты в виде чисел с плавающей запятой позволяют размещать битовое отображение через произвольные интервалы, что очень полезно в некоторых приложениях, таких как формирование строк символов с помощью битовых узоров. Чтобы задать координаты текущего растрового положения, применяется следую- щая процедура: glRasterPos* ( )
230 Глава 3. Выходные графические примитивы ; о ! 1 м и 1 1 ч ч 1 1 1 1 ' 1 1,1: 1 1 1 1 1 , 1 1 1 г Ц 11 к ’.1 И * 1 0x08 0х1С । ОхЗЕ ( 0x7F I OxFF 0x00 0x00 0X00 Oxoo 0x80 1 <• 1,1 <1 1 1 1 И !0 ) ‘1 п 1 : 1 0 1! ч п Н О I OxlC 0x00 : 1т h 1 1 ’ 1 1) II и 0 Н <1 1 0X1C 0X00 * и ч .> 1! 1 ; 1 м I. и и (1 и 1 Oxlc 0X00 .. и •’ 1 ! 1 , 1 (1 ‘ i t S ц U И j Oxlc 0X00 1‘ 1 1 ' 1 М !» 0 1! п п ! oxic 0x00 Рис. 3.61. Битовый узор, представленный в виде массива из 10 строк и 9 столбцов, записывается с помощью 8-битовых блоков из 10 строк с 16 значениями в каждой строке Параметры и индексы аналогичны тем, которые используются в функции glVer- tex. Таким образом, текущее растровое положение задается во внешних координатах, а затем преобразуется в экранные координаты с помощью изменения точки наблю- дения. В использованных двухмерных примерах координаты текущего растрового положения можно задавать непосредственно в целочисленных экранных координа- тах. По умолчанию значение текущего растрового положения совпадает с началом отсчета (0, 0, 0) внешней системы координат. Цветом битового отображения является текущий цвет в момент вызова команды glRasterPos. Любые последующие изменения цвета не влияют на битовый массив. Каждая строка прямоугольного битового массива записывается в виде чисел, размер которых кратен 8 бит, где бинарные данные организованы в виде 8-битовых символов без знака. Однако фигуру также можно описать с помощью сетки любого другого удобного размера. В качестве примера на рис. 3.61 показан битовый узор, заданный с помощью сетки из 10 строк и 9 столбцов, где бинарные данные задаются с помощью 16 бит в каждой строке. Когда этот узор накладывается на пиксели в буфере кадра, все значения битов за пределами девятого столбца игнорируются. Чтобы наложить битовый узор, изображенный на рис. 3.61, на определенный участок буфера кадра, воспользуемся следующим кодом. GLubyte bitshape [20] = 0x1с, 0x00, 0x1с, 0x00, Oxlc, 0x00, Oxlc, 0x00, Oxlc, 0x00, Oxff, 0x80, 0x7f, 0x00, 0x3e, 0x00, Oxlc, 0x00, 0x08, 0x00; glPixelStorei (GL_UNPACK_ALIGNMENT, 1); /* Устанавливается режим хранения пикселей. */
3.19. Функции пиксельных массивов в OpenGL 231 glRasterPos2i (30, 40); glBitmap (9, 10, 0.0, 0.0, 20.0, 15.0, bitShape); Значения массива bitShape задаются построчно, начиная с нижнего края прямо- угольной сетки узора. Затем устанавливается режим хранения битового отображения с помощью стандартной процедуры OpenGL glPixelStorei. Значение 1 в этой функции указывает на то, что заданные значения следует располагать по границам байтов. С помощью функции glRasterPos устанавливается текущее растровое по- ложение с координатами (30, 40). Наконец, функция glBitmap указывает, что бито- вый узор задается в виде массива bitShape, и что этот массив состоит из 9 столбцов и 10 строк. Координаты точки отсчета этого узора — (0.0, 0.0), т.е. она находится в левом нижнем углу сетки. На данном рисунке иллюстрируется смещение координат на величину (20.0, 15.0), хотя в данном примере оно никак не используется. ФУНКЦИЯ ПИКСЕЛЬНОГО ОТОБРАЖЕНИЯ OpenGL Узор, который определяется как массив цветовых значений, накладывается на блок пикселей в буфере кадра с помощью функции glDrawPixels (width, height, dataFormat, dataType, pixMap); Как и выше, параметры width и height показывают соответственно количество столбцов и строк массива pixMap. Параметр dataFormat — это константа OpenGL, которая показывает, каким образом задаются значения элементов массива. Например, с помощью константы GL_BLUE можно задать синий цвет для всех пикселей или определить три цветовых компонента в таком порядке: синий, зеленый, красный, воспользовавшись константой GL_BGR. Возможен целый ряд других спецификаций цвета, но более подробно выбор цвета будет рассматриваться в следующей главе. Такие константы OpenGL, как GL_BYTE, GL_INT или GL_FLOAT, присваиваются в качестве значения параметра dataType и обозначают тип данных кодов цвета мас- сива. Левый нижний угол этого массива цветов отображается в текущее растровое положение, которое задается с помощью функции glRasterPos. В качестве при- мера приводится следующая команда, строящая пиксельное отображение, которое задается как массив кодов цвета в массиве RGB размером 128 на 128. glDrawPixels (128, 128, GL_RGB, GL_UNSIGNED_BYTE, colorshape); Поскольку OpenGL позволяет использовать несколько буферов, массив кодов цвета можно вставить в отдельный буфер, указав этот буфер в качестве цели процедуры glDrawPixels. В одних буферах записываются коды цвета значения, а в других — иная информация о пикселях. В буфере глубины, например, записываются расстояния от точки наблюдения до объекта (глубпны), а в буфере шаблонов хранятся узоры, об- разованные границами объектов сцены. Для выбора одного из этих двух буферов еле-
232 Глава 3. Выходные графические примитивы дует присвоить параметру dataFormat процедуры glDrawPixels значения либо GL_DEPTH_COMPONENT, либо GL_STENCIL_INDEX. Для этих буферов пиксельный массив пришлось бы задавать либо с помощью значений глубины, либо информации о шаблонах. Более подробно эти буферы рассматриваются в последующих главах. В пакете OpenGL есть четыре буфера цвета, которые можно использовать для обновления экрана. Два буфера цвета образуют лево-правую пару сцены при созда- нии стереоскопических изображений. Для каждого стереоскопического буфера есть передне-задняя пара, используемая в анимации с двойным буфером. В отдельных версиях OpenGL может не поддерживаться либо стереоскопическая визуализация, либо двойная буферизация, а иногда и то, и другое сразу. Если не поддерживаются ни стереоскопические эффекты, ни двойная буферизация, тогда существует только один буфер регенерации, который спроектирован как передний левый буфер цвета. Этот буфер регенерации используется по умолчанию в том случае, если двойная буфериза- ция невозможна или ее нет вообще. Если же двойная буферизация возможна, тогда по умолчанию используется либо задний левый, либо задний правый буфер, в зависимо- сти от текущего состояния стереоскопической проекции. Кроме того, поддерживается целый ряд вспомогательных буферов цвета, которые можно использовать в любых целях, не связанных с регенерацией, например, при сохранении рисунка, который позже будет копироваться в буфер регенерации для создания изображения. Один цветовой или вспомогательный буфер, а также комбинация буферов цвета для хранения пиксельного отображения выбираются с помощью следующей команды. glDrawBuffer (buffer); Значением параметра buffer может быть символьная константа OpenGL, которая обозначает один или несколько “рабочих” буферов. Например, один буфер можно вы- брать с помощью команды GL_FRONT_LEFT, GL_FRONT_RIGHT, GL_BACK_LEFT или GL_BACK_RIGHT. Можно выбрать оба передних буфера, воспользовавшись ко- мандой GL_FRONT, или оба задних буфера — с помощью команды GL_BACK. При этом предполагается, что стереоскопическая визуализация активизирована. В про- тивном случае две предыдущие символьные константы будут относиться к одному буферу. Аналогично с помощью команд GL_LEFT или GL_RIGHT можно назначить либо левую, либо правую пару буферов. Можно также выбрать все доступные буферы цвета, воспользовавшись константой GL_FRONT_AND_BACK. Вспомогательный бу- фер выбирается с помощью константы GL_AUXk, где к — целое число от 0 до 3, хотя в некоторых версиях OpenGL может быть больше четырех вспомогательных буферов. РАСТРОВЫЕ ОПЕРАЦИИ OpenGL Кроме записи массива значений пикселей в буфер, можно извлекать блок значений из буфера или копировать такой блок в другую область буфера. Кроме того, можно выполнять ряд других операций с пиксельным массивом. В общем случае, понятие
3.19. Функции пиксельных массивов в OpenGL 233 растровая операция обозначает любую функцию, которая применяется для обработки пиксельного массива. Растровую операцию, при которой массив значений пикселей перемещается с одного места в другое, называют еще переносом блока значений пик- селей. Для двухуровневой системы такая операция называется переносом битовой строки, особенно если эти функции реализуются на аппаратном уровне. Для много- уровневой системы перенос блоков иногда называют переносом пиксельной строки. Для выбора прямоугольного блока пикселей в заданном наборе буферов исполь- зуется следующая функция. glReadPixels (xmin, ymin, width, height, dataFormat, dataType, array); Левый нижний угол прямоугольного блока, к которому осуществляется доступ, на- ходится в точке экрана с координатами (xmin, ymin). Параметры width, height, dataFormat и dataType такие же, как и для процедуры glDrawPixels. Тип информации, которая сохраняется в параметре array, зависит от выбранного буфе- ра. Можно выбрать либо буфер глубины, либо буфер шаблонов, присвоив параметру dataFormat значение GL_DEPTH_COMPONENT либо GL_STENCIL_INDEX. Особая комбинация буферов цвета или дополнительный буфер выбирается для использования процедурой glReadPixels с помощью такой функции. glReadBuffer (buffer); Символьные константы для описания одного или нескольких буферов не отли- чаются от констант процедуры glDrawBuf fer, за исключением того, что нельзя выбрать все четыре буфера цвета. По умолчанию выбирается передняя лево-правая пара или только передний правый буфер, в зависимости от состояния стереоскопиче- ской визуализации. Кроме того, блок заданных пикселей можно скопировать из одного места в другое в пределах набора буферов OpenGL с помощью следующей процедуры. glCopyPixels (xmin, ymin, width, height, pixelvalues); Нижний левый угол этого блока находится в точке экрана с координатами (xmin, ymin), а параметрам width и height присваиваются положительные целочислен- ные значения, обозначающие соответственно количество столбцов и строк, которые следует скопировать. Параметру pixelvalues присваивается значение GL_COLOR, GL_DEPTH или GL_STENCIL, указывающее тип информации, которую мы хотим ско- пировать: коды цвета, значения глубины или значения шаблонов. Таким образом, блок значений пикселей копируется из буфера-источника в буфер назначения, при этом его нижний левый угол переносится в текущее растровое положение. Буфер-источник выбирается с помощью команды glReadBuffer, а буфер назначения задается ко- мандой glDrawBuf fer. Как копируемая, так и целевая области должны полностью лежать в области координат экрана.
234 Глава 3. Выходные графические примитивы Для достижения различных эффектов при помещении блока пикселей в буфер с помощью команд glDrawPixels или glCopyPixels можно объединять поступа- ющие значения со старыми значениями буфера. Например, можно выполнить такие логические операции, как И, ИЛИ и исключающее ИЛИ, объединяющие два блока значений пикселей. В пакете OpenGL для выбора побитовой логической операции для объединения поступающих кодов цвета со значениями пикселей назначения ис- пользуются такие функции. glEnable (GL_COLOR_LOGIC_OP); glLogicOp (logicOp); Параметру logicOp можно присвоить значение из набора символьных констант, в том числе GL_AND, GL_OR или GL_XOR. Кроме того, или поступающие значения битов, или значения битов назначения могут задаваться в инвертированной форме (значения 0 и 1 меняются местами). Константа GL_COPY_INVERTED используется для того, чтобы превратить обращенные поступающие значения битов в правильные, а затем заменить значения битов назначения инвертированными значениями поступа- ющих битов. С помощью функции GL_INVERT можно также просто инвертировать значения битов назначения без последующей замены их поступающими значениями. Различные операции инверсии также можно объединять с логическими операциями И, ИЛИ и исключающим ИЛИ. К числу других возможностей можно отнести очист- ку всех битов назначения до значения О (GL_CLEAR) или присвоение всем битам назначения значения 1 (GL_SET). По умолчанию значением параметра процедуры glLogicOp является GL_COPY, при котором значения битов назначения просто за- меняются поступающими значениями. Существуют и другие процедуры OpenGL для выполнения различных действий с пиксельными массивами, которые обрабатываются с помощью функций glDraw- Pixels, glReadPixels и glCopyPixels. Например, процедуры glPixel- Transfer и glPixelMap можно использовать для смещения или выравнивания кодов цвета, значений глубины или значений шаблонов. Мы еще вернемся к операци- ям с пикселями в последующих главах при исследовании других вопросов компью- терной графики и графических пакетов. 3.20. ПРИМИТИВЫ символов Графические изображения часто содержат такую текстовую информацию, как подпи- си на графиках и таблицах, вывески на зданиях или надписи на машинах, а также общая информация в приложениях, связанных с моделированием и визуализацией. В большей части графических пакетов имеются стандартные процедуры для создания символов. В некоторых системах предлагается широкий выбор функций для изоб- ражения символов, тогда как в других системах существует только минимальная поддержка создания символов.
3.20. Примитивы символов 235 Рис. 3.62. Буква “В”, представленная в виде узо- ра битового отображения размером 8 на 8 (па- нель а) и с помощью контура, состоящего из прямолинейных отрезков и участков кривых ли- ний (панель б) Буквы, цифры и другие символы могут иметь разный размер и изображаться в различных стилях. Общий вид стиля набора (или семейства) символов называется на- чертанием. Сегодня существуют тысячи различных начертаний, доступных разным компьютерным приложениям. Примеры нескольких широко распространенных на- чертаний — Courier, Helvetica, New York, Palatino и Zapf Chancery. Изначально словом шрифт называли набор литых металлических форм символов определенного размера и формата, такой как Courier Italic 10 pt (пунктов) или Palatino Bold 12 pt. Высота всех символов шрифта 14 pt составляет приблизительно 0,5 см. Другими словами, 72 пункта приблизительно равны 2,54 см (1 дюйму). Сегодня слова шрифт и начер- тание часто используются как взаимозаменяемые, поскольку в большинстве случаев уже никто не печатает с помощью литых металлических форм. Начертания (или шрифты) можно разделить на две большие группы: с засечка- ми и без засечек. У шрифта с засечками есть небольшие черточки, или штрихи, в конце главных штрихов знаков, тогда как при начертании без засечек таких штри- хов нет. Например, текст в этой книге набран шрифтом с засечками (Cm-super). Но это предложение напечатано шрифтом без засечек (Arial). Шрифт с засечками, как правило, более удобочитаемый', т.е. при таком шрифте легче читать большие фрагменты текста. С другой стороны, в шрифтах без засечек легче распознаются отдельные символы. По этой причине шрифты без засечек называют более разбор- чивыми. Поскольку символы без засечек быстро распознаются, эти шрифты хороши для обозначений и коротких названий. Кроме того, шрифты классифицируются по тому, являются ли они моноширин- ными или пропорциональными. При моноширинном начертании все символы имеют одинаковую ширину. Для пропорциональных шрифтов характерно изменение шири- ны символов. Для записи компьютерных шрифтов используют два различных представления. Простой способ описания формы символа определенного начертания — это задать узор из бинарных значений прямоугольной решетки. В таком случае набор симво- лов называют растровым шрифтом. Иногда набор символов в виде битовых матриц
236 Глава 3. Выходные графические примитивы называют еще битовым шрифтом. Другой, более гибкий, способ — описать форму символов с помощью прямолинейных отрезков и участков кривых линий, например так, как это делается в шрифте PostScript. В этом случае набор символов называют эс- кизным или штриховым шрифтом. На рис. 3.62 проиллюстрированы эти два способа представления символов. Когда узор, изображенный на рис. 3.62, а накладывается на область буфера кадра, то биты со значением 1 обозначают те пиксели, которые следу- ет изображать в заданном цвете. Чтобы изобразить символ, форма которого показана на рис. 3.62, б, внутреннюю площадь этого эскиза символа следует рассматривать как закрашенную область. Растровые шрифты самые простые для описания и изображения: нужно только перенести сетку символа в буфер кадра. Однако в общем случае для записи растровых шрифтов необходимо больше памяти, поскольку в кэш шрифта нужно записывать каждую версию (размер и формат). Можно создавать шрифты разного размера и различные их версии, такие как полужирный шрифт или курсив, из одного набора растрового шрифта, но чаще всего это не дает хороших результатов. Увеличить или уменьшить размер растрового символа можно только на величину, кратную размеру пикселя. Чтобы увеличить размер символа в два раза, необходимо удвоить количество пикселей в битовом массиве, а это еще больше увеличивает неровность его краев. В отличие от растровых, размер эскизных символов можно увеличивать без иска- жения формы символа. Кроме того, для записи эскизных шрифтов требуется меньше памяти, поскольку для каждой версии не нужен отдельный кэш шрифта. Полужирный шрифт, курсив или шрифты различных размеров можно создавать путем изменения определений кривых, образующих контуры символов. Однако для обработки эскиз- ных шрифтов нужно больше времени, поскольку для них необходимо преобразовать стандарты развертки в буфер кадра. Существует целый ряд возможных функций, позволяющих изображать символы. В некоторых графических пакетах предлагается функция, которая воспринимает в качестве входа любую строку символов и координаты из буфера кадра, указывающее то место, где должна начинаться эта строка. Другой тип функции — это функция, ко- торая служит для изображения отдельного символа в одной или нескольких заданных позициях. Поскольку такая стандартная процедура для изображения символов удоб- на для того, чтобы показывать метки на схемах сети или строить по точкам график дискретных данных, то символы, которые изображаются с помощью этой стандарт- ной процедуры, иногда называют маркировочными символами или полимаркерами по аналогии с примитивом ломаной линии (polyline). Кроме стандартных символов, в качестве маркировочных символов часто используются такие специальные фигу- ры, как точки, кружкн и крестики. На рис. 3.63 показан график дискретного набора данных, где в качестве маркировочного символа используется звездочка.
3.21. Функции изображения символов в OpenGL 237 У 100 -- 50-- 41 59 85 ПО 121 149 94 43 74 59 89 122 х у 1---------------1------ 50 100 150 0 Рис. 3.63. График набора значений, построенный с помощью полимаркера Геометрические описания символов задаются во внешних координатах, так, как это делается для других примитивов, а затем с помощью преобразований визуа- лизации эта информация переводится в экранные координаты. Растровый символ описывается с помощью прямоугольной матрицы бинарных значений и исходного положения этой матрицы. Затем это исходное положение переносится в заданную позицию в буфере кадра. Эскизный символ задается с помощью набора координат точек, которые соединяются прямолинейными отрезками или участками кривых ли- ний, и исходного положения, которое переносится в заданную точку буфера кадра. Исходное положение может задаваться либо для отдельного эскизного символа, либо для строки символов. В общем случае, стандартные процедуры для символов позво- ляют создавать как двух-, так и трехмерные изображения символов. 3.21. ФУНКЦИИ ИЗОБРАЖЕНИЯ СИМВОЛОВ В OpenGL Основная библиотека OpenGL предлагает только низкоуровневую поддержку изобра- жения отдельных символов и текстовых строк. В явном виде любой символ можно задать в виде битового массива, как в примере, показанном на рис. 3.61, и запи- сать набор растровых символов как список шрифта. После этого строка символов изображается — выбранная последовательность битовых массивов из списка шрифта переносится на соответствующие места в буфере кадра. Однако в OpenGL Utility Toolkit (GLUT) существует несколько предопределенных наборов символов. Поэтому нам не нужно создавать собственные шрифты в виде би- товых матриц, если, конечно, не требуется изобразить текст таким шрифтом, которого нет в библиотеке GLUT. Вообще, в библиотеке GLUT содержатся стандартные проце- дуры для изображения как растровых, так и эскизных шрифтов. Растровые шрифты GLUT визуализируются с помощью функции OpenGL glBitmap, а эскизные шриф- ты создаются с помощью контуров в виде ломаной линии (GL_LINE_STRIP). Растровый символ GLUT можно получить с помощью функции glutBitmapCharacter (font, character);
238 Глава 3. Выходные графические примитивы Здесь параметру font присваивается значение символьной константы GLUT, кото- рая указывает на определенный набор начертаний, а параметру character при- сваивается либо код ASCII, либо отдельный символ, который мы хотим изобра- зить. Таким образом, чтобы изобразить прописную букву “А”, можно восполь- зоваться либо значением 65 кода ASCII, либо обозначением 'А'. Аналогич- но значение кода 66 эквивалентно обозначению ' В', код 97 соответствует про- писной букве 'а', код 98 соответствует 'Ь', и так далее. Возможны шриф- ты как с постоянной шириной символов, так и с пропорциональными промежут- ками. Моноширинный шрифт можно выбрать, присвоив параметру font значе- ние GLUT_BITMAP_8_BY_13 или GLUT_BITMAP_9_BY_15. А пропорциональный шрифт размером 10 pt можно выбрать с помощью команд GLUT_BITMAP_TIMES_ ROMAN_10 или GLUT_BITMAP_HELVETICA_10. Возможен и шрифт Times-Roman размером 12 pt, а также шрифты Helvetica размером 12 и 18 pt. Каждый символ, созданный с помощью функции glutBitmapCharacter, изображается так, что начало координат (нижний левый угол) битового массива на- ходится в текущем растровом положении. После того как битовый массив символа загружается в буфер регенерации, к координате х текущего растрового положения добавляется смещение, равное ширине символа. В качестве примера изобразим тек- стовую строку, состоящую из 36 растровых символов. Это можно сделать с помощью следующего кода. glRasterPosition2i (х, у); for (к =0; к < 36; к++) glutBitmapCharacter (GLUT_BITMAP_9_BY_15, text [к]); Символы изображаются в том цвете, который был задан до выполнения функции glutBitmapCharacter. Эскизный символ изображается путем вызова следующей функции. glutStrokeCharacter (font, character); Для этой функции параметру font можно присвоить значение GLUT_STROKE_ ROMAN, чтобы изобразить пропорциональный шрифт, или GLUT_STROKE_MONO_ ROMAN, чтобы представить моноширинный шрифт. Размер и положение этих симво- лов можно контролировать с помощью операций преобразований (глава 5), которые вызываются перед выполнением процедуры glutStrokeCharacter. После изоб- ражения каждого символа автоматически прибавляется прирост по координате, так что место, в котором будет изображаться следующий символ, находится справа от текущего символа. Текстовые строки, полученные с помощью эскизных шрифтов, являются частью геометрического описания двух- или трехмерных сцен, поскольку они состоят из геометрических линий. Таким образом, их можно рассматривать из различных точек, те. их можно без каких-либо искажений сжимать, растягивать или преобразовывать каким-то другим способом. Однако они визуализируются медлен- нее, чем растровые шрифты.
3.23. Таблицы отображений в OpenGL 239 3.22. ДЕЛЕНИЕ РИСУНКА НА ЧАСТИ В некоторых графических библиотеках имеются стандартные процедуры для опи- сания рисунка как набора именованных частей и выполнения различных действий с отдельными частями рисунка. С помощью этих функций можно создавать, редактиро- вать, удалять или перемещать отдельные части рисунка независимо от остальных его составляющих. Кроме того, это свойство графических пакетов можно использовать при иерархическом моделировании (глава 14), в котором описание объекта задается как древовидная структура, разделенная на уровни, которые описывают составляю- щие части объекта. Части одного рисунка называют по-разному. В некоторых графических пакетах они называются структурами, тогда как в других пакетах их называют сегментами или объектами. К тому же, допустимые операции с этими частями сильно отличают- ся при переходе от одного пакета к другому. В пакетах для моделирования, например, предоставляется широкий выбор операций, которые можно использовать для опи- сания элементов рисунка и выполнения различных действий над ними. С другой стороны, в любой графической библиотеке всегда можно структурировать объект и работать с элементами рисунка с помощью процедурных элементов, существующих в таких языках высокого уровня, как C+t 3.23. ТАБЛИЦЫ ОТОБРАЖЕНИЙ В OpenGL Иногда удобнее или эффективнее хранить описание объекта (или любой другой на- бор команд OpenGL) в виде именованной последовательности операторов. В OpenGL это можно сделать с помощью структуры, которая называется таблицей отображе- ний. Один раз создав таблицу отображений, к ней можно обращаться множество раз при выполнении различных операций, связанных с созданием изображений. В сети таблица отображений, описывающая сцену, хранится на машине-сервере, поэтому не нужно передавать команды из этой таблицы каждый раз, когда следует показать данную сцену. Кроме того, команды записанные в таблице отображений, можно со- хранить и выполнить либо позже, либо немедленно. Таблицы отображений особенно удобны для иерархического моделирования, где сложный объект можно описать как набор простых составляющих. СОЗДАНИЕ И НАИМЕНОВАНИЕ ТАБЛИЦ ОТОБРАЖЕНИЙ В OpenGL Чтобы создать таблицу отображений, необходимо заключить набор команд OpenGL в скобки из пары функций glNewList/glEndList. Например, так. glNewList (listID, listMode); glEndList ( );
240 Глава 3. Выходные графические примитивы Такая структура образует таблицу отображений, для которой параметру listID, обозначающему имя таблицы, присваивается положительное целое значение. Па- раметру listMode присваивается значение символьной константы OpenGL (либо GL_COMPILE, либо GL_COMPILE_AND_EXECUTE). Если требуется сохранить таб- лицу для ее дальнейшего выполнения, используется команда GL_COMPILE. В про- тивном случае команды выполняются сразу же, как попадают в таблицу, кроме того, позже можно повторно выполнить этот же набор команд. После создания таблицы отображений находятся значения выражений, которые содержат такие параметры, как координаты и коды цвета, чтобы в таблице храни- лись только значения параметров. Любые последующие изменения этих парамет- ров не оказывают влияния на таблицу. Поскольку значения таблицы отображения нельзя изменить, в нее нельзя включать такие команды OpenGL, как указатели на список вершин. Можно создать любое количество таблиц отображений, при этом для выполне- ния набора команд вызывается идентификатор таблицы. Более того, одна таблица отображения может находиться внутри другой. Однако если таблице присваивает- ся идентификатор, который уже задействован, то новая таблица заменит старую, у которой было такое же имя. Поэтому, чтобы какая-то таблица не потерялась из-за случайного повторения ее идентификатора, можно поручить пакету OpenGL само- стоятельно присваивать имена таблицам. listID = glGenLists (1); Этот оператор присваивает переменной listID один незадействованный иден- тификатор (положительное целое число). Чтобы получить диапазон незадействован- ных целочисленных идентификаторов таблиц аргумент функции glGenLists (1) заменяется каким-то другим положительным числом. Например, если вызвать функ- цию glGenLists ( 6), то запишется последовательность из шести следующих друг за другом целых чисел, а первое значение из этого списка идентификаторов бу- дет присвоено переменной listID. Если возникает ошибка, или система не может выдать запрошенный диапазон следующих друг за другом целых чисел, функция glGenLists возвращает значение 0. Таким образом, перед тем, как воспользовать- ся идентификатором, предложенным стандартной процедурой glGenLists, нужно убедиться в том, что это не 0. Несмотря на то что список идентификаторов создается с помощью функции glGenList, можно сделать независимый запрос к системе, и она определит, ис- пользовалось ли данное целое число в качестве имени таблицы. Чтобы сделать это, вызывается следующая функция. gllsList (listID);
3.23. Таблицы отображений в OpenGL 241 Значение GL_TRUE возвращается в том случае, если значение переменной list ID — это целое число, которое уже использовалось в качестве названия таблицы отобра- жения. В противном случае функция gllsList возвращает значение GL_FALSE. РЕАЛИЗАЦИЯ ТАБЛИЦ ОТОБРАЖЕНИЙ В OpenGL Чтобы реализовать одну таблицу отображения, следует воспользоваться оператором glCallList (listID); В следующем фрагменте кода иллюстрируется создание и реализация таблицы отоб- ражения. Сначала создается таблица отображения, в которой содержится описание правильного шестиугольника, заданного в плоскости ху с помощью набора из шести равноудаленных друг от друга вершин, лежащих на окружности с центром в точке (200, 200) и радиусом 150. Затем вызывается функция glCallList, с помощью которой изображается шестиугольник. const double TWO_PI = 6.2831853; GLuint regHex; GLdouble theta; GLint x, y, k; /* Создается таблица отображения для правильного шестиугольника. * Вершинами шестиугольника являются шесть равноудаленных друг * от друга точек, лежащих на окружности. */ regHex = glGenLists (1); // Таблице отображения // присваивается идентификатор. glNewList (regHex, GL_COMPILE); glBegin (GL_POLYGON) ; for (k =0; k < 6; k++) { theta = TWO_PI * k / 6.0; x = 200 + 150 * cos (theta); у = 200 + 150 * sin (theta); glVertex2i (x, y); 1 glEnd ( ); glEndList ( ); glCallList (regHex); Несколько таблиц отображений можно реализовать с помощью следующих двух операторов. glListBase (offsetvalue); glCallLists (nLists, arrayDataType, listIDArray);
242 Глава 3. Выходные графические примитивы Целое число таблиц, которые мы хотим реализовать, присваивается параметру nLists, а параметр listIDArray — это массив, состоящий из идентификаторов таблиц отображений. В общем случае, массив listIDArray может содержать лю- бое количество элементов, при этом недействительные идентификаторы таблиц отоб- ражений просто игнорируются. Кроме того, элементы массива listIDArray могут задаваться в различных форматах данных, а параметр arrayDataType используется для указания типа данных, например, GL_BYTE, GL_INT, GL_FLOAT, GL_3_BYTES или GL_4_BYTES. Чтобы определить идентификатор таблицы отображений, следует прибавить значение элемента массива listIDArray к целому значению параметра offsetvalue, которое задается в функции glListBase. По умолчанию значение параметра offsetvalue равно 0. Этот механизм позволяет составлять группы связанных таблиц отображений, идентификаторы которых образуются из символьных названий или кодов. Харак- терный пример — набор, образующий шрифт, где каждый идентификатор таблицы отображений — это ASCII-код символа. Для описания нескольких наборов-шрифтов используется параметр offsetvalue из функции glListBase, с помощью кото- рого можно получить определенный шрифт, описанный в массиве listIDArray. УДАЛЕНИЕ ТАБЛИЦЫ ОТОБРАЖЕНИЙ В OpenGL Удалить набор следующих друг за другом таблиц отображений можно, вызвав следу- ющую функцию. glDeleteLists (startID, nLists); Параметр startID дает значение идентификатора первой таблицы отображений, а с помощью параметра nLists задается количество таблиц, которые следует удалить. Например, с помощью оператора glDeleteLists (5, 4); удаляется четыре таблицы отображений с идентификаторами 5, 6, 7 и 8. Значение идентификатора, соответствующего несуществующей таблице отображения, игнори- руется. 3.24. ФУНКЦИЯ ИЗМЕНЕНИЯ ФОРМЫ ОКНА ИЗОБРАЖЕНИЯ В OpenGL В программе, приводившейся для знакомства с OpenGL (раздел 2.9), рассматрива- лись функции задания исходного окна изображения. Однако после создания рисунка часто возникает необходимость воспользоваться указателем мыши и перетянуть окно
3.24. Функция изменения формы окна изображения в OpenGL 243 Рис. 3.64. Окно изображения, полученное с помощью программы-примера, иллюстриру- ющей применение функции изменения фор- мы окна изображения в другое место на экране или изменить его размер. Изменение размеров окна изображения может привести к изменению его характеристического отношения и, следовательно, к искажению изначальной формы изображенных объектов. Для компенсации изменения размеров окна изображения в библиотеке GLUT существует следующая процедура glutReshapeFunc (winReshapeFcn); Эту функцию можно включить в процедуру main нашей программы, вместе с дру- гими процедурами GLUT, и она будет активизироваться при каждом изменении раз- меров окна изображения. Аргументом этой функции GLUT является название проце- дуры, которой сообщаются новые значения ширины и высоты окна изображения. На основе новых размеров можно изменить параметры проектирования, а также выпол- нить любые другие операции, такие как изменение цвета окна изображения. Кроме того, новые значения высоты и ширины можно сохранить, чтобы использовать в других процедурах данной программы. В качестве примера приведем программу, иллюстрирующую построение про- цедуры winReshapeFcn. В функцию изменения формы входит команда glLoa- dldentity, так что любые предыдущие значения проекционных параметров не влияют на образование новых проекций. С помощью этой программы изображается правильный шестиугольник, который рассматривался в разделе 3.23. Несмотря на то что центр шестиугольника (который совпадает с центром окружности) в этом примере задается через параметры окна изображения, на положение самого шестиугольника
244 Глава 3. Выходные графические примитивы не влияют никакие изменения размера окна изображения. Это происходит потому, что шестиугольник задается в рамках таблицы отображения, а в таблице записы- ваются только исходные координаты центра. Если потребуется изменить положение шестиугольника при изменении размеров окна изображения, нужно будет описать ше- стиугольник другим способом или изменить систему координат окна изображения. Результат выполнения этой программы показан на рис. 3.64. ♦include <GL/glut.h> ♦include <math.h> ♦include <stdlib.h> const double TWO_PI = 6.2831853; /* Исходные размеры окна изображения. */ GLsizei winWidth = 400, winHeight = 400; GLuint regHex; class screenPt { private: GLint x, y; public: /* По умолчанию точке присваиваются координаты (0, 0).*/ screenPt ( ) { х = у = 0; } void setCoords (GLint xCoord, GLint yCoord) { x = xCoord; у = yCoord; } GLint getx ( ) const { return x; ) GLint gety ( ) const { return y; } }; static void init (void) { screenPt hexVertex, circCtr; GLdouble theta; GLint k; /* Задаются координаты центра окружности. */ circCtr.setCoords (winWidth / 2, winHeight / 2); glClearColor (1.0, 1.0, 1.0, 0.0); // Цвет окна изображения выбирается белым. /* Задается таблица отображений для красного правильного * шестиугольника. Вершинами шестиугольника являются шесть * равноудаленных друг от друга точек, лежащих на окружности. */
3.24. Функция изменения формы окна изображения в OpenGL 245 regHex = glGenLists (1); // Таблице отображения присваивается идентификатор. glNewList (regHex, GL_COMPILE); glColor3f (1.0, 0.0, 0.0); // Цветом заполнения шестиугольника назначается красный. glBegin (GL_POLYGON); for (k = 0; k < 6; k++) { theta = TWO_PI * k / 6.0; hexVertex.setCoords (circCtr.getx ( ) + 150 * cos (theta), circCtr.gety ( ) + 150 * sin (theta)); glVertex2i (hexVertex.getx(), hexVertex.gety ( )); ) glEnd ( ); glEndList ( ); ) void regHexagon (void) { glClear (GL_COLOR_BUFFER_BIT); glCallList (regHex); glFlush ( ); ) void winReshapeFcn (int newWidth, int newHeight) { glMatrixMode (GL_PROJECTION); glLoadldentity ( ); gluOrtho2D (0.0, (GLdouble) newWidth, 0.0, (GLdouble) newHeight); glClear (GL_COLOR_BUFFER_BIT); ) void main (int argc, char** argv) { glutlnit (&argc, argv); glutlnitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutlnitWindowPosition (100, 100); glutlnitWindowSize (winWidth, winHeight); glutCreateWindow ("Пример функции изменения формы и таблицы отображений"); init ( ) ; glutDisplayFunc (regHexagon); glutReshapeFunc (winReshapeFcn); glutMainLoop ( ); )
246 Глава 3. Выходные графические примитивы 3.25. РЕЗЮМЕ Графические примитивы, которые рассматриваются в этой главе, представляют собой основные средства формирования рисунков из отдельных точек, прямых линий, кри- вых, закрашенных многоугольников, матричных структур и текста. Примитивы опи- сываются путем задания их геометрических описаний в декартовой внешней системе координат. Примеры изображений, полученных с помощью графических примитивов, показаны на рис. 3.65 и 3.66. Три способа, с помощью которых можно расположить пиксели вдоль прямой ли- нии, — алгоритм ЦДА, алгоритм Брезенхема и метод средней точки для прямой, — эквивалентны и являются наиболее эффективными. Коды цвета пикселей, располо- женных вдоль прямой линии, рационально записываются в буфер кадра путем по- следовательного определения адресов в памяти. Любой из алгоритмов построения прямой линии можно адаптировать для параллельного выполнения, разделив линию на участки и распределив эти участки между доступными процессорами. Преобразование стандартов развертки для окружностей и эллипсов можно эф- фективно и точно выполнять с помощью методов средней точки, учитывая при этом симметрию кривой. Другие конические сечения (параболы и гиперболы) можно строить с помощью аналогичных методов. Сплайновые кривые, которые являются кусочно-непрерывными полиномами, широко распространены в анимации и авто- матизированном проектировании. Параллельное выполнение алгоритмов построения кривых можно реализовать аналогично тому, как реализуется параллельная обработка прямых линий. Чтобы учесть тот факт, что изображаемые прямые и кривые линии имеют конеч- ную ширину, можно подобрать такой размер пикселей, при котором размеры изобра- женных объектов совпадали бы с заданными геометрическими размерами. Это можно сделать с помощью схемы адресации, при которой координаты пикселя определяются по положению его левого нижнего угла, или подбирая длину линий. Закрашенная область — это плоский участок, который заполняется одним цветом или цветным узором. В большей части графических пакетов закрашенные прими- тивы — это многоугольники. Однако в общем случае можно задать закрашенную область с произвольной границей. Чаше всего графические системы воспринимают закрашенные области только в виде выпуклых многоугольников. В этом случае за- крашенную область в виде вогнутого многоугольника можно изобразить, разделив ее на ряд выпуклых многоугольников. Самыми простыми фигурами для закрашивания являются треугольники, поскольку каждая строка развертки пересекает строго две стороны треугольника (если, конечно, строка развертки не проходит через одну из вершин треугольника). Для определения внутренних точек плоского многоугольника можно восполь- зоваться правилом четного-нечетного. Используются и другие методы определения внутренних областей объектов, в частности, объектов с неправильными, самопересе-
3.25. Резюме 247 Рис. 3.65. График данных, состоящий из прямолинейных отрезков, кривых, харак- терных маркировочных символов и текста (перепечатано с разрешения Wolfram Re- search, Inc., создателя программы Mathe- matica) Рис. 3.66. Электрическая схема, составленная из прямолинейных отрезков, окружностей, закрашенных прямоугольников и текста (перепечатано с разрешения Wolfram Research, Inc., создателя программы Mathematicd} кающимися границами. Характерный пример — правило ненулевого количества вит- ков. Это правило более гибкое, чем правило четного-нечетного, и им можно пользо- ваться при работе с объектами, которые имеют несколько границ. Кроме того, можно пользоваться различными версиями правила ненулевого количества витков, которые позволяют объединять плоские области с помощью различных логических операций. У каждого многоугольника есть передняя и задняя сторона, которые определяют ориентацию плоскости многоугольника в пространстве. Эту пространственную ори- ентацию можно определить по сектору нормали, который перпендикулярен плоскости многоугольника и указывает направление от обратной стороны к лицевой стороне. Компоненты вектора нормали можно найти из уравнения плоскости многоугольника или путем построения векторного произведения по трем точкам, лежащим в этой плоскости, где эти три точки берутся в направлении против часовой стрелки, а угол, образованный этими тремя точками, должен быть меньше, чем 180°. Все коорди- натные значения, данные о пространственной ориентации и другую геометрическую информацию о сцене заносят в три таблицы: таблицу вершин, таблицу сторон и таблицу поверхностных граней.
248 Глава 3. Выходные графические примитивы К дополнительным примитивам, существующим в графических пакетах, относят- ся матричные структуры и строки символов. Матричные структуры можно использо- вать для описания двухмерных фигур, в том числе и наборов символов, с помощью либо прямоугольного массива бинарных значений, либо набора цветовых значений. Строки символов используются для подписей на рисунках и графиках. С помощью функций примитивов, существующих в основной библиотеке OpenGL, можно строить точки, прямолинейные отрезки, закрашенные выпуклые мно- гоугольники, а также пиксельные или растровые матричные структуры. В библиотеке GLUT можно найти стандартные процедуры для изображения строк символов. Дру- гие виды примитивов, такие как окружности, эллипсы или закрашенные вогнутые многоугольные области, также можно строить с помощью этих функций, или с помо- щью стандартных процедур из библиотек GLU и GLUT. Все координатные значения выражаются в абсолютных координатах в правосторонней декартовой системе коор- динат. Координаты точек, с помощью которых описывается сцена, могут задаваться как в двух-, так и в трехмерной системе координат, Для задания значений координат могут использоваться целые числа или значения с плавающей запятой, кроме того, можно задавать положение с помощью указателя на массив координатных значений. Затем описание сцены с помощью функций визуализации преобразуется в двухмер- ное изображение на таком устройстве вывода, как монитор. За исключением функции glRect, координаты каждой точки из набора точек, прямых или многоугольников задаются с помощью функции glVertex. А набор функций glVertex, определяю- щих каждый примитив, помещается между парой операторов glBegin/glEnd, где тип примитива определяется символьной константой, которая выступает аргумен- том функции glBegin. Если описание сцены состоит из множества закрашенных многоугольных поверхностей, можно рационально создать изображение с помощью массива вершин OpenGL, в которых содержится вся геометрическая и другая необ- ходимая информация. В табл. 3.1 перечислены основные функции для создания результирующих при- митивов в OpenGL. Кроме того, в этой же таблице приводятся некоторые связанные с ними стандартные процедуры. ТАБЛИЦА 3.1. Таблица функций результирующих примитивов OpenGL и связан- ных с ними процедур Функция Описание gluOrtho2D Задается двухмерная внешняя система координат glVertex* Выбор координат. Эта функция должна помещаться между парой glBegin/glEnd glBegin (GL_POINTS); Строится одна или несколько точек, каждая из которых задается с помощью функции glVertex. Затем список координат закрывается с помощью оператора glEnd
3.25. Резюме 249 Продолжение табл. 3.1 Функция Описание glBegin (GL_LINES); Изображается набор прямолинейных отрез- ков, координаты концов которых задаются с помощью функции glVertex. Затем список ко- нечных точек закрывается с помощью оператора glEnd glBegin (GL_LINE_STRIP); Строится ломаная линия, которая задается с по- мощью такой же структуры, что и GL_LINES glBegin (GL_LINE_LOOP); Изображается замкнутая ломаная линия, которая задается с помощью такой же структуры, что и GL_LINES glRect* Строится закрашенный прямоугольник, лежа- щий в плоскости ху glBegin (GL_POLYGON); Изображается закрашенный многоугольник, вер- шины которого задаются с помощью функции glVertex и завершаются оператором glEnd glBegin (GL_TRIANGLES); Образуется набор закрашенных треугольников, которые задаются с помощью такой же структу- ры, что и GL_POLYGON glBegin Изображается сеть закрашенных треугольников, (GL_TRIANGLE_STRIP); которая задается с помощью такой же структуры, что и GL_POLYGON glBegin Строится сеть закрашенных треугольников в ви- (GL_TRIANGLE_FAN); де веера, где все треугольники соединяются в первой вершине, которая задается с помощью та- кой же структуры, что и GL_POLYGON glBegin (GL_QUADS); Изображается набор четырехугольников, кото- рые задаются с помощью такой же структуры, что и GL_POLYGON glBegin (GL_QUAD_STRIP); Изображается сеть закрашенных четырехуголь- ников, которая задается с помощью такой же структуры, что и GL_POLYGON glEnableClientState Активизируется возможность создания массива (GL_VERTEX_ARRAY); вершин в OpenGL glVertexPointer (size, type, stride, array); Задается массив координатных значений glDrawElements (prim, Изображается заданный тип примитива из мае- num, type, array) сива данных
250 Глава 3. Выходные графические примитивы Окончание табл. 3.1 Функция Описание glNewList (listID, listMode) glGenLists Набор команд объединяется в таблицу отображения, ко- торая завершается оператором glEndList Создается один или несколько идентификаторов таблиц отображений gllsList Функция, которая служит для запроса, использовался уже такой идентификатор таблицы отображения или нет glCallList glListBase Реализуется одна таблица отображения Задается значение смещения для массива идентификато- ров таблиц отображений glCallLists glDeleteLists Реализуется несколько таблиц отображений Удаляется заданная последовательность таблиц отобра- жений glRasterPos* Задается двух- или трехмерное текущее положение буфе- ра кадра. Это положение используется как опорная точка для битового и пиксельного отображений glBitmap (w, h, xO, yO, xShift, yShift, pattern) glDrawPixels (w, h, type, format, pattern) glDrawBuffer Задается бинарный узор, который должен переноситься на пиксели, координаты которых определяются относи- тельно текущего положения Задается цветовой узор, который должен переноситься на пиксели, координаты которых определяются относи- тельно текущего положения Выбирается один или несколько буферов для записи пик- сельного отображения glReadPixels glCopyPixels Блок пикселей записывается в выбранный массив Блок пикселей копируется из одной части буфера в другую glLogicOp Выбирается логическая операция для объединения двух пиксельных массивов, после того, как такую возмож- ность дает константа GL_COLOR_LOGIC_OP glutBitmapCharacter (font, symbol); glutStrokeCharacter (font, symbol); glutReshapeFunc Задается шрифт и изображается растровый символ Задается шрифт и изображается эскизный символ Задаются действия, которые должны выполняться при изменении размеров окна изображения
Примеры программ 251 Рис. 3.67. График данных, состоящий из ломаной линии и полимаркера, полученный с помощью процедуры lineGraph ПРИМЕРЫ ПРОГРАММ Здесь приводится несколько примеров программ OpenGL, которые служат иллюстра- цией применения результирующих примитивов. В каждой программе используется одна или несколько функций из тех, которые перечислены в табл. 3.1. Окно изобра- жения для выхода в каждой программе задается с помощью стандартных процедур GLUT, описанных в главе 2. Первая программа служит иллюстрацией использования ломаной линии, набора полимаркеров и подписей, состоящих из растровых символов, для построения линей- ного графика по данным для каждого месяца в течение одного года. Здесь показан пропорциональный шрифт, хотя по точкам на графике легче выравнивается шрифт с постоянной шириной символов. Поскольку растровые положения определяются по левому нижнему углу с помощью функции определения растрового положения, необходимо сместить точку отсчета, чтобы выровнять центр текстовой строки по положению точек на графике. На рис. 3.67 показан выход программы построения линейного графика.
252 Глава 3. Выходные графические примитивы ♦include <GL/glut.h> GLsizei winWidth = 600, winHeight = 500; /* Исходный размер окна изображения. */ GLint xRaster = 25, yRaster = 150; /* Инициализация растрового положения. */ GLubyte label [36] = ' J', ' a', ' n', 4 <D cr M','a', ' r ' f ' A' ,' p' , ' r' , ' M',' a',' y', ' J',' u', ’ n' , ' J','u','1' , 'A', 'u', 'g', 'S','e', 'p' f ' O',' c', ' t' , 'N','o','v', 'D', 'e', ' c'; GLint dataValue [12] void init (void) { = 420, 342, 190, 196, 324, 310, 262, 217, 240, 312, 185, 438; glClearColor (1. glMatrixMode (GL gluOrtho2D (0.0, 0, 1.0, 1.0, -PROJECTION); 600.0, 0.0, 1.0); 500.0); // Белое окно } void lineGraph (void) { GLint month, k; GLint x = 30; // Инициализация координаты x. glClear (GL_COLOR_BUFFER_BIT); // Чистое окно изображения. glColor3f (0.0, 0.0, 1.0); // Задание синего цвета линии. glBegin (GL_LINE_STRIP); /* Изображение графика в виде ломаной линии. */ for (к = 0; к < 12; к++) glVertex2i (х + к*50, dataValue [к]); glEnd ( ); glColor3f (1.0, 0.0, 0.0); /* Задание красного цвета маркера. */ for (к =0; к < 12; к++) { /* Изображение данных полимаркером (звездочками). */ glRasterPos2i (xRaster + k*50, dataValue [k] - 4); glutBitmapCharacter (GLUT_BITMAP_9_BY_15, '*'); ) glColor3f (0.0, 0.0, 0.0); // Задается черный цвет текста. xRaster = 20; /* Изображение подписей на диаграмме. */ for (month = 0; month < 12; month++) { glRasterPos2i (xRaster, yRaster); for (k = 3*month; k < 3*month + 3; k++) glutBitmapCharacter (GLUT_BITMAP_HELVETICA_12, label [k]); xRaster += 50; } glFlush ( ) ; ) void winReshapeFcn (GLint newWidth, GLint newHeight) { glMatrixMode (GL_PROJECTION); glLoadldentity ( ); gluOrtho2D (0.0, GLdouble (newWidth), 0.0, GLdouble (newHeight));
Примеры программ 253 glClear (GL_COLOR_BUFFER_BIT); } void main (int argc, char** argv) { glutlnit (&argc, argv); glutlnitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutlnitWindowPosition (100, 100); glutlnitWindowSize (winWidth, winHeight); glutCreateWindow ("Линейный график данных"); init ( ) ; glutDisplayFunc (lineGraph); glutReshapeFunc (winReshapeFcn); glutMainLoop ( ) ; ) Во второй программе воспользуемся тем же самым набором данных и построим гистограмму, изображенную на рис. 3.68. С помощью этой программы мы проиллю- стрируем применение закрашенных прямоугольников, а также подписей, состоящих из растровых символов. Рис. 3.68. Ги- стограмма, полу- ченная с помо- щью процедуры barChart
254 Глава 3. Выходные графические примитивы void barChart (void) { GLint month, к; glClear(GL_COLOR_BUFFER_BIT); // Чистое окно изображения. glColor3f (1.0, 0.0, 0.0); /* Задается красный цвет прямоугольников. */ for (к = 0; к < 12; к++) glRecti (20 + к*50, 165, 40 + к*50, dataValue [к]); glColor3f (0.0, 0.0, 0.0); /♦Задание черного цвета текста. */ xRaster = 20; /* Изображение подписей на гистограмме. */ for (month = 0; month < 12; month++) { glRasterPos2i (xRaster, yRaster); for (k = 3*month; к < 3*month + 3; k++) glutBitmapCharacter (GLUT_BITMAP_HELVETICA_12, label [h]) ; xRaster += 50; } glFlush ( ); Чтобы показать процентное соотношение отдельных частей целого, часто используют секторные диаграммы. Следующая программа выдает секторную диаграмму, которая строится с помощью метода средней точки для построения окружности. Для коли- чества и относительной величины секторов используются значения из предыдущего примера, а выход этой программы показан на рис. 3.69. Рис. 3.69. Выход процедуры pieChart
Примеры программ 255 ♦include <GL/glut.h> ♦include <stdlib.h> ♦include <math.h> const GLdouble twoPi = 6.283185; class scrPt { public: GLint x, y; }; GLsizei winWidth = 400, winHeight = 300; /* Исходный размер окна изображения. *. void init (void){ glClearColor (1.0, 1.0, 1.0, 1.0); glMatrixMode (GL_PROJECTION) ; gluOrtho2D (0.0, 200.0, 0.0, 150.0); } // Процедуры // изображения // окружности. void pieChart (void){ scrPt circCtr, piePt; GLint radius = winWidth /4; // Радиус окружности. GLdouble sliceAngle, previousSliceAngle = 0.0; GLint k, nSlices = 12; // Количество секторов. GLfloat dataValues[12] = 10.0, 7.0, 13.0, 5.0, 13.0, 14.0, 3.0, 16.0, 5.0, 3.0, 17.0, 8.0; GLfloat dataSum = 0.0; circCtr.x = winWidth /2; // Координаты circCtr.у = winHeight /2; // центра окружности. circleMidpoint (circCtr, radius); // Вызов процедуры // построения окружности методом средней точки. for (к = 0; к < nSlices; к++) dataSum += dataValues[к]; for (к = 0; к < nSlices; к++) { sliceAngle = twoPi * dataValues[к] / dataSum + previousSliceAngle; piePt.x = circCtr.x + radius * cos (sliceAngle); piePt.у = circCtr.у + radius * sin (sliceAngle); glBegin (GL_LINES); glVertex2i (circCtr.x, circCtr.y); glVertex2i (piePt.x, piePt.y); glEnd ( ); previousSliceAngle = sliceAngle; } } void displayFcn (void){ glClear (GL_COLOR_BUFFER_BIT); // Чистое окно изображения. glColor3f (0.0, 0.0, 1.0); // Синий цвет окружности. pieChart ( ) ; glFlush ( ) ; }
256 Глава 3. Выходные графические примитивы void winReshapeFcn (GLint newWidth, GLint newHeight) { glMatrixMode (GL_PROJECTION) ; glLoadldentity ( ); glu0rtho2D (0.0, GLdouble (newWidth), 0.0, GLdouble (newHeight)); glClear (GL_COLOR_BUFFER_BIT); /* Изменение параметров размеров окна изображения. */ winWidth = newWidth; winHeight = newHeight; ) void main (int argc, char** argv) { glutlnit (&argc, argv); glutlnitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutlnitWindowPosition (100, 100); glutlnitWindowSize (winWidth, winHeight); glutCreateWindow ("Секторная диаграмма"); init ( ); glutDisplayFunc (displayFcn); glutReshapeFunc (winReshapeFcn); glutMainLoop ( ); ) Изображения различных фигур можно получить с помощью небольших изме- нений уравнения окружности в нашей последней программе-примере, где для вы- числения координат точек, принадлежащих кривой, используются параметрические полярные уравнения (3.28). Затем полученные значения используются в качестве координат концов прямолинейных отрезков, с помощью которых кривые аппрокси- мируются ломаными линиями. Кривые, изображенные на рис. 3.70, были получены путем изменения радиуса г окружности. В зависимости о того, как изменяется радиус г, можно получить улитку, кардиоиду, спираль или другие подобные фигуры. Рис. 3.70. Фигуры, изображения которых можно получить с помощью процедуры drawCurve: а) улит- ка, б) кардиоида, в) трехлистник, г) четырехлистник и д) спираль
Примеры программ 257 #include <GL/glut.h> tinclude <stdlib.h> iinclude <math.h> #include <iostream.h> struct screenPt { GLint x; GLint y; }; typedef enum limacon = 1, cardioid, threeLeaf, fourLeaf, spiral curveName; GLsizei winWidth = 600, winHeight = 500; // Исходный размер окна изображения, void init (void) { glClearColor (1.0, 1.0, 1.0, 1.0); glMatrixMode (GL_PROJECTION); gluOrtho2D (0.0, 200.0, 0.0, 150.0); } void lineSegment (screenPt ptl, screenPt pt2) { glBegin (GL_LINES); glVertex2i (ptl.x, ptl.y); glVertex2i (pt2.x, pt2.y); glEnd ( ); } void drawCurve (GLint curveNum) { /* Улитка Паскаля является одной из модификаций уравнения * окружности, при которой радиус изменяется как * г = а * cos (theta) + Ь с постоянными а и b. Кардиоидой * называется улитка при а = Ь. Трехлистник и четырехлистник * получаются, когда г = а * cos (n * theta), при п = 3 и п = 2 * соответственно. Изображение спирали получается, когда г * кратно theta. * / const GLdouble twoPi = 6.283185; const GLint a = 175, b = 60; GLfloat r, theta, dtheta = 1.0 / float (a); GLint xO = 200, yO = 250; // Задание исходного положения на экране. screenPt curvePt[2]; glColor3f (0.0, 0.0, 0.0); // Задание черного цвета кривой. curvePt[0].х = хО; // Инициализация положения кривой. curvePt[0].у = уО; switch (curveNum) { case limacon: curvePt[0].x += a + b; break; case cardioid: curvePt[0].x += a + a; break; case threeLeaf: curvePt[0].x += a; break; case fourLeaf: curvePt[0].x += a; break; case spiral: break; default: break; )
258 Глава 3. Выходные графические примитивы theta = dtheta; while (theta < two_Pi) { switch (curveNum) { case limacon: r = a * cos (theta) + b; break; case cardioid: r = a * (1 + cos (theta)); break; case threeLeaf: r = a * cos (3 * theta); break; case fourLeaf: r = a * cos (2 * theta); break; case spiral: r = (a / 4.0) * theta; break; default: break; ) curvePt[].] .x = xO + r * cos (theta); curvePt[1].у = yO + r * sin (theta); lineSegment (curvePt[0], curvePt[l]); curvePt [0].x = curvePt [].]. x; curvePt[0].у = curvePt[1].у; theta += dtheta; ) ) void displayFcn (void) { GLint curveNum; glClear (GL_COLOR_BUFFER_BIT); // Чистое окно изображения, cout « "\n Введите целое число, соответствующее^" ; cout « "одному из перечисленных ниже названий кривой.\п"; cout « "Для выхода из программы нажмите любую другую клавишу.\п" ; cout « "\n 1 - улитка, 2 - кардиоида, 3 - трехлистник, 4 - четырехлистник, 5 - спираль: "; cin » curveNum; if (curveNum == 1 || curveNum == 2 || curveNum == 3 || curveNum == 4 || curveNum == 5) drawCurve (curveNum); else exit (0); glFlush ( ); )
Упражнения 259 void winReshapeFcn (GLint newWidth, GLint newHeight) { glMatrixMode (GL_PROJECTION); glLoadldentity ( ); glu0rtho2D (0.0, (GLdouble) newWidth, 0.0, (GLdouble) newHeight); glClear (GL_COLOR_BUFFER_BIT); ) void main (int argc, char** argv) { glutlnit (&argc, argv); glutlnitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutlnitWindowPosition (100, 100); glutlnitWindowSize (winWidth, winHeight); glutCreateWindow ("Построение кривых"); init ( ) ; glutDisplayFunc (displayFcn); glutReshapeFunc (winReshapeFcn); glutMainLoop ( ) ; ) ЛИТЕРАТУРА Основные сведения об алгоритмах Брезенхема можно найти в статьях [40, 41]. Информация о методах средней точки есть в сборнике [168]. Параллельные методы построения прямых линий и окружностей рассматриваются в работах [247, 410]. Многие другие способы изображения и обработки графических примитивов обсуждаются в публикациях [8, 122, 151, 176, 244]. Дополнительные примеры программ с использованием функций примитивов OpenGL приво- дятся в руководстве [400]. Список всех функций примитивов OpenGL можно найти в справочнике [320]. Исчерпывающая информация о GLUT представлена в книге [174]. УПРАЖНЕНИЯ 3.1. Напишите функцию для построения ломаной линии с помощью алгоритма ПДА, если из- вестно произвольное число (п) входных точек. При n = 1 должна изображаться одна точка. 3.2. Дополните алгоритм Брезенхема для построения прямой линии с произвольным тангенсом угла наклона, учтя симметрию между квадрантами. 3.3. Напишите функцию построения ломаной линии, воспользовавшись алгоритмом из преды- дущего упражнения, и постройте ряд прямолинейных отрезков, соединяющих список из п входных точек. При n = 1 эта стандартная процедура должна выдавать одну точку. 3.4. С помощью метода средней точки найдите параметры принятия решения для построе- ния точек, лежащих на прямой линии, тангенс угла наклона которой попадает в интервал 0 < т < 1. Покажите, что параметры принятия решения, полученные с помощью метода средней точки, такие же, как и для алгоритма Брезенхема для прямой линии.
260 Глава 3. Выходные графические примитивы 3.5. С помощью метода средней точки найдите параметры принятия решения, которые мож- но использовать для построения прямолинейных отрезков с произвольным тангенсом угла наклона. 3.6. Напишите параллельную версию алгоритма Брезенхема для построения прямой линии для тангенсов угла наклона в диапазоне 0 < т < 1. 3.7. Напишите параллельную версию алгоритма Брезенхема для прямой линии с произвольным тангенсом угла наклона. 3.8. Предположим, что дана система с монитором размером 8 на 10 дюймов, на котором можно получить изображение 100 пикселей на дюйм. Если память состоит из однобайтовых слов, исходный адрес буфера кадра — 0, а каждому пикселю соответствует один байт памяти, то каким будет адрес буфера кадра для пикселя с экранными координатами (х, у)? 3.9. Предположим, что дана система с монитором размером 8 на 10 дюймов, на котором можно получить изображение 100 пикселей на дюйм. Если память состоит из однобайтовых слов, исходный адрес буфера кадра — 0, а каждому пикселю соответствует 6 бит памяти, то каким будет адрес (или адреса) буфера кадра для пикселя с экранными координатами (х, у)? 3.10. Вставьте в алгоритм Брезенхема для построения прямой линии итеративный метод нахож- дения адресов буфера кадра (раздел 3.7). 3.11. Перепишите алгоритм средней точки для окружности таким образом, чтобы можно было изображать окружности с сохранением входных геометрических величин (раздел 3.13). 3.12. Напишите процедуру для параллельного выполнения алгоритма средней точки для постро- ения окружности. 3.13. Найдите параметры принятия решения для алгоритма средней точки для построения эл- липса, предположив, что исходная точка имеет координаты (гх, 0), а точки эллипса следует изображать в направлении против часовой стрелки. 3.14. Напишите процедуру для параллельного выполнения алгоритма средней точки для эллипса. 3.15. Придумайте эффективный алгоритм изображения одного периода синусоиды, в котором бы учитывались свойства симметрии. 3.16. Измените алгоритм из предыдущего упражнения таким образом, чтобы можно было изоб- разить синусоиду в любом заданном диапазоне углов. 3.17. Придумайте эффективный алгоритм (в котором учитывались бы свойства симметрии) для построения графика затухающих гармонических колебаний: у = Ae~kx sin(шх + 0), где ш — угловая частота, а 9 — фаза синусоиды. Изобразите у как функцию х для нескольких циклов синусоиды или стройте изображение до тех пор, пока максимальная амплитуда не А уменьшится до 3.18. Воспользовавшись методом средней точки и приняв во внимание свойства симметрии, раз- работайте эффективный алгоритм для преобразования стандартов развертки следующей кри- вой на интервале —10 < х < 10. 3.19. Воспользуйтесь методом средней точки и свойствами симметрии для преобразования стан- дартов развертки параболы у = 100 — ж2 на интервале —10 < х < 10.
Упражнения 261 3.20. Воспользуйтесь методом средней точки и свойствами симметрии для преобразования стан- дартов развертки параболы 2 X = у на интервале —10 < у < 10. 3.21. Напишите алгоритм средней точки (с учетом свойств симметрии) для преобразования стан- дартов развертки произвольной параболы вида 2 , i у = ах + о с входными значениями параметров а, b и диапазоном значений х. 3.22. Составьте таблицы геометрических данных, аналогичные показанным на рис. 3.50, для единичного куба. 3.23. Составьте таблицы геометрических данных для единичного куба, используя только таблицу вершин и таблицу поверхностных граней, затем запишите ту же информацию с помощью одной только таблицы поверхностных граней. Сравните эти два способа описания единич- ного куба с описанием с помощью трех таблиц из упражнения 3.22. Оцените объем памяти, необходимый для каждого из этих способов. 3.24. Найдите эффективный способ описать цилиндр с помощью сетки многоугольников и обос- нуйте свой выбор. 3.25. Напишите процедуру для создания таблиц геометрических данных для любого заданного набора точек, определяющих многоугольные грани поверхности трехмерного объекта. 3.26. Придумайте стандартные процедуры для проверки трех таблиц геометрических данных, изображенных на рис. 3.50, на полноту и совместимость. 3.27. Напишите программу для вычисления параметров А, В, С и D заданной сетки многоуголь- ных поверхностных граней. 3.28. Напишите процедуру для определения того, находится точка с заданными координатами перед многоугольной поверхностью или за ней, если известны параметры А, В, С и D многоугольника. 3.29. Если поменять систему координат сцены с правосторонней на левостороннюю, какие из- менения следует внести в значения параметров плоской поверхности А, В, С н D, чтобы ориентация этой поверхности в пространстве описывалась правильно? 3.30. Разработайте процедуру для распознавания неплоского списка вершин четырехугольника. 3.31. Дополните алгоритм из предыдущего упражнения таким образом, чтобы с его помощью можно было распознать неплоский список вершин, состоящий из более, чем четырех точек. 3.32. Напишите процедуру для разделения набора из четырех значений координат вершин мно- гоугольника на набор треугольников. 3.33. Придумайте алгоритм для разделения набора из п значений координат вершин многоуголь- ника при п > 4 на набор треугольников. 3.34. Напишите алгоритм для распознавания списка вершин вырожденного многоугольника, в котором могут быть повторяющиеся или лежащие на одной прямой вершины. 3.35. Придумайте алгоритм для распознавания списка вершин многоугольника, в котором есть пересекающиеся стороны. 3.36. Напишите стандартную процедуру для распознавания вогнутых многоугольников путем вычисления векторных произведений пар векторов сторон.
262 Глава 3. Выходные графические примитивы 3.37. Напишите стандартную процедуру для разделения вогнутого многоугольника векторным способом. 3.38. Напишите стандартную процедуру для разделения вогнутого многоугольника с помощью метода поворотов. 3.39. Придумайте алгоритм для определения внутренних областей любого заданного набора вер- шин с помощью правила ненулевого количества витков и вычисления векторного произве- дения для определения направления пересечения со сторонами. 3.40. Придумайте алгоритм для определения внутренних областей любого заданного набора вер- шин с помощью правила ненулевого количества витков и вычисления скалярного произве- дения для определения направления пересечений со сторонами. 3.41. Для каких участков самопересекающейся ломаной линии, показанной на рис. 3.46, коли- чество витков будет положительным? Для каких областей количество витков будет отрица- тельным? Для каких участков количество витков будет больше, чем 1? 3.42. Напишите стандартную процедуру для выполнения функции текстовой строки, которая име- ет два параметра: один параметр определяет ее положение относительно внешней системы координат, а другой — описывает саму текстовую строку. 3.43. Напишите стандартную процедуру для выполнения функции полимаркера, которая имеет два параметра: один параметр — это символ, который будет изображаться, а другой — список внешних координат. 3.44. Внесите изменения в пример программы из раздела 3.24, чтобы изображаемый шестиуголь- ник всегда находился в центре окна изображения, независимо от того, как изменяется размер самого окна изображения. 3.45. Напишите полную программу для изображения гистограммы. Входные данные для этой программы должны содержать точки и необходимые изображения по осям х и у. Программа должна подбирать масштаб значений таким образом, чтобы график изображался на всей площади окна. 3.46. Напишите программу для изображения гистограммы в любом выбранном участке окна. 3.47. Напишите процедуру для изображения линейного графика любого заданного набора зна- чений в любом выбранном участке экрана, где набор входных значений масштабируется таким образом, чтобы график занимал заданную область экрана. Значения данных должны изображаться звездочками, соединенными прямолинейными отрезками, а оси х и у долж- ны обозначаться согласно заданному описанию. (Вместо звездочек для обозначения точек можно использовать маленькие кружочки или другие символы.) 3.48. С помощью функции для построения окружности напишите стандартную процедуру для изображения секторной диаграммы с соответствующими обозначениями. Входные данные для этой процедуры должны содержать информацию о распределении значений данных по какому-либо набору интервалов, название секторной диаграммы, а также названия интерва- лов. Обозначение каждого сектора должно изображаться за пределами секторной диаграммы около соответствующего сектора.
Атрибуты графических примитивов Один кадр из компьютерного мультфильма, иллюстрирующий разнообразие цветов и других атрибутов объектов (перепечатано с разрешения SOFTIMAGE, Inc.)
4.1. Параметры состояния в OpenGL 4.2. Цвет и шкала яркости 4.3. Функции цвета в OpenGL 4.4. Атрибуты точек 4.5. Атрибуты прямых линий 4.6. Атрибуты кривых 4.7. Функции атрибутов точек в OpenGL 4.8. Функции атрибутов прямых линий в OpenGL 4.9. Атрибуты закрашенных фигур 4.10. Общий вид растрового алгоритма для закрашивания многоугольников 4.11. Построчное закрашивание выпуклых многоугольников 4.12. Построчное закрашивание фигур с кривыми границами 4.13. Способы заполнения фигур с неправильными границами 4.14. Функции атрибутов закрашенных фигур в OpenGL 4.15. Атрибуты символов 4.16. Функции атрибутов символов в OpenGL 4.17. Устранение контурных неровностей 4.18. Функции сглаживания в OpenGL 4.19. Функции запроса в OpenGL 4.20. Группы атрибутов в OpenGL 4.21. Резюме общем случае, параметр, который влияет на способ изображения при- митива, называется параметром атрибута. Такие параметры атрибутов, как цвет или размер, определяют фундаментальные характеристики при- митива. Другие атрибуты служат для описания того, как должен изоб- ражаться примитив при особых условиях. Пример атрибутов для особых условий — видимость или регистрируемость определенного объекта в программе, связанной с интерактивным выбором объектов. Эти атрибуты для особых условий будут изучать- ся в последующих главах. Здесь мы остановимся только на тех атрибутах, которые предназначены для управления основными свойствами изображения графических примитивов, не рассматривая различные особые ситуации. Например, прямые ли- нии могут быть сплошными или пунктирными, широкими или тонкими, синими или оранжевыми. Отдельные фигуры могут закрашиваться одним цветом или заполняться многоцветным узором. Текст может читаться слева направо, изображаться под накло- ном по диагонали экрана или в вертикальных колонках. Отдельные символы могут писаться с помощью различных шрифтов, быть разного цвета и размера, а на кра- ях объектов могут применяться эффекты изменения интенсивности, чтобы сгладить растровый “эффект лесенки”.
266 Глава 4. Атрибуты графических примитивов Один из способов ввести в состав графического пакета опции атрибутов — это таким образом дополнить список параметров, связанных с каждой функцией графи- ческого примитива, чтобы в нем содержались соответствующие значения атрибутов. Функция построения прямой линии, например, может содержать дополнительные параметры, определяющие цвет, ширину и другие свойства прямой. Еще один под- ход — это сохранять системный список текущих значений атрибутов. В таких случаях в графический пакет включают отдельные функции для ввода текущих значений в список атрибутов. Чтобы создать примитив, система проверяет важные атрибуты и вызывает стандартную процедуру изображения этого примитива, используя при этом текущие значения атрибутов. В некоторых графических пакетах применяется ком- бинация методов ввода значений атрибутов, а в других библиотеках, в том числе OpenGL, атрибуты присваиваются с помощью отдельных функций, которые служат для обновления системного списка атрибутов. Графическая система, в которой сохраняется список текущих значений атрибутов и других параметров, называется системой состояний или аппаратом состояний. Атрибуты результирующих примитивов и некоторые другие параметры, такие как текущее положение буфера кадра, называются переменными состояния или пара- метрами состояния. При присвоении значения одному или нескольким таким пара- метрам система вводится в определенное состояние, в котором остается до тех пор, пока значение параметров состояния не изменится. 4.1. ПАРАМЕТРЫ СОСТОЯНИЯ В OpenGL Значения атрибутов и настройки других параметров задаются с помощью отдель- ных функций, которые описывают текущее состояние пакета OpenGL. К параметрам состояния в OpenGL относятся цвет и другие атрибуты примитивов, текущий мат- ричный режим, элементы массива моделирования изображения, текущее положение в буфере кадра и параметры эффектов освещения сцены. Все параметры в OpenGL имеют свои значения по умолчанию, которые действуют до тех пор, пока не будут заданы новые значения. В любой момент можно потребовать от системы определить текущее значение любого параметра состояния. В следующих разделах этой гла- вы будут рассматриваться только настройки атрибутов результирующих примитивов. Остальные параметры состояния описываются в последующих главах. Все графические примитивы в OpenGL изображаются с атрибутами из списка текущего состояния. Изменение одного или нескольких атрибутов повлияет только на те примитивы, которые будут задаваться после изменения состояния OpenGL. Атрибуты примитивов, которые были описаны до смены состояния системы, не из- менятся. Таким образом, можно изобразить зеленую линию, поменять текущий цвет на красный, и нарисовать еще один отрезок. В этом случае получится изображение и зеленой линии, и красного отрезка. Кроме того, некоторые значения параметров со-
4.2. Цвет и шкала яркости 267 стояния OpenGL могут задаваться внутри пары функций glBegin/glEnd вместе со значениями координат, так что настройки параметров могут меняться при переходе от одной точки к другой. 4.2. ЦВЕТ И ШКАЛА ЯРКОСТИ Основной атрибут всех примитивов — это цвет. Пользователю могут предлагать- ся различные цветовые опции в зависимости от возможностей и целей конкретной системы. Цветовые опции могут задаваться численно, выбираться из меню или с помощью ползунков. Относительно монитора эти коды цвета затем преобразуются в настройки уровня интенсивности электронного луча, а для цветного графопострои- теля эти коды позволяют управлять выделением краски или выбором пера. ЦВЕТОВЫЕ КОМПОНЕНТЫ RGB В цветных растровых системах количество возможных вариантов цветов зависит от объема памяти, который предоставляется для каждого пикселя в буфере кадра. Кроме того, информация о цвете может записываться в буфер кадра двумя способами: можно записывать коды RGB-цветов непосредственно в буфер кадра или же составлять от- дельную таблицу из кодов цвета и использовать координаты пикселей для записи зна- чений индексов, указывающих на содержимое цветовой таблицы. При прямой схеме записи, когда бы ни задавался определенный цветовой код в программе-приложении, информация об этом цвете будет помещаться в буфер кадра во всех положениях пикселей, составляющих примитив, который должен изображаться в этом цвете. Ми- нимальное количество цветов при такой схеме можно получить при 3 бит памяти на один пиксель, как показано в табл. 4.1. Каждое из трех положений битов используется ТАБЛИЦА 4.1. Восемь кодов RGB-цвета для буфера кадра при 3 бит на пиксель Код цвета Коды цвета, записанные в буфер кадра Изображаемый цвет । Красный Зеленый Синий 0 0 0 0 Черный 1 0 0 1 Синий 2 0 1 0 Зеленый 3 0 1 1 Голубой 4 1 0 0 Красный 5 1 0 1 Пурпурный 6 1 1 0 Желтый 7 1 1 1 Белый
268 Глава 4. Атрибуты графических примитивов для управления уровнем интенсивности (в данном случае — положение “включено” либо положение “выключено”) соответствующей электронной пушки RGB-монитора. Крайний слева бит служит для управления красной пушкой, средний бит управляет зеленой пушкой, а крайний справа бит — синей. Добавление большего числа битов на один пиксель увеличивает возможное количество доступных цветов. При 6 бит на один пиксель для каждой пушки можно использовать 2 бит. Это позволяет устанавли- вать четыре различных уровня интенсивности для каждой из трех цветовых пушек, и обеспечивать для каждого пикселя на экране 64 цветовых опции. При увеличении количества предлагаемых опций увеличивается также и объем памяти, необходимый для буфера кадра. При разрешении 1024 на 1024 пикселей для буфера кадра в полно- цветной (24 бит на пиксель) RGB-системе необходимо 3 Мбайт памяти. Цветовые таблицы — это альтернативный способ расширения возможностей поль- зователя, касающихся передачи цвета, при котором не требуется буфер кадра боль- шого объема. Когда-то это было очень важным условием, но сегодня стоимость аппа- ратных средств резко снизилась, и широкие возможности передачи цветовой гаммы стали общедоступными, даже в ранних моделях персональных компьютерных си- стем. Поэтому в большей части примеров будет просто считаться, что RGB-коды цвета записываются непосредственно в буфер кадра. ТАБЛИЦЫ ЦВЕТОВ На рис. 4.1 показана возможная схема хранения цветовых значений в цветовой таб- лице поиска (или карте цветов). Иногда таблицы цветов называют таблицами ви- деопоиска. Теперь в качестве элементов цветовой таблицы используются значения, записанные в буфере кадра. В этом примере каждый пиксель может соотноситься с любым из 256 элементов таблицы, а каждая позиция таблицы состоит из 24 бит, кото- рые описывают цвет в системе RGB. При шестнадцатеричном цветовом коде 0x0821 Цветовая таблица поиска К красной —► электронной пушке К зеленой * электронной пушке ___ К синей | электронной пушке |00000000|0000 100 0|00 10 о~ооТ| Рис. 4.1. Цветовая таблица поиска с 24 бит на входе, доступная из буфера кадра при использовании 8 бит на пиксель. Значение 196, записанное в пикселе с координатами (х, у), указывает позицию таблицы, где содержится шестнадцатеричное значение 0x0821 (десятичное значение 2081). Каждый 8-битовый сегмент этого входа отвечает за уровень интенсивности одной из трех электронных пушек RGB-монитора
4.2. Цвет и шкала яркости 269 в пикселе с координатами (х, у) изображается комбинация синего и зеленого цве- тов. Системы, в которых используется эта специальная таблица поиска, позволяют пользователю выбирать любые 256 цветов из палитры, содержащей почти 17 милли- онов различных цветов. По сравнению с полноцветной системой количество цветов, которые можно изобразить одновременно, мало, но необходимый объем памяти бу- фера кадра также снижен до 1 Мбайт. Иногда для работы со специализированными приложениями, в которых фигурирует закрашивание (например, схемы устранения неровности контура), создаются множественные таблицы цветов, также они исполь- зуются в системах, имеющих более одного устройства цветного вывода. Таблицы цветов могут оказаться полезными в ряде приложений, они могут пред- ложить “разумное” количество одновременно изображаемых цветов, не требуя для этого большого объема буфера кадра. В большинстве приложений для одного рисунка достаточно 256 или 512 различных цветов. Кроме того, вход таблицы можно изменить в любое время, что позволяет пользователю легко экспериментировать с различными цветовыми комбинациями при проектировании, составлении сцены или построении графика, не изменяя структуру графических данных. При изменении значения цвета в цветовой таблице все пиксели с этим цветовым индексом немедленно изменяют свой цвет на новый. Без цветовой таблицы цвет пикселя можно изменить, только записав новое цветовое значение в это же положение буфера кадра. Аналогично в приложе- ниях, связанных с визуализацией данных, в буфер кадра можно записывать значения некоторой физической величины, например, энергии, и пользоваться поисковой таб- лицей для экспериментов с различными комбинациями цветов, не изменяя при этом значения пикселей. В приложениях, связанных с визуализацией и обработкой изоб- ражений, таблицы цветов — это удобное средство для задания цветовых пороговых значений таким образом, чтобы все значения пикселей, которые превышают заданное пороговое значение (или меньше него), окрашивались в один и тот же цвет. По этим причинам в некоторых системах предлагаются обе возможности записи информации о цвете. Тогда пользователь может выбирать, использовать ли ему цветовые таблицы или записывать цветовые коды непосредственно в буфер кадра. ШКАЛА ЯРКОСТИ Поскольку сегодня возможность передачи цвета является стандартной возможностью систем компьютерной графики, для описания оттенков серого цвета {шкалы яркости или шкалы полутонов) используются цветовые функции системы RGB. Когда опи- сание RGB-цвета содержит равное количество красного, зеленого и синего цветов, в результате получается некий оттенок серого цвета. Значения цветовых компонен- тов, близкие к 0, дают темно-серый цвет, а более высокие значения, близкие к 1,0, дают светло-серый цвет. Применение шкалы яркости позволяет улучшить качество черно-белых фотографий и создать визуальные эффекты.
270 Глава 4. Атрибуты графических примитивов ДРУГИЕ ЦВЕТОВЫЕ ПАРАМЕТРЫ Кроме системы RGB, в различных приложениях компьютерной графики возможны и другие трехкомпонентные способы описания цвета. Например, цвет печати на прин- тере описывается с помощью голубого, пурпурного и желтого цветовых компонентов, а в цветных интерфейсах при выборе цвета иногда используется светлый или темный оттенок. Кроме того, цвет (как и свет вообще) — это сложный объект, и для описания различных свойств источников света и эффектов освещения в различных областях оптики, радиометрии и психологии было придумано много терминов и понятий. С физической точки зрения цвет можно описать как электромагнитное излучение в определенном частотном диапазоне и с определенным распределением энергии, но существуют также характеристики, описывающие особенности нашего восприятия цвета. Таким образом, мы пользуемся физическим термином интенсивность для из- мерения количества световой энергии, излучаемой в определенном направлении за период времени, а психологический термин яркость используется для характеристи- ки воспринимаемой глазом светимости. Более подробно эти термины и другие поня- тия, связанные со светом, будут обсуждаться при рассмотрении методов моделирова- ния эффектов освещения (глава 10) и различных моделей описания цвета (глава 12). 4.3. ФУНКЦИИ ЦВЕТА В OpenGL В примере программы в конце главы 2 мы ввели несколько стандартных процедур OpenGL для задания цвета. Одну функцию мы применили для задания цвета окна изображения, а другой функцией воспользовались для описания цвета прямолиней- ного отрезка. Кроме того, мы задали цветовой режим изображения RGB с помощью команды glutlnitDisplayMode (GLUT_SINGLE | GLUT_RGB); Первый параметр из списка аргументов сообщает, что для буфера кадра исполь- зуется один буфер, а второй параметр устанавливает режим RGB (или RGBA) (цве- товой режимом по умолчанию). Для выбора этого режима можно воспользоваться также оператором GLUT_RGB или GLUT_RGBA. Если требуется описать цвет с помо- щью элементов таблицы цветов, нужно заменить константу OpenGL GLUT_RGB на GLUT_INDEX. ЦВЕТОВЫЕ РЕЖИМЫ RGB И RGBA В OpenGL Большинство настроек цветов примитивов OpenGL выполняется в режиме RGB, ко- торый, по сути, не отличается от режима RGBA. Единственное различие между режи- мами RGB и RGBA состоит в том, используется ли для смешивания цветов значение альфа. Когда задается определенный набор цветовых значений примитивов, опреде-
4.3. Функции цвета в OpenGL 271 ляется цветовое состояние пакета OpenGL. Текущий цвет будет применяться ко всем задаваемым после этого примитивам до тех пор, пока настройки цветов не изменят- ся. Новое описание цвета повлияет только на те объекты, которые будут описываться после изменения цвета. В режиме RGB задаются значения красного, зеленого и синего цветовых компо- нентов. Как отмечалось в разделе 2.9, четвертый цветовой параметр, коэффициент альфа, необязателен, а четырехмерное описание цвета называется RGBA-цветом. Этот четвертый цветовой параметр можно использовать для смешивания цветов при наложении объектов друг на друга. Одна из важных областей применения параметра смешивания цветов — это моделирование эффектов прозрачности. Для таких расчетов значение альфа соответствует настройке прозрачности (или непрозрачности). В режи- ме RGB (или RGBA) текущие цветовые компоненты выбираются с помощью функции glColor* (colorComponents); Индексы аналогичны используемым для функции glVertex. Для выбора режима RGB или RGBA используются индексы 3 или 4 плюс код типа числовых данных и необязательный индекс, обозначающий вектор. Возможны такие индексы, обозначаю- щие тип числовых данных: b (byte), i (integer), s (short), f (float) и d (double), а также числовые значения без знака. Значения цветовых компонентов с плавающей запятой принадлежат диапазону от 0,0 до 1,0, по умолчанию цветовые компоненты для опера- тора glColor, включая значение альфа, — это (1.0,1.0,1.0,1.0), задающие белый цвет RGB и значения альфа, — 1,0. Например, в следующем операторе используются зна- чения с плавающей запятой в режиме RGB, с помощью которых текущий цвет прими- тивов задается голубым (комбинация максимально интенсивных зеленого и синего). glColor3f (0.0, 1.0, 1.0); С помощью массива, описывающего три цветовых компонента, цвет в вышепри- веденном примере можно задать так. glColor3fv (colorArray); В пакете OpenGL цвета можно выбирать и для отдельных точек, используя для этого пару glBegin/glEnd. Описание цветовых компонентов с помощью целых чисел зависит от возможно- стей системы. Для полноцветной системы, в которой выделяется 8 бит на пиксель (256 уровней для каждого цветового компонента), целочисленные значения цветовых компонентов принадлежат диапазону от 0 до 255. Тогда соответствующие значения цветовых компонентов с плавающей запятой будут 0,0; 1,0/255,0; 2,0/255,0; ...; 255,0/255,0 = 1,0. Для полноцветной системы голубой цвет в предыдущем примере можно задать с помощью целочисленных значений цветовых компонентов так. glColor3i (0, 255, 255);
272 Глава 4. Атрибуты графических примитивов В действительности в позициях буфера кадра хранятся целочисленные значения, поэтому при описании цветовых значений с помощью целых чисел можно избежать преобразований, необходимых тогда, когда задаются значения с плавающей запятой. Заданные в любом формате цветовые значения превращаются в целочисленные, ко- торые принадлежат диапазону, определенному количеством битов, доступным опре- деленной системе. ИНДЕКСНЫЙ ЦВЕТОВОЙ РЕЖИМ В OpenGL Описание цвета в OpenGL может также задаваться в индексном цветовом режиме, в котором даются ссылки на значения элементов цветовой таблицы. В этом режиме текущий цвет устанавливается путем задания индекса цветовой таблицы: gllndex* (colorindex); Параметру colorindex присваивается неотрицательное целое значение. Затем это значение индекса записывается в позиции буфера кадра для последовательно описываемых примитивов. Цветовой индекс можно задавать с любым из следующих типов данных: байтовый без знака, целый или с плавающей запятой. Тип данных параметра colorindex обозначается с помощью индекса ub, s, i, d или f, а ко- личество индексов цветовой таблицы всегда равно какому-либо числу в степени 2, например, 256 или 1024. Количество битов, приходящееся на каждую позицию таб- лицы, зависит от аппаратных особенностей системы. В качестве примера описания цвета в индексном цветовом режиме приведем следующий оператор, с помощью которого задается текущий цветовой индекс со значением 196. glIndex! (196); Всем примитивам, которые будут описываться после этого оператора, будет при- сваиваться значение цвета, записанное в этом месте цветовой таблицы, пока текущий цвет не изменится. В корневой библиотеке OpenGL нет функций для занесения значений в цвето- вую поисковую таблицу, поскольку стандартные процедуры для обработки таблиц являются частью системы окон. Кроме того, некоторые системы окон поддерживают несколько таблиц цветов, тогда как в других системах есть только одна, и выбор цветов ограничен. Впрочем, есть стандартная процедура библиотеки GLUT, которая взаимодействует с системой окон и заносит описания цветов в таблицу в позицию с заданным индексом: glutSetColor (index, RED, GREEN, BLUE); Цветовым параметрам RED, GREEN и BLUE присваиваются значения с плавающей запятой в диапазоне от 0.0 до 1.0. Затем этот цвет заносится в таблицу в позицию, заданную с помощью параметра index.
4.3. Функции цвета в OpenGL 273 Стандартные процедуры для обработки трех других цветовых таблиц предлага- ются как дополнение к корневой библиотеке OpenGL. Эти стандартные процедуры являются частью набора для создания изображения OpenGL. Цветовые значения, которые хранятся в этих таблицах, можно использовать для изменения значений пик- селей при их обработке в различных буферах. Несколько примеров использования этих таблиц — установка эффекта фокусировки камеры, отфильтровка определенных цветов на изображении, увеличение определенных интенсивностей или регулировка уровня яркости, преобразование черно-белых фотографий в цветные и устранение контурных неровностей изображения. Кроме того, эти таблицы можно использовать для изменения цветовых моделей, т.е. можно поменять цвета RGB на другое описание с помощью трех других “основных” цветов (голубой, пурпурный и желтый). Отдельная цветовая таблица из набора для создания изображений в OpenGL ак- тивизируется с помощью функции glEnable при использовании одного из трех на- званий таблиц: GL_COLOR_TABLE, GL_POST_CONVOLUTION_COLOR_TABLE или GL_POST_COLOR_MATRIX_COLOR_TABLE. Затем можно воспользоваться стандарт- ными процедурами из набора для создания изображений и выбрать определенную таблицу цветов, задать значения таблицы цветов, скопировать значения из таблицы или указать, какой компонент цвета пикселя требуется изменить и как именно это нужно сделать. СМЕШИВАНИЕ ЦВЕТОВ В OpenGL Во многих приложениях было бы удобно сочетать цвета накладывающихся друг на друга объектов или смешивать цвет объекта с цветом фона. Приведем несколько при- меров: имитация эффекта мазка кисти, формирование сложного изображения, состо- ящего из нескольких рисунков, моделирование прозрачности и устранение неровно- стей контуров объектов сцены. В большей части графических пакетов предлагаются различные способы создания разных эффектов смешивания цветов. Эти процедуры называются функциями смешивания цветов или функциями составления изображе- ний. В пакете OpenGL цвета двух объектов можно смешать, сначала загрузив в буфер кадра один объект, а затем объединив цвет второго объекта с цветом из буфера кадра. Текущий цвет в буфере кадра называется в OpenGL цветом назначения, а цвет вто- рого объекта — цветом источника. Смешивание можно выполнять только в режиме RGB или RGBA. Чтобы применить смешивание цветов в приложении, сначала нужно активизировать эту возможность пакета OpenGL с помощью такой функции: glEnable (GL_BLEND); Чтобы отключить стандартные процедуры смешивания цветов, в OpenGL исполь- зуется функция glDisable (GL_BLEND);
274 Глава 4. Атрибуты графических примитивов Если возможность смешивания цветов не активизирована, цвет объекта просто заменит цвет, записанный в буфере кадра в положении этого объекта. Цвета можно смешивать несколькими различными способами, в зависимости от эффекта, которого требуется достичь, а различные цветовые эффекты возникают при задании двух наборов коэффициентов смешивания. Один набор коэффициентов смешивания задается для текущего объекта в буфере кадра (“объект назначения”), а второй набор коэффициентов — для нового объекта (“источник”). Новый смешанный цвет, который затем загружается в буфер кадра, находится как (SrRs + DrRd, SgGs + DgGd, SbBs + DbBd, SaAs + DaAd), (4.1) где цветовые компоненты RGBA источника — (Rs, Gs, Bs, As}, цветовые компо- ненты назначения — (Rd, Gd, Bd, Ad), коэффициенты смешивания источника — (Sr, Sg, Sb, Sa), а коэффициенты смешивания назначения — (Dr, Dg, Db, Da). Най- денные значения компонентов комбинированного цвета должны попадать в диапазон от 0.0 до 1.0. Следовательно, любой сумме, превышающей 1.0, присваивается значе- ние 1.0, а любой сумме, меньшей, чем 0.0, присваивается значение 0.0. Значения коэффициентов смешивания выбираются с помощью следующей функ- ции OpenGL: glBlendFunc (sFactor, dFactor); Каждому из параметров sFactor и dFactor, т.е. коэффициентам источни- ка и назначения, присваиваются символьные константы OpenGL, задающие пред- определенный набор из четырех коэффициентов смешивания. Например, константа GL_ZERO дает коэффициенты смешивания (0.0, 0.0, 0.0, 0.0), а константа GL_ONE дает набор (1.0, 1.0, 1.0, 1.0). Можно присвоить всем четырем коэффициентам смеши- вания либо значение альфа назначения, либо значение альфа источника, что делается с помощью константы GL_DST_ALPHA или GL_SRC_ALPHA. К числу остальных кон- стант OpenGL, с помощью которых задаются коэффициенты смешивания, относят- ся GL_ONE_MINUS_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_DST_COLOR и GL_SRC_COLOR. Эти коэффициенты смешивания часто используются для модели- рования прозрачности, и они подробно рассматриваются в разделе 10.19. По умол- чанию параметру sFactor присваивается значение GL_ONE, а значение параметра dFactor по умолчанию равно GL_ZERO. Следовательно, по умолчанию значения ко- эффициентов смешивания приводят к тому, что новые цветовые значения заменяют текущие значения в буфере кадра. В библиотеку GLUT пакета OpenGL включены дополнительные функции, в част- ности, процедура установки смешанного цвета и процедура задания уравнения сме- шивания.
4.3. Функции цвета в OpenGL 275 ЦВЕТОВЫЕ МАССИВЫ В OpenGL Цветовые значения для описания сцены можно также задавать вместе с координат- ными значениями в массиве вершин (раздел 3.17). Это можно сделать либо в режиме RGB, либо в индексном цветовом режиме. Как и для массива вершин, сначала нужно активизировать возможность создания цветового массива OpenGL: glEnableClientState (GL_COLOR_ARRAY); Затем для цветового режима RGB задается положение и формат цветовых компо- нентов с помощью функции glColorPointer (nColorComponents, dataType, offset, colorArray); Параметру nColorComponents присваивается значение 3 или 4, в зависимости от того, заносятся ли в массив colorArray цветовые компоненты RGB или RGBA. Символьная константа OpenGL GL_INT или GL_FLOAT присваивается параметру dataType и указывает на тип данных цветовых значений. Для отдельного цветового массива параметру offset можно присвоить значение 0. Однако, если в одном массиве комбинируется информация о цвете с информацией о вершинах, значением параметра offset должно быть количество битов между каждым набором цветовых компонентов в массиве. Чтобы проиллюстрировать использование цветовых массивов, несколько изме- ним пример массива вершин из раздела 3.17, чтобы включить в него цветовой массив. С помощью следующего кода устанавливается синий цвет всех вершин на лицевой грани куба, а все вершины на обратной стороне окрашиваются в красный цвет. typedef GLint vertex3 [3], color3 [3]; vertex3 pt [8] = 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1 ; color3 hue [8] = 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1 ; glEnableClientState (GL_VERTEX_ARRAY); glEnableClientState (GL_COLOR_ARRAY); glVertexPointer (3, GL_INT, 0, pt); glColorPointer (3, GL_INT, 0, hue); Можно даже поместить цветовые значения и координаты вершин в один объеди- ненный массив. В таком случае каждый указатель будет связан с одним объединенным массивом с соответствующим значением параметра offset. Например, static GLint hueAndPt [ ] = 1, o, 0, 0, 1, o, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, o, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, o, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, o, 0, 1, 1, 1, 1; glVertexPointer (3, GL _INT, 6*sizeof(GLint), hueAndPt [3]) glColorPointer (3, GL_INT, 6*sizeof(GLint) , hueAndPt [0]);
276 Глава 4. Атрибуты графических примитивов Первые три элемента этого массива задают цветовое значение RGB, следующие три значения — набор координат вершины (х, у, z), и такой порядок сохраняется до последнего описания цвета и вершины. Параметр offset устанавливается равным количеству байтов между соседними цветовыми значениями или значениями коорди- нат вершин, которое в обоих случаях равно 6*sizeof (GLint). Цветовые значения начинаются с первого элемента объединенного массива, который равен hueAndPt [ 0 ], а значения координат вершин начинаются с четвертого элемента, который равен hueAndPt [ 3 ]. Поскольку сцена, как правило, состоит из нескольких объектов, у каждого из кото- рых есть множество плоских поверхностей, в пакете OpenGL предлагается функция, определяющая сразу все массивы вершин и цветов, а также другие виды информа- ции. Если заменить цветовые значения и координаты вершин из вышеприведенного примера на значения с плавающей запятой, то можно воспользоваться этой функцией: gllnterleavedArrays (GL_C3F_V3F, 0, hueAndPt); Первый параметр — это константа OpenGL, которая указывает на то, что и цвет (С), и координаты вершин (V) описываются с помощью трехкомпонентных значений с плавающей запятой. Элементы массива hueAndPt должны объединяться с цветовым значением для каждой вершины из списка перечисленных перед этим координат. Кроме того, эта функция автоматически активизирует как цветовые массивы, так и массивы координат. В индексном цветовом режиме массив цветовых индексов задается с помощью функции gllndexPointer (type, stride, colorindex); Цветовые индексы перечисляются в массиве colorindex, а параметры type и stride такие же, как и в функции glColorPointer. Параметр size не нужен, поскольку индексы цветовой таблицы описываются с помощью одного значения. ДРУГИЕ ФУНКЦИИ ЦВЕТА В OpenGL В первом примере программы в разделе 2.9 мы ввели следующую функцию, которая служит для выбора цветовых компонентов RGB для окна изображения. glClearColor (red, green, blue, alpha); Каждому цветовому компоненту в этом обозначении (красному, зеленому и си- нему), а также параметру альфа присваивается значение с плавающей запятой в диапазоне от 0.0 до 1.0. По умолчанию значения всех четырех параметров равны 0.0, что дает черный цвет. Если каждому цветовому компоненту присвоить значение 1.0, то цветом чистого окна изображения будет белый. Оттенки серого цвета можно по-
4.4. Атрибуты точек 277 лучить при одинаковых значениях всех цветовых компонентов в диапазоне от 0.0 до 1.0. Четвертый параметр alpha представляет собой опцию для смешивания преды- дущего цвета с текущим цветом. Смешивание происходит только в том случае, если активизирована возможность смешивания OpenGL; смешивание цветов невозможно, если значения задаются в виде цветовой таблицы. Как отмечалось в разделе 3.19, в пакете OpenGL существует несколько буферов цвета, которые можно использовать в качестве текущего буфера регенерации при изображении сцены, а функция glClearColor служит для спецификации цвета во всех цветовых буферах. После этого к цветовым буферам применяется операция за- крашивания цветом чистого окна изображения, что выполняется с помощью команды: glClear (GL_COLOR_BUFFER_BIT); С помощью функции glClear можно также задать исходные значения других буферов, существующих в OpenGL. Это буфер накопления, в котором хранится ин- формация о смешанных цветах, буфер глубины, содержащий значения глубины (рас- стояния до точки наблюдения) объектов сцены, и буфер шаблонов, в котором хранятся данные, определяющие границы рисунка. В индексном цветовом режиме для задания цвета окна изображения используется следующая функция (вместо glClearColor). glClearlndex (index); После выполнения этой команды цвету фона присваивается цвет, который за- писан в позиции index в цветовой таблице. При вызове функции glClear (GL_COLOR_BUFFER_BIT) окно изображается именно в этом цвете. В библиотеке OpenGL существует множество других функций для задания цвета, подходящих для выполнения различных заданий: изменения цветовых моделей, на- стройки эффектов освещения сцены, описания эффектов камеры и закрашивания по- верхностей объекта. Другие цветовые функции будут рассматриваться при изучении каждого отдельного процесса в системе компьютерной графики. На данный момент ограничимся обсуждением только тех функций, которые связаны со спецификацией цвета графических примитивов. 4.4. АТРИБУТЫ ТОЧЕК В основном задаются два атрибута точек: цвет и размер. В системе состояний цвет и размер изображаемой точки определяются по текущим значениям, записанным в списке атрибутов. Цветовые компоненты задаются с помощью значений RGB или как элементы цветовой таблицы. В растровых системах размер точки — это целое число, кратное размеру пикселя, так что большие точки изображаются как квадратные блоки пикселей.
278 Глава 4. Атрибуты графических примитивов 4.5. Рис. 4.2. Растровая линия двойной ширины с танген- сом угла наклона |т| < 1,0, построенная с помо- щью вертикальных полос пикселей АТРИБУТЫ ПРЯМЫХ ЛИНИЙ Прямолинейный отрезок можно изобразить с помощью трех основных атрибутов: цвета, ширины и стиля. Цвет прямой линии, как правило, задается с помощью той же самой функции, что и для всех графических примитивов, тогда как ширина и стиль линии выбираются с помощью отдельных функций для прямых линий. Кроме того, прямые линии могут изображаться с использованием таких дополнительных эффектов, как мазки кисти или пера. ШИРИНА ПИНИИ Реализация опций ширины линии зависит от возможностей устройства вывода. Ши- рокие линии на мониторе могут изображаться как расположенные рядом друг с дру- гом параллельные линии, тогда как для перьевого графопостроителя изображение широкой линии требует смены пера. В растровых системах линии стандартной ширины строятся путем использова- ния одного пикселя в каждой точке выборки, как в алгоритме Брезенхема (Bresen- ham). Более широкие линии изображаются кратными положительному целому числу стандартных линий, для чего добавляются дополнительные пиксели на соседних па- раллельных линиях. Если тангенс угла наклона прямой линии меньше или равен 1, стандартную процедуру для построения прямой линии можно изменить таким об- разом, чтобы широкие линии строились как изображения небольших вертикальных полос пикселей в каждом столбце (координата х) на траектории прямой. Количество пикселей, которое следует изображать в каждом столбце, устанавливается равным целому значению ширины линии. На рис. 4.2 изображена прямая линия с двойной шириной, полученная путем построения параллельной линии, проходящей над тра- екторией заданной линии. В каждой точке выборки х находится соответствующее значение координаты у и изображаются пиксели с экранными координатами (х, у) и (х, у + 1). Можно построить прямую линию с шириной 3 или больше, попеременно откладывая пиксели сверху и снизу от траектории прямой с единичной шириной.
4.5. Атрибуты прямых линий 279 Рис. 4.3. Растровая прямая линия с тан- генсом угла наклона |m| > 1,0 и шириной линии 4, построенная с помощью горизон- тальных полос пикселей Если тангенс угла наклона прямой линии превышает 1, широкие линии можно изображать с помощью горизонтальных полос, поочередно прибавляя пиксели справа и слева от траектории прямой. Эта схема показана на рис. 4.3, где прямолинейный отрезок с шириной 4 строится с помощью нескольких пикселей в каждой строке раз- вертки. Аналогично широкую линию с тангенсом угла наклона, который меньше или равен 1,0, можно изобразить с помощью вертикальных полос пикселей. Чтобы реа- лизовать эту процедуру, следует сравнить величины горизонтальных и вертикальных расстояний (Ах и Ау) между концами отрезка прямой. Если |Ах| > | Ау|, то допол- нительные пиксели изображаются в столбцах. В противном случае дополнительные пиксели изображаются в строках. Несмотря на то что широкие линии можно быстро построить, откладывая верти- кальные или горизонтальные полосы пикселей, ширина изображаемой линии (изме- ренная перпендикулярно к направлению прямой) зависит от тангенса угла ее наклона. Линия с углом наклона 45° будет в 1/\/2 раз тоньше по сравнению с горизонтальной или вертикальной прямой, построенной с помощью полос пикселей такой же длины. Еще одна проблема, связанная с выбором ширины с помощью горизонтальных или вертикальных полос пикселей, состоит в том, что этот метод дает линии, концы которых вертикальны или горизонтальны, независимо от угла наклона самой прямой. Это особенно заметно при использовании очень широких линий. Форму концов ли- ний можно подправить, чтобы они выглядели лучше, прибавив к ним наконечники (рис. 4.4). Один из видов наконечников для прямой линии — это стыковое перекры- тие, для которого характерны прямоугольные края, перпендикулярные к направле- нию прямой. Если тангенс угла наклона заданной прямой равен т, то тангенс угла наклона прямоугольных концов широкой линии будет —1/т. Тогда на каждом конце заданной прямой каждая из составляющих ее параллельных линий будет изображать- ся между двумя перпендикулярными линиями. Еще один наконечник прямой линии —
280 Глава 4. Атрибуты графических примитивов Рис. 4.4. Широкие линии, построенные с помощью стыковых перекрытий (панель а), овальных перекрытий (панель б) и проекционных прямоугольных перекрытий (панель в) Рис. 4.5. Отрезки широких линий, соединенные с помощью углового соединения (панель а), скругленного соединения (панель б) и косого соединения (панель в) это овальное перекрытие, которое получается путем прибавления закрашенного по- лукруга к каждому стыковому перекрытию. Центры этих полукругов находятся в середине широкой линии, а их диаметр равен ширине линии. Третий вид наконеч- ников — это проекционное прямоугольное перекрытие. В этом случае прямая просто продолжается, и к ней прибавляются стыковые перекрытия, которые расположены на расстоянии половины ширины линии от заданных концов отрезка. К числу других способов создания широких линий можно отнести изображение прямой линии в виде закрашенного прямоугольника или создание линии с помощью выбранной модели пера или кисти, что будет обсуждаться в следующем разделе. Что- бы получить описание границ прямой в виде прямоугольника, рассчитываются ко- ординаты вершин прямоугольника, находящихся на перпендикулярах к направлению прямой, чтобы координаты вершин прямоугольника были удалены от точки конца заданной прямой на расстояние, равное половине ширины прямой. Прямоугольная линия, полученная таким способом, выглядит так, как показано на рис. 4.4, а. К закрашенному прямоугольнику можно добавить овальные перекрытия или увели- чить длину прямой таким образом, чтобы получились проекционные прямоугольные перекрытия. Для создания широких ломаных линий необходимы дополнительные действия. В общем случае, с помощью рассмотренных нами методов для построения отдельного отрезка прямой нельзя построить серию прямолинейных отрезков, непрерывно со- единяющихся друг с другом. При изображении широких ломаных линий с помощью
4.5. Атрибуты прямых линий 281 горизонтальных и вертикальных полос пикселей, например, остаются промежутки на границах между двумя отрезками с различными углами наклона, особенно в местах перехода от горизонтальных полос пикселей к вертикальным. Широкую ломаную линию, части которой непрерывно соединяются друг с другом, можно построить за счет дополнительной обработки концов отдельных отрезков. На рис. 4.5 показаны три возможных способа непрерывного соединения двух прямолинейных отрезков. Угло- вое соединение выполняется путем продолжения внешних границ каждого из двух прямолинейных отрезков до тех пор, пока они не пересекутся друг с другом. Скруг- ленное соединение получается, если место соединения двух отрезков перекрывается кругом, диаметр которого равен ширине линии. А косое соединение получается при изображении прямолинейных отрезков со стыковыми перекрытиями и закрашивании треугольного промежутка в том месте, где пересекаются эти отрезки. Если угол меж- ду двумя соединяющимися отрезками очень мал, угловое соединение может привести к появлению очень длинного острия, которое испортит внешний вид ломаной линии. В графических пакетах этого эффекта можно избежать путем перехода от углового соединения к косому в том случае, например, когда угол между двумя соседними отрезками очень мал. СТИЛЬ ЛИНИИ К возможным вариантам выбора атрибута стиля прямой линии можно отнести сплош- ные линии и различные виды пунктира. Алгоритм построения прямой линии можно изменить таким образом, чтобы с его помощью можно было создавать линии, зада- вая длину изображаемых сплошных участков, расположенных на траектории прямой линии, и расстояние между ними. Во многих графических пакетах можно выбирать как длину самих штрихов пунктира, так и расстояние между ними. В растровых алгоритмах изображения прямых линий атрибуты стиля линии изоб- ражаются путем нанесения полос пикселей. Для создания штрихованных, пунктир- ных и штрихпунктирных узоров процедура построения прямой линии выдает участки следующих друг за другом пикселей, расположенных на прямой линии, перескакивая через несколько промежуточных пикселей между сплошными полосами. Количество пикселей, определяющее длину полосы и расстояние между отдельными полосами, задается с помощью пиксельной маски, которая представляет собой узор из двоичных чисел, сообщающий, какие точки, лежащие на прямой, следует изображать. Линейная маска 11111000, например, может быть использована для изображения пунктирной линии с длиной штриха в пять пикселей и расстоянием между штрихами в три пиксе- ля. Пиксели, координатам которых соответствуют биты со значением 1, изображаются в текущем цвете, а пиксели, координатам которых соответствуют биты со значением 0, изображаются цветом фона. Построение штрихов с помощью фиксированного количества пикселей приводит к разной длине штрихов при различных ориентациях прямой линии (рис. 4.6). Оба
282 Глава 4. Атрибуты графических примитивов Рис. 4.6. Штрихи разной дли- ны, которые изображаются с помощью одинакового количе- ства пикселей 6) штриха, показанные на этом рисунке, состоят из четырех пикселей, но диагональный пиксель длиннее в л/2 раза. Для точных чертежей длина штрихов должна оставаться приблизительно постоянной для любой ориентации прямой. Чтобы выполнялось это условие, количество пикселей в сплошных полосах и в промежутках между полосами нужно подбирать в соответствии с углом наклона прямой. Можно сделать так, чтобы два штриха, изображенные на рис. 4.6, были приблизительно одинаковой длины, уменьшив длину диагонального штриха до трех пикселей. Еще один способ сохранить длину штриха — это рассматривать штрихи как отдельные прямолинейные отрезки. Для этого координаты концов каждого штриха используются в процедуре построения прямой линии, с помощью которой и находятся положения пикселей на траектории прямой линии. ОПЦИИ ПЕРЬЕВ И КИСТЕЙ В некоторых пакетах, особенно в системах рисования и черчения, можно непосред- ственно выбирать различные виды перьев и кистей. К опциям этой категории от- носятся форма, размер и узор пера или кисти. Некоторые примеры формы перьев и кистей показаны на рис. 4.7. Эти формы можно записывать в пиксельную мас- ку, которая служит для определения массива координат пикселей, которые должны изображаться на траектории прямой линии. Например, след от прямоугольного пера можно реализовать с помощью маски, показанной на рис. 4.8, перемещая центр (или один из углов) маски по траектории прямой линии, как показано на рис. 4.9. Чтобы избежать повторного занесения пикселей в буфер кадра, можно просто накапливать горизонтальные полосы, появляющиеся в каждом положении маски, и следить за координатами х начала и конца полосы в каждой строке развертки. Прямые линии, изображаемые с помощью перьев (или кистей) разной формы, могут быть различной ширины, если изменять размер маски. Например, показанную на рис 4.9 линию, полученную с помощью прямоугольного пера, можно сделать уже, уменьшив размеры маски до 2 на 2, или шире, увеличив маску до 4 на 4. Кроме того, можно изображать прямые линии с выбранным узором, накладывая узор на маску пера или кисти.
4.5. Атрибуты прямых линий 283 а) Рис. 4.8. Пиксельная маска (па- нель а) для прямоугольного пера и связанный с ней массив пикселей (панель б), который изображается при размещении центра маски в за- данных положениях пикселей
284 Глава 4. Атрибуты графических примитивов Рис. 4.9. Изображение прямой линии с помощью пера, форма которого показана на рис. 4.8 4.6. АТРИБУТЫ КРИВЫХ Параметры атрибутов кривых линий не отличаются от параметров отрезков прямых. Изображаемые кривые могут быть различных цветов, ширин, могут иметь различные штрихпунктирные узоры, доступны также и возможности рисования пером или ки- стью. Методы адаптации алгоритмов для построения кривых линий и возможности выбора атрибутов такие же, как и при построении прямых линий. Растровые кривые различной ширины можно изображать с помощью метода вер- тикальных или горизонтальных полос пикселей. Там, где величина тангенса угла на- клона кривой меньше или равна 1,0, откладываются вертикальные полосы; там, где эта величина превышает 1,0, откладываются горизонтальные полосы. На рис. 4.10 данный метод проиллюстрирован для изображения дуги окружности, ширина кото- рой равна 4, в первом квадранте. Благодаря симметрии построена часть окружности из вертикальных полос в октанте от х = 0 до х = у, затем мы отразили положе- ния пикселей относительно прямой у = х и получили оставшуюся часть кривой. Участки окружности в остальных квадрантах находятся путем отражения положений пикселей из первого квадранта относительно координатных осей. Толщина линий, изображаемых таким способом, является функцией угла наклона кривой. В тех ме- стах, где величина тангенса угла наклона равна 1, окружности, эллипсы и другие кривые кажутся тоньше. Еще один способ изображения широких кривых — закрасить область между дву- мя параллельными кривыми, расстояние между которыми равно требуемой ширине линии. Это можно сделать, воспользовавшись заданной кривой в качестве одной границы и проведя вторую границу либо внутри, либо снаружи исходной траекто- рии кривой. Однако при таком подходе исходное положение кривой смещается либо внутрь, либо наружу в зависимости от того, какое направление выбрано для второй
4.6. Атрибуты кривых 285 Рис. 4.10. Дуга окружности с шириной 4, постро- енная с помощью вертикальных либо горизон- тальных полос пикселей в зависимости от угла наклона кривой Рис. 4.11. Дуга окружности с шириной 4 и радиусом 16, построенная путем закрашивания области между двумя концентрическими дугами границы. Исходное положение кривой можно сохранить, задав две границы кривой на расстоянии, равном половине ширины этой кривой, в каждую сторону от заданной траектории кривой. Пример такого подхода для фрагмента окружности с радиусом 16 и шириной 4 показан на рис. 4.11. В данном случае дуги-границы задаются на расстоянии 2 по обе стороны от окружности радиуса 16. Чтобы сохранить нужные размеры дуги окружности (см. раздел 3.13), можно задать радиусы концентрических дуг-границ как г = 14 и г = 17. Хотя данный метод позволяет точно изобразить широкие окружности, площадь других широких кривых в общем случае он передает только приблизительно. Например, фокусы внешней и внутренней границ широкого эллипса, построенного таким способом, не совпадают. Пиксельные маски, которые применяются для реализации прямых линий, мож- но использовать и в растровых алгоритмах для построения кривых и создавать с их помощью штрихованные или пунктирные узоры. Например, маска 11100 дает пунк- тирную окружность, показанную на рис. 4.12. Используя свойства симметрии, можно
286 Глава 4. Атрибуты графических примитивов Рис. 4.12. Пунктирная дуга окружности, изображен- ная с помощью полос длиной 3 пикселя с расстоянием между штрихами 2 пикселя построить штрихи в различных октантах, но для сохранения правильной последова- тельности штрихов и промежутков между ними при переходе от одного октанта к следующему нужно будет смещать положения пикселей. Кроме того, в алгорит- мах построения прямолинейных отрезков с помощью пиксельных масок изображают штрихи и промежутки между ними, имеющие различную длину вне зависимости от наклона кривой. Если требуется изобразить штрихи одинаковой длины, нужно при перемещении по окружности подбирать количество пикселей в каждом штрихе. Что- бы получить штрихи одинаковой длины, не применяя пиксельную маску с равными полосами, можно наносить пиксели через одинаковые угловые расстояния. Изображение кривых с помощью пера (или кисти) выполняется с помощью тех же методов, что используются для прямолинейных отрезков. Форма пера повторя- ется на всей траектории кривой, как показано на рис. 4.13 для дуги окружности в первом квадранте. Здесь центр прямоугольного пера перемещается в последующие положения на кривой, при этом получается показанная на рисунке кривая. Постро- енные таким образом кривые будут шире в тех местах, где величина тангенса угла наклона кривой равна 1. Кривую однородной ширины можно изобразить, поворачи- вая прямоугольное перо таким образом, чтобы оно совпадало с направлением кривой при перемещении по ней, или используя перо круглой формы. Кривые, изображае- мые с помощью перьев и кистей различной формы, могут иметь разный размер, и имитировать мазки кисти, также на них можно накладывать узоры. Программы рисования и черчения позволяют создавать рисунки в интерактивном режиме с помощью таких устройств-указателей, позволяющих изображать кривые различной формы, как перо и графический планшет. Несколько примеров узоров из таких кривых показано на рис. 4.14. Дополнительной опцией узора, предлагаемой в пакетах рисования, является имитация мазков кисти. На рис. 4.15 показано несколько узоров, которые можно получить, моделируя различные виды мазков кисти.
4.7. Функции атрибутов точек в OpenGL 287 Рис. 4.13. Дуга окружности, нарисованная с помощью прямоугольного пера Рис. 4.14. Кривые линии, нарисованные с применением раз- личных форм и узоров. Слева направо: кисть в форме квадрата, круга, диагональной линии, точечного узора и выцветшего аэро- графа Рис. 4.15. Кукла дарума (daruma), сим- вол удачи в Японии, нарисованная ком- пьютерным художником Кончи Козаки (Koichi Kozaki) с помощью процедуры программы рисования кистью. Куклы да- рума, как правило, делаются без глаз. Один глаз рисуется тогда, когда загады- вается желание, а другой — тогда, когда это желание исполняется (перепечатано с разрешения корпорации Wacom Tech- nology, Corp.) 4.7. ФУНКЦИИ АТРИБУТОВ ТОЧЕК В OpenGL Цвет изображаемой точки зависит от текущих цветовых значений в списке состоя- ний. А задается цвет либо с помощью функции glColor, либо с помощью функ- ции gl Index. Размер точки в OpenGL задается командой glPointSize (size); Точка изображается как квадратный блок пикселей. Параметру size присваи- вается положительное значение с плавающей запятой, которое округляется до це-
2ВВ Глава 4. Атрибуты графических примитивов лого числа (если только не нужно устранять неровности краев точки). Параметром size определяется количество горизонтальных и вертикальных пикселей, составля- ющих изображение точки. Таким образом, при размере точки 1,0 изображается один пиксель, а при размере точки 2,0 — массив пикселей 2 на 2. Если активизирована способность пакета OpenGL сглаживать неровности краев объектов, то размер изоб- ражаемого блока пикселей будет соответствующим образом меняться. По умолчанию размер точки равен 1,0. Функции атрибутов могут перечисляться внутри пары glBegin/glEnd и вне ее. Например, следующий фрагмент программы изображает три точки разного цвета и размера. Первая точка имеет стандартный размер и красный цвет, вторая — двойной размер и зеленый цвет, третья — синяя тройного размера. glColor3f (1.0, 0.0, 0.0); glBegin (GL_POINTS); glVertex2i (50, 100); glPointSize (2.0); glColor3f (0.0, 1.0, 0.0); glVertex2i (75, 150); glPointSize (3.0); glColor3f (0.0, 0.0, 1.0); glVertex2i (100, 200); glEnd ( ); 4.8. ФУНКЦИИ АТРИБУТОВ ПРЯМЫХ линий В OpenGL Внешний вид прямолинейного отрезка в OpenGL определяется тремя атрибутами: цветом, шириной и стилем. Мы уже рассматривали, как можно выбирать цвет, так- же в пакете OpenGL предлагаются функции, описывающие ширину и стиль линии (например, пунктир или штрихпункгир). ФУНКЦИЯ ДЛЯ ЗАДАНИЯ ШИРИНЫ ЛИНИИ В OpenGL В OpenGL ширина линии задается с помощью функции glLineWidth (width); Параметру width присваивается значение с плавающей запятой, которое затем округляется до ближайшего неотрицательного целого числа. Если входное значение округляется до 0,0, изображаемая линия будет иметь стандартную ширину 1,0 (по умолчанию). Однако, если к данной линии применить операцию сглаживания, ее края изменятся, чтобы компенсировать растровый “эффект зубцов”, и тогда возможны дробные значения ширины. Отметим, что одни версии функции поддерживают только ограниченное число ширин, а другие не поддерживают ширины, отличные от 1,0.
4.8. Функции атрибутов прямых линийв OpenGL 289 Функция OpenGL для задания ширины линии реализована с помощью методов, описанных в разделе 4.5. Это означает, что между собой сравниваются величины го- ризонтального и вертикального расстояний между концами прямолинейного отрезка (Дт и Ду), и определяется, как следует изображать широкую линию — с помощью вертикальных или горизонтальных полос пикселей. ФУНКЦИЯ OpenGL СТИЛЯ ЛИНИИ По умолчанию прямолинейный отрезок изображается в виде сплошной линии. В то же время можно изображать штрихованные, пунктирные линии, а также линии, состоящие из различных комбинаций точек и штрихов. Кроме того, можно варьи- ровать длину штрихов и расстояние между точками или штрихами. Текущий стиль изображения линий задается с помощью следующей функции OpenGL. glLineStipple (repeatFactor, pattern); Параметр pattern (шестнадцатеричное целое число) указывает, как должна изображаться та или иная линия. В этом шаблоне 1 означает положение пикселя “включено”, а 0 — “выключено”. Данный шаблон применяется к пикселям, располо- женным на прямой, начиная с младших разрядов шаблона. По умолчанию шаблон имеет вид OxFFFF (в каждом положении стоит значение 1), что соответствует сплош- ной линии. Целочисленный параметр repeatFactor сообщает, сколько раз должен повторяться каждый разряд в шаблоне перед применением следующего разряда. По умолчанию число повторов равно 1. Для ломаной линии заданный узор стиля линии не возобновляется в начале каж- дого отрезка. Он непрерывно продолжается на протяжении всех отрезков, начинаясь в первой точке ломаной линии и заканчиваясь в последней точке последнего отрезка данной серии. Предположим, что параметру pattern присвоено шестнадцатеричное значение OxOOFF, а коэффициент повтора равен 1. При таком шаблоне изобразится штрихо- ванная линия, каждый штрих которой будет состоять из восьми пикселей, а между каждыми двумя штрихами будет по восемь пикселей в положении “выключено”. Кроме того, поскольку сначала применяются пиксели младшего разряда, линия будет начинаться с восьмипиксельного штриха, расположенного в первой точке отрезка. После этого штриха будет идти восьмипиксельное пустое расстояние, а затем еще один восьмипиксельный штрих и так далее до последней точки отрезка. Перед изображением линии с помощью текущего шаблона нужно активизировать возможность OpenGL построения линий различного стиля. Для этого в программу вводится следующая команда. glEnable (GL_LINE_STIPPLE);
290 Глава 4. Атрибуты графических примитивов Если мы забудем включить эту функцию активизации, будут изображаться толь- ко сплошные линии; т.е. для изображения прямолинейных отрезков используется шаблон по умолчанию OxFFFF. В любой момент возможность построения линий различного стиля можно отключить, воспользовавшись такой функцией. glDisable (GL_LINE_STIPPLE); Указанная функция меняет текущий шаблон стиля линии на значение, использу- емое по умолчанию (сплошные линии). Следующий фрагмент кода иллюстрирует, как в OpenGL можно использовать функции атрибутов прямых линий при построении трех линейных графиков линями различного стиля и разной ширины. На рис. 4.16 показан график, получаемый при выполнении данной программы. /* Определяется тип данных двухмерной внешней системы координат. */ typedef struct { float х, у; } wcPt2D; wcPt2D dataPts [5] ; void linePlot (wcPt2D dataPts [5]) { int k; glBegin (GL_LINE_STRIP) ; for (k = 0; k < 5; k++) glVertex2f (dataPts [k].x, dataPts [k].y); glFlush ( ); glEnd ( ); 1 /* Обращение к процедуре изображения координатных осей.*/ glEnable (GL_LINE_STIPPLE); /* Вводится первый набор значений данных (х, у).*/ glLineStipple (1, 0x1047); /* Строится штрихпунктирная ломаная линия стандартной ширины.*/ linePlot (dataPts); /* Вводится второй набор значений данных (х, у).*/ glLineStipple (1, OxOOFF); /* Строится штрихованная ломаная линия двойной ширины.*/ glLineWidth (2.0); linePlot (dataPts); /* Вводится третий набор значений данных (х, у).*/ glLineStipple (1, 0x0101); /* Строится пунктирная ломаная линия тройной ширины.*/ glLineWidth (3.0); linePlot (dataPts); glDisable (GL_LINE_STIPPLE);
4.8. Функции атрибутов прямых линийв OpenGL 291 Рис. 4.16. Построение трех графиков данных с помощью трех различных стилей и ширин линий: одинарный штрих- пунктирный шаблон, двойной штрихованный шаблон и тройной пунктирный шаблон ДРУГИЕ ЭФФЕКТЫ ПРЯМЫХ ЛИНИЙ В OpenGL OpenGL позволяет не только описывать ширину, стиль и цвет всей линии, но и зада- вать линии с градацией цветовых оттенков. Например, цвет сплошной линии можно изменять, присваивая при определении прямой линии различные цветовые значения разным концам отрезка. В следующем фрагменте программы эта возможность ил- люстрируется следующим образом: на одном конце линии задается синий цвет, а на другом — красный. Затем сплошная линия изображается с помощью линейной интерполяции кодов заданных концов линии. glShadeModel (GL_SMOOTH); glBegin (GL_LINES); glColor3f (0.0, 0.0, 1.0); glVertex2i (50, 50); glColor3f (1.0, 0.0, 0.0); glVertex2i (250, 250); glEnd ( ); Аргументом функции glShadeModel может быть GL_FLAT. В этом случае прямо- линейный отрезок изображается одним цветом — цветом второго конца (250, 250). Следовательно, получается красная линия. В действительности аргумент GL_SMOOTH задается по умолчанию, поэтому отрезок с непрерывной градацией цвета получается даже тогда, когда в программу эта функция не включена. Чтобы получить другие эффекты, соседние линии изображаются с помощью раз- личных цветов и шаблонов. Кроме того, можно воспользоваться возможностью сме- шивания цветов, накладывая друг на друга линии и другие объекты с различными значениями альфа. Мазки кисти или другие художественные эффекты моделируют- ся с помощью пиксельного массива и смешивания цветов. Кроме того, пиксельный массив можно перемещать интерактивно и таким образом строить прямолинейные
292 Глава 4. Атрибуты графических примитивов отрезки. Отдельным пикселям из пиксельного массива присваиваются различные зна- чения альфа, в результате чего линии выглядят как нарисованные с помощью кисти или пера. 4.9. АТРИБУТЫ ЗАКРАШЕННЫХ ФИГУР В большинстве графических пакетов закрашенные фигуры ограничиваются много- угольниками, которые можно описать с помощью линейных уравнений. Возможно и более жесткое условие — все закрашенные фигуры должны быть выпуклыми много- угольниками (чтобы строки развертки не пересекались более чем с двумя сторонами границ). Однако в общем случае закрашивать можно любые заданные участки, в том числе окружности, эллипсы и другие объекты с криволинейными границами. Кроме того, такие приложения, как программы рисования, предлагают опции для закраши- вания областей произвольной формы. Существует две процедуры закрашивания участков рисунка в растровых систе- мах, если описание закрашенной области переведено в координаты пикселей. В од- ной процедуре вначале определяются интервалы перекрытия для строк развертки, которые пересекают эту область. Затем пикселям, попадающим в эти интервалы пере- крытия, присваиваются значения, соответствующие узору заполнения. Другой способ заполнения участков рисунка — начать с заданной точки, находящейся внутри этой области, и “зарисовывать пространство” наружу от этой точки, пока не дойдем до того места, где выполняются заданные граничные условия. Метод строк развертки, как правило, применяется для таких простых фигур, как окружности или области с ломаными границами, также этот метод используется в универсальных графических пакетах. Алгоритмы закрашивания, в которых применяется начальная внутренняя точка, полезны при закрашивании участков с более сложными границами, а также в интерактивных системах рисования. СТИЛИ ЗАКРАШИВАНИЯ Основной атрибут закрашенных фигур, предлагаемый в универсальной графической библиотеке, — это стиль изображения внутренней области. Данную область можно заполнить одним цветом или заданным узором, или же оставить ее “чистой”, по- казав только границы фигуры. Названные стили заполнения показаны на рис. 4.17. Кроме того, можно закрашивать выбранные участки сцены с помощью различных видов кистей, комбинаций смешивания цветов или текстур. К числу других опций относятся описания границ закрашенных фигур. Границы многоугольников можно показать другим цветом, они могут иметь разную ширину и выполняться разным стилем. Кроме того, можно выбирать различные атрибуты изображения передней и задней сторон многоугольной области.
4.9. Атрибуты закрашенных фигур 293 а) без закрашивания б) закрашивание одним цветом ♦♦Ж в) заполнение узором Рис. 4.17. Основные стили закрашивания многоугольников Узоры заполнения могут задаваться в форме прямоугольных цветовых массивов, содержащих различные цвета для различных элементов массива, или битовых мас- сивов, в которых указывается, какие относительные положения следует изображать одним выбранным цветом. Массив, с помощью которого описывается узор запол- нения, называется маской, и он применяется к области изображения. В некоторых графических системах возможен выбор произвольного исходного положения, с кото- рого маска многократно повторяется в горизонтальном и вертикальном направлениях до тех пор, пока вся область изображения не будет заполнена неперекрывающимися копиями узора. В тех местах, где на заданные закрашенные участки накладывается узор, из массива узора определяется, какие пиксели следует изображать определен- ным цветом. Данный процесс заполнения области с помощью прямоугольного шаб- лона называется клеточным заполнением, а прямоугольный узор заполнения иногда называют ячейкой узора. Система может содержать предопределенные узоры запол- нения, например, узор в виде штриховки, показанный на рис. 4.18.
294 Глава 4. Атрибуты графических примитивов Диагональная перекрестная штриховка Рис. 4.18. Области, заполнен- Диагональная ные узором штриховки штриховка Чтобы заполнить объект узором, нужно определить места, где узор накладывается на строки развертки, которые пересекают закрашенную область. Начиная с заданно- го стартового положения, прямоугольные шаблоны накладываются вертикально по строкам развертки и горизонтально по положениям пикселей в строках развертки. Каждое повторение массива узора выполняется через промежутки, зависящие от ши- рины и высоты маски. В тех местах, где узор накладывается на закрашенную область, цвет пикселей устанавливается согласно значениям, записанным в маске. Чтобы заполнить отдельные области штриховкой, нужно изобразить набор пря- молинейных отрезков, после чего получается либо одинарная, либо перекрестная штриховка. Расстояние между линиями штриховки и их наклон можно задавать как параметры таблицы штриховки. Кроме того, узор штриховки можно задать в виде массива узора — набора диагональных прямых линий. Опорная точка (хр, ур) стартового положения узора заполнения выбирается в любом удобном месте (внутри или за пределами закрашиваемой области). Например, в качестве опорной точки можно выбрать вершину многоугольника, или же задать эту точку в левом нижнем углу рабочей области (ограничивающего окна), которая опре- деляется координатными границами данной фигуры. Для упрощения выбора опорных координат в некоторых пакетах в качестве стартового положения всегда выбирается начало координат окна изображения. Более того, постоянное расположение точки (хр, ур) в начале координат упрощает операции клеточного представления, когда каждый элемент узора переносится в отдельный пиксель. Например, если строки в массиве узора нумеруются снизу вверх, начиная со значения 1, то пикселю с экранными ко- ординатами (х, у) присваивается цветовой код точки узора (у mod ny + 1, х mod nx + 1). Здесь через пу и пх обозначено количество строк и количество столбцов массива узора. В то же время, размещение стартового положения узора в начале координат более эффективно при заполнении узором фона экрана, а не отдельных закрашенных областей. Между соседними или перекрывающимися областями, за- полненными одинаковым узором, не будет видна граница, разделяющая эти участки. К тому же, перемещение и повторное закрашивание объекта тем же самым узором может привести к смещению соответствующих значений пикселей внутри объекта. Движущийся объект будет казаться прозрачным телом, передвигающимся относи- тельно стационарного узора фона, а не перемещающимся вместе с узором, которым заполнена его внутренняя область.
4.9. Атрибуты закрашенных фигур 295 Узор Рис. 4.19. Объединение эле- мента узора заполнения с узо- ром фона с помощью логиче- ских операций И, ИЛИ и ис- ключающее ИЛИ, а также про- стой операции замены ОБЛАСТИ, ЗАПОЛНЕННЫЕ С ИСПОЛЬЗОВАНИЕМ СМЕШИВАНИЯ ЦВЕТОВ Существует несколько способов сочетания узора заполнения объектов с цветом фона. Объединять узор с цветом фона можно с помощью коэффициента прозрачности, показывающего, насколько фон должен смешиваться с цветом объекта. Кроме того, можно воспользоваться простыми логическими операциями или операциями замены. На рис. 4.19 показано, как с помощью логических операций и операций замены можно объединять элемент узора заполнения размером 2 на 2 с узором фона для бинарной (черно-белой) системы. Некоторые методы закрашивания с использованием возможности смешивания цветов называются алгоритмами мягкого или бледного окрашивания. Одна из обла- стей применения этих методов заполнения — смягчение цвета заполнения на границах объектов, размытых при сглаживании краев. Другая область применения — возмож- ность повторного закрашивания цветного участка, который изначально был закрашен с помощью полупрозрачной кисти (в таком случае текущим цветом будет смесь цвета кисти и цвета фона “за” этим участком). В любом случае, хотелось бы, чтобы новый цвет заполнения изменялся в пределах данной области точно так же, как и текущий цвет заполнения. В качестве примера заполнения такого типа воспользуемся линейным алгорит- мом мягкого окрашивания и изменим цвет участка, который изначально был закрашен путем слияния цвета переднего плана F с цветом фона В, причем F = В. Предпо-
296 Глава 4. Атрибуты графических примитивов ложив, что значения F и В известны, можно проверить текущее содержание буфера кадра и определить, каким образом были объединены эти два цвета. Текущий цвет RGB Р каждого пикселя в пределах области, которую нужно перекрасить, является некоторой линейной комбинацией цветов F и В: Р = tF + (1 - t)B, (4.2) где коэффициент прозрачности t принимает значение от 0 до 1 для каждого пикселя. Для значений t, которые меньше 0,5, цвет фона дает больший вклад в результирующий цвет объекта, чем сам цвет заполнения. Векторное уравнение (4.2) справедливо для каждого RGB-компонента цвета при Р = (Pr,Pg,Pb), F = (Fr,Fg,Fb), В = (Br,Bg,Bb)- (4.3) Таким образом, значение параметра t можно найти, воспользовавшись одним из RGB- компонентов цвета: где k = R, G или В, a F^ 7^ В^. Теоретически значения параметра t одинаковы для всех RGB-компонентов, но операции округления, которые выполняются для по- лучения целочисленных кодов, могут привести к тому, что значения параметра t для разных компонентов будут различны. Эту ошибку округления можно минимизиро- вать, выбирая компоненты с наибольшей разностью между F и В. Затем полученное значение t используется для смешивания нового цвета заполнения NF с цветом фона. Чтобы это сделать, можно воспользоваться видоизмененными процедурами потоко- вого или граничного заполнения, описанными в разделе 4.13. Аналогичные процедуры смешивания цветов можно применять и к областям, цвет переднего плана которых должен сливаться с несколькими цветами фона, например, с фоном в виде шахматной доски. Если два цвета фона Bi и В2 смешиваются с фоном переднего плана F, то результирующий цвет пикселя Р равен Р = £qF + ^iBi + (1 — to - £1)Вг, (4.5) где сумма коэффициентов цветовых слагаемых to, t± и (1 — to — ii) должна быть равной 1. Воспользовавшись двумя из трех RGB-компонентов цвета, можно записать систему из двух уравнений, и найти из нее коэффициенты пропорциональности to и t^. Затем с помощью этих параметров новый цвет заполнения смешивается с двумя цветами фона, и получается новый цвет каждого пикселя. При использовании трех цветов фона и одного цвета переднего плана (или двух цветов фона и двух цветов переднего плана) для поиска относительных величин четырех составляющих потре-
4.10. Общий вид растрового алгоритма закрашивания многоугольников 297 Рис. 4.20. Внутренние пиксели, лежащие на строке развертки, проходящей через много- угольную закрашиваемую область Строка развертки/ Строка развертки у Рис. 4.21. Точки пересечения, лежащие на строках разверт- ки, проходящих через верши- ны многоугольника. В стро- ке развертки у нечетное, а в строке у' — четное количество точек пересечения, из кото- рых для правильного опреде- ления внутренних полос пик- селей можно составить пары буются все три уравнения для RGB-компонентов. Однако для некоторых сочетаний цветов фона и переднего плана система из двух или трех уравнений RGB не име- ет решения. Это происходит тогда, когда все цветовые значения очень близки или пропорциональны друг другу. 4.10. ОБЩИЙ ВИД РАСТРОВОГО АЛГОРИТМА ЗАКРАШИВАНИЯ МНОГОУГОЛЬНИКОВ Растровое закрашивание участка выполняется следующим образом: сначала находят- ся точки пересечения границ закрашиваемой области со строками развертки экра- на. Затем к каждому участку строки развертки, который лежит внутри закраши- ваемой области, применяются цвета заполнения. В растровом алгоритме внутрен- ние области определяются по тому же принципу, что и при применении правила четного-нечетного (раздел 3.15). Самой простой фигурой для закрашивания является многоугольник, поскольку каждая точка пересечения строки развертки с границей многоугольника находится при решении системы двух линейных уравнений, причем уравнение строки развертки записывается просто как у = const.
298 Глава 4. Атрибуты графических примитивов На рис. 4.20 показана основная растровая процедура заполнения многоугольнш одним цветом. Для каждой строки развертки, пересекающей многоугольник, точк пересечения с его сторонами разделяются на правые и левые, а затем пиксели меж;: этими парами точек пересечения (включая сами эти точки) окрашиваются в заданны цвет заполнения. В примере на рис. 4.20 по четырем точкам пересечения с границам многоугольника определяются две полосы внутренних пикселей. Таким образом, цвс заполнения применяется к пяти пикселям от х = 10 до х — 14 и к семи пикселя от х = 18 от х — 24. Если многоугольник нужно заполнить каким-либо узоров тогда цвет каждого пикселя в строке развертки определяется по его состоянию пр наложении шаблона узора заполнения. Однако растровый алгоритм заполнения многоугольника не так прост, как можн было бы предположить, исходя из рис. 4.20. Если строка развертки проходит черс вершину многоугольника, то нужно учитывать, что в этой точке она пересекается двумя его сторонами. В некоторых случаях при пересечении возникает четное числ точек пересечения строки развертки с границами многоугольника. На рис. 4.21 ш казаны две строки развертки, которые пересекают многоугольную область закрапп вания и проходят через вершины. Строка развертки у' пересекает четное количеств сторон, и по двум парам точек пересечения с этой строкой развертки можно правил! но определить внутренние полосы пикселей. А вот строка развертки у пересекаете с пятью сторонами многоугольника. Поэтому, чтобы найти внутренние области дл строки развертки у, точку пересечения с вершиной нужно считать как одну точк Таким образом, при обработке строк развертки эти два случая нужно различать. Топологическую разницу между строками развертки у и у' на рис. 4.21 можн зафиксировать, рассмотрев положение сторон многоугольника относительно строк развертки, с которой они пересекаются. Для строки развертки у две стороны, им< ющие общую вершину, через которую проходит строка развертки, лежат по разны стороны от самой строки развертки. А для строки развертки у' обе стороны мне гоугольника находятся над строкой развертки. Таким образом, вершину, в которо соединяются стороны, лежащие по разные стороны от пересекающей эту вершин строки развертки, нужно считать как одну точку пересечения с границей. Подобны вершины можно выявить, исследовав всю границу многоугольника либо по часово стрелке, либо против часовой стрелки и рассмотрев относительные изменения кс ординаты вершины у при переходе от одной стороны к другой. Если три значени координаты у концов двух следующих друг за другом сторон монотонно увеличз ваются или уменьшаются, тогда общую (среднюю) вершину нужно считать за одн точку пересечения со строкой развертки, проходящей через эту вершину. В противно случае общая вершина будет представлять собой экстремум (минимум или максимум на границе многоугольника, и тогда к списку точек пересечения можно добавлять дв точки пересечения сторон со строкой развертки, проходящей через эту вершину.
4.10. Общий вид растрового алгоритма закрашивания многоугольников 299 Рис. 4.22. Подбор значений координаты у концов сторон многоугольника при обработке периметра многоугольника. Сторона, которая обрабатывается в данный момент, показана сплошной линией. На панели а координата у верхнего конца текущей стороны уменьшается на 1. На панели б координата у верхнего конца следующей стороны уменьшается на 1 Строка развертки у + 1 Строка развертки у Строка развертки у - I б) Рис. 4.23. Две соседние строки разверт- ки, пересекающиеся с границей много- угольника Один из способов согласования количества вершин и точек пересечения — это сократить некоторые стороны многоугольника, чтобы отделить те вершины, которые следует считать как одну точку пересечения. Негоризонтальные стороны вокруг гра- ницы многоугольника, например, можно обрабатывать либо по часовой стрелке, либо против нее. При обработке каждой стороны можно проверять, будут ли значения координаты у концов этой стороны и следующей за ней монотонно увеличиваться или уменьшаться. Если да, тогда нижнюю сторону можно укоротить, чтобы получа- лась только одна точка пересечения со строкой развертки, проходящей через общую вершину, в которой соединяются эти две стороны. Пример такого укорачивания сто- роны показан на рис. 4.22. Если координаты у концов двух сторон увеличиваются, тогда значение координаты у верхнего конца текущей стороны уменьшается на 1, как показано на рис. 4.22, а. Если же значения координаты у концов сторон монотон- но уменьшаются, как на рис. 4.22, б, тогда мы уменьшаем значение координаты у верхнего конца стороны, следующей за текущей стороной. Как правило, определенные свойства одной части сцены некоторым образом свя- заны со свойствами других частей сцены, и эту когерентность можно использовать в алгоритмах компьютерной графики для сокращения числа выполняемых операций. Когерентные методы часто содержат в себе операции вычисления приростов, которые применяются к одной строке развертки или между соседними строками развертки.
300 Глава 4. Атрибуты графических примитивов Например, при определении точек пересечения со сторонами закрашиваемой фигу- ры можно вычислять прирост координаты вдоль какой-либо стороны, учитывая, что тангенс угла наклона стороны сохраняется при переходе от одной строки развертки к следующей. На рис. 4.23 показаны две соседние строки развертки, пересекающие левую сторону треугольника. Тангенс угла наклона этой стороны можно выразить через координаты точек пересечения со строкой развертки: Ук+1 ~ У к т=------------. (4.6) •^к+1 -^к Поскольку изменение координаты у при переходе от одной строки развертки к другой записывается просто как Ук+1 - У к = 1, (4.7) значение координаты х для точки пересечения x^+i верхней строки развертки мож- но найти из значения координаты х точки пересечения хк с предыдущей строкой развертки: xk+i=xk + —. (4.8) т Таким образом, каждый последующий промежуток по х можно найти, прибавляя к текущему значению величину, обратную тангенсу угла наклона, и округляя результат до ближайшего целого числа. Очевидной параллельной реализацией алгоритма закрашивания является сопо- ставление с каждой строкой развертки, пересекающейся с многоугольником, отдель- ного процессора. Тогда расчет точек пересечения будет выполняться независимо. Вдоль стороны с тангенсом угла наклона т координата точки пересечения хк для строки развертки k, расположенной над исходной строкой развертки, находится как k хк = х0-1----. (4.9) т При реализации последовательного алгоритма закрашивания прирост значений х на величину ~ вдоль одной стороны находится с помощью целочисленных опе- раций, при этом учитывается, что тангенс угла наклона т — это отношение двух целых чисел:
4.10. Общий вид растрового алгоритма закрашивания многоугольников 301 где Да; и Ду — разности между значениями координат х и у концов сторон. Та- ким образом, дифференциальные вычисления отрезков х вдоль одной стороны для соседних строк развертки можно выразить как Дх xk+i=xk + —. (4.10) Ду Приведенное уравнение позволяет сделать целочисленную оценку отрезков по коор- динате х, присвоив счетчику значение 0, а затем увеличивая его на величину Дж при каждом переходе на новую строку развертки. Когда значение счетчика станет равным или превысит Ду, текущее значение координаты х точки пересечения увеличивается на 1, а счетчик уменьшается на значение Ду. Эта процедура эквивалентна сохране- нию целой и дробной частей отрезков х и прибавлению дробной части до тех пор, пока не будет получено следующее целое значение. Предположим, что дана сторона с тангенсом угла наклона т = | На исходной строке развертки счетчику присваиваем значение 0, а величина прироста счетчика равна 3. При переходе к следующим трем строкам развертки по этой стороне счетчик последовательно приобретает значения 3, 6 и 9. На третьей строке развертки от ис- ходной строки значение счетчика превышает 7, поэтому мы увеличиваем координату пересечения х на 1 и присваиваем счетчику значение 9 — 7 = 2. Точки пересечения со строками развертки находятся до тех пор, пока мы не достигнем верхнего конца стороны. Аналогичные вычисления выполняются для определения точек пересечения со сторонами с отрицательным тангенсом угла наклона. Значение координаты х точки пересечения можно округлять до ближайшего пикселя, а не усекать его при получении целочисленного значения, изменив алго- ритм поиска точек пересечения таким образом, чтобы прирост сравнивался с ве- личиной Ду/2. Это можно сделать с помощью целочисленных арифметических операций, прибавляя к счетчику на каждом шаге значение 2Дж и сравнивая при- рост с Ду. Когда прирост станет больше или равен Ду, значение х увеличивает- ся на 1, а значение счетчика уменьшается на величину 2Ду. В предыдущем при- 7 мере с m = J значения счетчика для первых нескольких строк развертки над исходной строкой развертки для этой стороны теперь будут равны 6, 12 (умень- шается до —2), 4, 10 (уменьшается до —4), 2, 8 (уменьшается до —6), 0, 6 и 12 (уменьшается до —2). Теперь х будет увеличиваться на строках развертки 2, 4, 6, 9 и так далее над исходной строкой развертки для этой стороны. Для каж- дой стороны необходимы дополнительные расчеты 2Дж = Дж + Дж и 2Ду = Ду + Ду, которые выполняются на предварительном этапе. Для эффективного закрашивания многоугольников сначала можно записать гра- ницы многоугольника в сортировочную таблицу сторон, в которой содержится вся информация, необходимая для эффективной обработки строк развертки. Перемещаясь по сторонам в направлении по часовой стрелке или против нее, можно воспользо-
302 Глава 4. Атрибуты графических примитивов Рис. 4.24. Многоугольник и его сортировочная таблица сторон, где сторона DC уменьшена на одну единицу в направлении у ваться блочной сортировкой и записать в нужных точках строки развертки стороны, отобранные по наименьшему значению у для каждой стороны. В сортировочную таб- лицу сторон заносятся только негоризонтальные стороны. После обработки можно также сократить определенные стороны, чтобы определиться с количеством вершин и точек пересечения. В каждой входной позиции таблицы для определенной стро- ки развертки содержится максимальное значение у для этой стороны, значение х (в нижней вершине) и величина, обратная тангенсу угла наклона. Для каждой строки развертки стороны отсортированы слева направо. На рис. 4.24 показан многоугольник и соотнесенная с ним таблица сторон. Далее мы обрабатываем строки развертки, начиная с нижней части многоугольни- ка до верхней, создавая для каждой строки развертки, пересекающей границы много- угольника, активный список сторон. В активном списке сторон для строки развертки содержатся все стороны, пересекающиеся с этой строкой развертки, а также резуль- таты итеративных расчетов, которые используются для поиска точек пересечения со сторонами. Поиск точек пересечения можно упростить, записывая значения Д.т и Ду в сор- тировочную таблицу сторон. Чтобы убедиться, что внутренние области заданного многоугольника закрашены правильно, можно воспользоваться рассуждениями, ко- торые приводятся в разделе 3.13. Для каждой строки развертки закрашивается полоса пикселей между каждой парой отрезков координаты х, начиная с крайнего слева зна- чения отрезка х и заканчивая в точке, предшествующей крайнему справа отрезку х. Кроме того, каждую сторону многоугольника можно сократить на одну единицу в направлении у в верхнем конце отрезка. Такие меры гарантируют, что пиксели, принадлежащие соседним многоугольникам, не будут накладываться друг на друга.
4.11. Построчное закрашивание выпуклых многоугольников 303 4.11. ПОСТРОЧНОЕ ЗАКРАШИВАНИЕ ВЫПУКЛЫХ МНОГОУГОЛЬНИКОВ При применении процедуры построчного закрашивания к выпуклому многоугольнику каждой строке развертки не может соответствовать более одной внутренней полосы пикселей. Поэтому стороны многоугольника нужно обрабатывать только до тех пор, пока не будут найдены две точки пересечения границы многоугольника с каждой строкой развертки, проходящей через внутреннюю область многоугольника. Общий вид растрового (построчного) алгоритма заполнения многоугольников, ко- торый рассматривался в предыдущем разделе, значительно упрощается, если нужно заполнить выпуклый многоугольник. Снова воспользуемся координатной областью и определим, какие стороны пересекает строка развертки. Затем путем поиска то- чек пересечения с этими сторонами найдем внутренние полосы пикселей для этой строки развертки, причем любая вершина, через которую проходит строка развертки, считается за одну точку пересечения с границей многоугольника. Если строка раз- вертки проходит через одну вершину (например, через вершину многоугольника), мы наносим только эту точку. В некоторых графических пакетах существует более стро- гое ограничение: все закрашиваемые фигуры должны быть треугольниками. Данное условие еще больше упрощает процесс закрашивания, поскольку каждый треуголь- ник состоит только из трех сторон, которые нужно обрабатывать. 4.12. ПОСТРОЧНОЕ ЗАКРАШИВАНИЕ ФИГУР С КРИВОЛИНЕЙНЫМИ ГРАНИЦАМИ Поскольку фигура с криволинейными границами описывается нелинейными урав- нениями, ее построчное заполнение, как правило, требует больше времени, чем по- строчное заполнение многоугольника. Здесь можно воспользоваться общим методом, подробно описанным в разделе 4.10, но при этом вычисление точек пересечения с границами будет выполняться с использованием уравнений кривых, а тангенс уг- ла наклона границы будет постоянно меняться, поэтому прямой метод вычисления прироста станет невозможным. Для таких простых кривых, как окружность или эллипс, можно воспользоваться методами закрашивания, аналогичными используемым для выпуклых многоугольни- ков. Каждая строка развертки, которая проходит через внутреннюю область окруж- ности или эллипса, имеет только две точки пересечения с границами этого объекта. Чтобы найти эти точки на границе окружности или эллипса методом средней точки, вычисляется прирост. Затем мы просто закрашиваем горизонтальные полосы пиксе- лей между этими двумя точками пересечения. Для сокращения объема вычислений используется симметрия квадрантов (для окружности — октантов).
304 Глава 4. Атрибуты графических примитивов Рис. 4.25. Закрашивание внутренней области, ограниченной эллиптической дугой Аналогичными методами можно воспользоваться для создания закрашенной фи- гуры с помощью сечения кривой. Например, область, ограниченную эллиптической дугой и прямолинейным отрезком (рис. 4.25), можно закрасить, объединив процеду- ры для кривых и прямых линий. При возможности используются свойства симмет- рии и инкрементные расчеты, что позволяет уменьшить количество вычислительных операций. Для закрашивания других фигур с кривыми границами может понадобиться на- много больше расчетов. Можно воспользоваться аналогичным дифференциальным подходом, объединенным с численными методами, и определить точки пересечения со строками развертки, но, как правило, такие кривые границы удобнее аппроксими- ровать прямыми отрезками. 4.13. СПОСОБЫ ЗАПОЛНЕНИЯ ФИГУР С НЕПРАВИЛЬНЫМИ ГРАНИЦАМИ Еще один подход к закрашиванию заданной фигуры — это начинать с какого-то по- ложения внутри этой области и “закрашивать” всю внутреннюю область, точку за точкой, в направлении границ объекта. Этот способ особенно подходит для закраши- вания областей с неправильными границами, таких как фигуры, которые получаются при использовании различных программ для рисования. В общем случае, для этих методов необходимо задать начальную точку внутри той фигуры, которую следует за- красить, и некоторую информацию о цвете, касающуюся либо границ объекта, либо его внутренней части. Неправильные участки можно закрашивать одним цветом или цветным узором. Для заполнения узором накладывается цветовая маска, о чем говорится в разделе 4.9. При обработке каждого пикселя этой области его цвет определяется по соответству- ющему значению наложенного шаблона. АЛГОРИТМ ГРАНИЧНОГО ЗАПОЛНЕНИЯ Если граница определенной области задается с помощью одного цвета, можно за- крашивать всю эту область, пиксель за пикселем, вплоть до цветной границы. Этот метод, называемый алгоритмом граничного заполнения, используется в интерактив- ных пакетах рисования, где легко можно выбрать внутреннюю точку. С помощью
4.13. Способы заполнения фигуре неправильными границами 305 Рис. 4.26. Примеры цветных гра- ниц для процедуры граничного заполнения Рис. 4.27. Способы заполнения, которые применяются для четырехсвяз- ной (панель а) и восьмисвязной области (панель б). Пустыми кружками обозначены пиксели, которые должны проверяться в текущем тестовом положении, показанном закрашенным кружком графического планшета или другого интерактивного устройства ввода художник или дизайнер может нарисовать контуры фигуры, выбрать цвет заполнения по цветово- му меню, задать цвет границы области и указать точку внутри заданной области. После этого внутренняя область данной фигуры будет закрашена заданным цветом. Для определения области граничного заполнения могут служить как внешние, так и внутренние границы. Примеры описания цветных областей приведены на рис. 4.26. В основном выполнение алгоритма граничного заполнения начинается с внутрен- ней точки (х, у), при этом проверяется цвет соседних точек. Если цвет проверенной соседней точки не совпадает с цветом границы, тогда ее цвет изменяется на цвет заполнения, и проверяются соседние с ней точки. Эта процедура продолжается до тех пор, пока не будут обработаны все пиксели вплоть до обозначенной цветной границы области.
306 Глава 4. Атрибуты графических примитивов Рис. 4.28. Область, заданная с помощью цветной границы (панель а), при использо- вании четырехсвязного алгоритма гранич- ного заполнения закрашивается только ча- стично (панель б) ► ♦ « Начальное положение а) б) На рис. 4.27 показаны два способа обработки соседних пикселей в текущем те- стовом положении. На рис. 4.27, а проверяются четыре соседние точки — пиксели, ко- торые находятся справа, слева, сверху и снизу от текущего пикселя. Области, которые заполняются таким способом, называются четырехсвязными. Второй способ, пока- занный на рис. 4.27, б, используется для закрашивания более сложных фигур. Здесь в число соседей, требующих проверки, входят еще четыре диагональных пикселя, кро- ме тех, которые расположены по кардинальным направлениям. Методы заполнения, в которых используется такой подход, называются восъмисвязными. При использовании восьмисвязного алгоритма граничного заполнения внутренняя область, изображенная на рис. 4.28, будет закрашена правильно, а при использовании четырехсвязного алго- ритма граничного заполнения будет закрашена только часть этой области. Следующая процедура иллюстрирует рекурсивный метод закрашивания четы- рехсвязной области одним цветом, заданным с помощью параметра fillColor, до цветовой границы, которая задается с помощью параметра borderColor. Эту процедуру можно дополнить и использовать для закрашивания восьмисвязной обла- сти, включив в нее четыре дополнительных оператора для проверки диагональных положений (ж ± 1, у ± 1). void boundaryFi!14 (int х, int у, int fillColor, int borderColor) { int interiorcolor; /* Задается текущий цвет fillColor, затем выполняются следующие операции. */ getPixel (х, у, interiorcolor); if ((interiorcolor 1= borderColor) && (interiorcolor 1= fillColor)) { setPixel (x, у); // Задается цвет пикселя fillColor. boundaryFill4 (x + 1, у , fillColor, borderColor); boundaryFill4 (x - 1, у , fillColor, borderColor); boundaryFill4 (x , у + 1, fillColor, borderColor); boundaryFill4 (x , у - 1, fillColor, borderColor) } )
4.13. Способы заполнения фигуре неправильными границами 307 При рекурсивном алгоритме граничного заполнения некоторые фигуры могут закрашиваться неправильно, если часть внутренних пикселей уже имеет цвет запол- нения. Это происходит потому, что при выполнении алгоритма соседние пиксели проверяются как на наличие цвета границы, так и на наличие цвета заполнения. Встреча с пикселем, цвет которого совпадает с цветом заполнения, может привести к прекращению выполнения рекурсивной ветки, при этом остальные внутренние пик- сели останутся незакрашенными. Чтобы избежать этого, перед тем, как применять процедуру граничного заполнения, сначала нужно изменить цвет всех внутренних пикселей, которым изначально было присвоено код цвета заполнения. Кроме того, поскольку для выполнения этой процедуры приходится заносить в стек большое количество соседних точек, обычно используются более эффективные методы. Эти методы заключаются в том, чтобы закрашивать горизонтальные поло- сы пикселей по строкам развертки, а не обрабатывать четырех- или восьмисвязные соседние точки. В таком случае в стек нужно занести только начальную точку для каждой горизонтальной полосы пикселей, а не все необработанные соседние точки вокруг текущего положения. При использовании данного метода, начиная со старто- вой внутренней точки, сначала закрашивается непрерывная полоса пикселей в этой стартовой строке развертки. Затем находятся и заносятся в стек положения стартовых точек для полос в соседних строках развертки, где полосы пикселей определяются как непрерывные горизонтальные строки точек, ограниченные пикселями, которые имеют цвет границы. На каждом последующем шаге берется следующее стартовое положение из верхней части стека, и весь процесс повторяется снова. Пример того, как с помощью описанного подхода можно закрашивать полосы пикселей, приведен для четырехсвязной области заполнения на рис. 4.29. В этом при- мере сначала последовательно обрабатываются строки развертки, начиная со стар- товой строки и до верхней границы. Обработав все верхние строки развертки, мы закрашиваем полосы пикселей в оставшихся строках вниз к нижней границе обла- сти. Для каждой горизонтальной полосы находятся и записываются в стек положе- ния крайних левых пикселей, как показано на рис. 4.29. На части а этого рисунка заполнена исходная полоса, а в стек занесены стартовые положения 1 и 2 для полос следующих строк развертки (сверху и снизу). На рис. 4.29, б положение 2 извлекается из стека и обрабатывается с целью построения изображенной закрашенной полосы, а в стек заносится стартовое положение (точка 3) полосы следующей строки развертки. Закрашенные полосы и занесенные в стек положения после обработки положения 3 показаны на рис. 4.29, в. Наконец, на рис. 4.29, г изображены закрашенные пиксели после обработки всех полос в правой верхней части заданной фигуры. Затем обра- батывается положение 5, и закрашиваются полосы в левой верхней части фигуры; после этого извлекается точка 4, и продолжается обработка нижних строк развертки.
308 Глава 4. Атрибуты графических примитивов Закрашенные полосы пикселей Положения, занесенные в стек 2 ••• 1 а) ••• I Г) Рис. 4.29. Граничное заполнение по полосам пикселей для четырехсвязной области: а) исходная строка развертки с закрашенной полосой пикселей, где показано положение исходной точки (пустой кружок) и занесенные в стек положения для полос пикселей в соседних строках развертки; б) закрашенная полоса пикселей в первой строке развертки над начальной строкой развертки и текущее содержимое стека; в) закрашенные полосы пикселей в первых двух строках развертки над исходной строкой развертки и текущее содержимое стека; г) заполненные полосы пикселей для правой верхней части заданной области и остальные положения из стека, которые подлежат обработке
4.13. Способы заполнения фигуре неправильными границами 309 Рис. 4.30. Область, которая задается с помощью нескольких цветных границ АЛГОРИТМ ПОТОКОВОГО ЗАПОЛНЕНИЯ Иногда нужно закрасить (или перекрасить) область, которая не описывается с помо- щью одной цветной границы. На рис. 4.30 показана область, ограниченная несколь- ким областями различных цветов. Такие участки можно рисовать, заменяя заданный внутренний цвет, а не стараясь найти определенную цветную границу. Эта процедура заполнения называется алгоритмом потокового заполнения. В таком случае закраши- вание начинается с заданной внутренней точки (х, у), причем всем пикселям, значе- ния которых на данный момент соответствуют заданному цвету внутренней области, присваиваются новые значения, соответствующие искомому цвету заполнения. Если область, которая подлежит перекрашиванию, состоит из больше, чем одного, внут- реннего цвета, сначала можно изменить значения пикселей таким образом, чтобы все внутренние точки стали одинакового цвета. После этого, используя либо четырех- связный, либо восьмисвязный подход, проходят все положения пикселей по очереди, пока не будет изменен цвет всех внутренних точек. Следующая процедура служит для потокового заполнения четырехсвязной области рекурсивным способом, начиная с заданной входной точки. void floodFill4 (int х, int у, int fillcolor, int interiorcolor) { int color; /* Устанавливается текущий цвет fillColor, после чего выполняются следующие операции. */ getPixel (х, у, color); if (color = interiorcolor) { setPixel (x, y); /* Цвет пикселя устанавливается равным fillColor.*/ floodFill4 (x + 1, у, fillColor, interiorcolor); floodFill4 (x - 1, y, fillColor, interiorcolor); floodFill4 (x, у + 1, fillColor, interiorcolor); floodFill4 (x, у - 1, fillColor, interiorcolor) } }
310 Глава 4. Атрибуты графических примитивов Вышеприведенную процедуру можно изменить таким образом, чтобы уменьшить объем памяти, необходимый для создания стека, для чего закрашиваются горизон- тальные полосы пикселей (см. обсуждение алгоритма граничного заполнения). При таком подходе в стек заносятся только начальные положения тех полос пикселей, значение которых равно interiorcolor. Этапы этого измененного алгоритма по- токового заполнения такие же, как показано на рис. 4.29 для граничного заполнения. Начиная с первой точки каждой полосы, значения пикселей заменяются до тех пор, пока не встретится значение, отличное от interiorcolor. 4.14. ФУНКЦИИ АТРИБУТОВ ЗАКРАШЕННЫХ ФИГУР В OpenGL В OpenGL существуют только процедуры закрашивания выпуклых многоугольни- ков. Изображения закрашенных выпуклых многоугольников получаются за четыре действия. 1. Определяется узор заполнения. 2. Вызывается процедура закрашивания многоугольника. 3. Активизируется возможность OpenGL закрашивания многоугольников. 4. Описываются многоугольники, подлежащие закрашиванию. Узор заполнения многоугольника прорисовывается вплоть до сторон многоугольника, включая сами эти стороны. Таким образом, вокруг закрашенной области не будет никаких линий границ, если только не добавить их к изображению специально. Кроме описания узора заполнения внутренней области многоугольника существу- ет множество других альтернатив. Одна из них — изобразить пустой многоугольник, если не применяется никакого внутреннего узора или цвета, а изображаются только одни стороны. Пустой многоугольник — это то же самое, что и изображение при- митива замкнутой ломаной линии. Еще одна возможность — изобразить вершины многоугольника, не закрашивая внутреннюю область и не отображая стороны. Кроме того, можно задавать различные атрибуты для передней и задней сторон закрашенной многоугольной области. ФУНКЦИЯ ШАБЛОНА ЗАПОЛНЕНИЯ В OpenGL По умолчанию выпуклый многоугольник изображается как фигура, закрашенная од- ним цветом, при этом используются текущие цветовые настройки. В пакете OpenGL для того, чтобы заполнить многоугольник каким-либо узором, используется маска размером 32 на 32 бит. Значение маски 1 указывает на то, что соответствующему
4.14. Функции атрибутов закрашенных фигуре OpenGL 311 Рис. 4.31. Клеточное заполнение окна изображения с помощью шаб- лона узора при закрашивании двух выпуклых многоугольников пикселю следует присвоить текущее значение цвета, а 0 оставляет значение, которое записано в буфере кадра для этого положения, неизменным. Шаблон узора заполне- ния задается побайтово без указания знака с использованием типа данных OpenGL GLubyte, точно так же, как для функции glBitmap. Битовый узор описывается шестнадцатеричными значениями, например, так. GLubyte fillPattern [ ] = Oxff, 0x00, Oxff, 0x00, ... ; Биты должны задаваться, начиная с нижней строки шаблона в направлении снизу вверх до самой верхней (32) строки узора, как для функции bitShape (раздел 3.19). Этот шаблон многократно повторяется на всей площади окна изображения, начиная с нижнего левого угла окна, а в тех местах, где шаблон налагается на заданные многоугольники, они заполняются этим узором (рис. 4.31). Задав маску, можно установить ее как текущий шаблон узора заполнения: glPolygonStipple (fillPattern); Перед тем как задавать вершины многоугольников, которые подлежат заполнению текущим узором, нужно вызвать процедуры закрашивания. Это делается с помощью оператора glEnable (GL_POLYGON_STIPPLE); Аналогично заполнение узором отменяется с помощью оператора glDisable (GL_POLYGON_STIPPLE); На рис. 4.32 показано, как для заполнения параллелограмма можно использовать шаблон размером 3 на 3 бит, повторяющийся в виде маски размером 32 на 32 бит.
312 Глава 4. Атрибуты графических примитивов Рис. 4.32. Шаблон размером 3 на 3 бит (панель а), наложенный на параллелограмм с целью получения закрашенной области (панель б), где правый верхний угол шаблона совпадает с нижним левым углом параллелограмма а) ТЕКСТУРНЫЕ И ИНТЕРПОЛЯЦИОННЫЕ ШАБЛОНЫ В OpenGL Еще один способ закрашивания многоугольников — использовать текстурные шаб- лоны, которые рассматриваются в главе 10. Это может дать узоры, напоминающие поверхности дерева, кирпича, нержавеющей стали или какого-то другого материала. Кроме того, можно получить интерполяционную раскраску внутренней области мно- гоугольника, точно так же, как это делается для примитивов прямых линий. Чтобы сделать это, различным вершинам многоугольника присваиваются различные цвето- вые значения. Интерполяционное закрашивание внутренних областей многоугольни- ков используется для создания реалистичных изображений затененных поверхностей при различных условиях освещения. В качестве примера интерполяционного закрашивания приведем следующий фрагмент кода, в котором трем вершинам треугольника присваивается синий, красный или зеленый цвет. После этого многоугольник закрашивается с помощью линейной интерполяции цветов этих вершин. glShadeModel (GL_SMOOTH); glBegin (GL_TRIANGLES); glColor3f (0.0, 0.0, 1.0); glVertex2i (50, 50); glColor3f (1.0, 0.0, 0.0); glVertex2i (150, 50) , glColor3f (0.0, 1.0, 0.0); glVertex2i (75, 150) , glEnd ( ); Конечно, если треугольнику как целому присвоить одно цветовое значение, то он весь будет закрашен одним цветом. А если в этом примере изменить аргумент функ- ции glShadeModel на GL_FLAT, то многоугольник будет закрашиваться последним заданным цветом (зеленым). Значение GL_SMOOTH используется по умолчанию, но эту спецификацию можно включить явно, чтобы напомнить, что многоугольник дол- жен быть закрашен с интерполяцией цветов вершин.
4.14. Функции атрибутов закрашенных фигуре OpenGL 313 КОНТУРНЫЕ МЕТОДЫ В OpenGL Иногда требуется показать только стороны многоугольников. При этом получаются контурные изображения многоугольников. Также можно изобразить многоугольник, указав только точки в его вершинах. Для реализации этих опций используется следу- ющая функция glPolygonMode (face, displayMode); Параметр face обозначает, какую поверхность многоугольника нужно показать с помощью только сторон или вершин. Этому параметру присваивается значение GL_FRONT, GL_BACK или GL_FRONT_AND_BACK. После этого, если требуется изоб- разить одни только стороны многоугольника, параметру displayMode присваива- ется значение GL_LINE. Чтобы получить изображение одних только вершин мно- гоугольника, параметру displayMode присваивается значение GL_POINT. Третья альтернатива — GL_FILL, которая является режимом по умолчанию, поэтому, как правило, функция glPolygonMode вызывается только тогда, когда нужно задать атрибуты для сторон или вершин многоугольника. Еще один вариант — изобразить многоугольник с помощью закрашенной обла- сти и его сторон (или вершин), показанных другим цветом или узором. Это можно сделать, описав многоугольник дважды: один раз с параметром GL_FILL в функ- ции displayMode, а второй раз — с параметром GL_LINE (или GL_POINT) в этой же функции displayMode. Например, следующий фрагмент программы заполняет внутреннюю область многоугольника зеленым цветом, а затем его стороны изобра- жаются красным цветом. glColor3f (0.0, 1.0, 0.0); /* Вызывается процедура создания многоугольника. */ glColor3f (1.0, 0.0, 0.0); glPolygonMode (GL_FRONT, GL_LINE); /* Снова вызывается процедура создания многоугольника. */ Для трехмерного многоугольника (у которого не все вершины лежат в плоскости ху) при таком способе изображения сторон закрашенной фигуры могут появить- ся промежутки между сторонами и внутренней областью. Этот эффект, который иногда называют сшивкой, вызван различиями вычислительных операций алгорит- ма построчного заполнения и алгоритма построения прямых сторон многоугольника. После закрашивания внутренней области трехмерного многоугольника для каждой точки (х, у) находится значение глубины (расстояния до плоскости ху). Однако на краях многоугольника это значение зачастую отличается от значений глубины, рас- считанных с помощью алгоритма построения прямых линий для тех же самых точек (:г, у). Поэтому при проверках на видимость для изображения некоторых точек на границе многоугольника следует пользоваться цветом заполнения, а не цветом сторон.
314 Глава 4. Атрибуты графических примитивов Один из способов устранения промежутков при изображении сторон трехмерного многоугольника — сместить значения глубины, рассчитанные с помощью процедуры закрашивания, таким образом, чтобы они не накладывались на значения глубины сто- рон этого многоугольника. Это можно сделать с помощью следующих двух функций OpenGL. glEnable (GL_POLYGON_OFFSET_FILL); glPolygonOffset (factorl, factor2); Первая функция активизирует процедуру смещения для построчного заполнения, а вторая используется для задания пары значений с плавающей запятой factorl и factor2, которые применяются для вычисления величины сдвига глубины. Этот сдвиг глубины рассчитывается следующим образом: depthOffset — factorl • maxSlope + factor2 • const, (4.11) где maxSlope — тангенс максимального угла наклона многоугольника, a const — константа реализации. Для многоугольника, лежащего в плоскости ху, угол наклона равен 0. В противном случае максимальный тангенс угла наклона находится как изме- нение глубины многоугольника, разделенное либо на изменение величины х, либо на изменение величины у. Как правило, значения этих двух коэффициентов равны либо 0,75, либо 1,0, хотя часто, чтобы получить хороший результат, с этими значениями приходится поэкспериментировать. Для иллюстрации присваивания значений коэф- фициентам сдвига изменим предыдущий фрагмент программы следующим образом. glColor3f (0.0, 1.0, 0.0); glEnable (GL_POLYGON_OFFSET_FILL) ; glPolygonOffset (1.0, 1.0); /* Вызывается процедура создания многоугольника. */ glDisable(GL_POLYGON_OFFSET_FILL); glColor3f (1.0, 0.0, 0.0); glPolygonMode (GL_FRONT, GL_LINE); /* Снова вызывается процедура создания многоугольника. */ Внутренняя закрашенная часть многоугольника отодвигается немного вглубь и не накладывается на глубины сторон многоугольника. Этот подход можно также реали- зовать, использовав сдвиг в алгоритме построения прямых линий — изменив аргумент функции glEnable на GL_POLYGON_OFFSET_LINE. В этом случае будут приме- няться отрицательные коэффициенты, в результате чего глубина сторон многоуголь- ника станет немного меньше. А если потребуется изобразить только разноцветные точки в вершинах многоугольника, вместо того, чтобы выделять стороны, то аргумен- том функции glEnable должна быть константа GL_POLYGON_OFFSET_POINT.
4.14. Функции атрибутов закрашенных фигуре OpenGL 315 Рис. 4.33. Разделение вогнуто- го многоугольника (панель а) на набор треугольников (панель б) приводит к изображению сторон треугольников (пунктирные ли- нии), из которых состоит исход- ный многоугольник Еще один способ устранения эффекта сшивки на краях многоугольника — исполь- зовать буфер шаблонов OpenGL для ограничения области закрашивания внутренней части многоугольника, чтобы она нс накладывалась на стороны. Однако этот метод сложнее и, в общем случае, медленнее, поэтому метод сдвига глубины многоуголь- ника является более предпочтительным. Чтобы с помощью стандартных процедур OpenGL изобразить вогнутый много- угольник, его сначала нужно разделить на набор выпуклых многоугольников. Как правило, вогнутый многоугольник делится на набор треугольников с помощью мето- дов, описанных в разделе 3.15. После этого вогнутый многоугольник изображается как закрашенная фигура. Аналогично, если требуется показать только вершины мно- гоугольника, отображаются вершины треугольников. Отметим, что для того, чтобы изобразить исходный вогнутый многоугольник в виде контура, нельзя просто задать режим изображения как GL_LINE, поскольку при этом будут изображаться все сторо- ны треугольников, из которых состоит исходный вогнутый многоугольник (рис. 4.33). К счастью, в пакете OpenGL есть механизм, который позволяет удалять выделен- ные стороны с контурного изображения. Каждая вершина многоугольника записыва- ется с однобитовым флагом, который сообщает о том, соединена ли эта вершина со следующей вершиной граничной стороной многоугольника. Таким образом, все, что нам нужно, — это перевести этот флаг в положение “выключено”, и тогда сторона, следующая за этой вершиной, изображаться не будет. Флаг для стороны устанавли- вается с помощью следующей функции. glEdgeFlag (flag); Чтобы показать, что за вершиной нет граничной стороны, параметру flag присваивается значение константы OpenGL GL_FALSE. Этот подход применяется ко всем последовательно задаваемым вершинам до следующего вызова функции glEdgeFlag. Константа OpenGL GL_TRUE возвращает флаг в исходное положение, которое устанавливается по умолчанию. Отметим, что функция glEdgeFlag может помещаться внутри пары glBegin/glEnd. В качестве иллюстрации применения флагов сторон приведен следующий фрагмент программы, в котором изображаются только две стороны заданного треугольника (рис. 4.34).
316 Глава 4. Атрибуты графических примитивов Рис. 4.34. Треугольник (панель а) можно изобразить таким образом, как показано на панели б, присвоив флагу стороны для вер- шины v2 значение GL_FALSE и предпола- гая, что вершины задаются в направлении против часовой стрелки glPolygonMode (GL_FRONT_AND_BACK, GL_LINE); glBegin (GL_POLYGON) ; glVertex3fv (vl); glEdgeFlag (GL_FALSE); glVertex3fv (v2); glEdgeFlag (GL_TRUE); glVertex3fv (v3); glEnd ( ); Флаги сторон многоугольников также задаются как массивы, которые можно объ- единять или связывать с массивом вершин (разделы 3.17 и 4.3). Существуют такие операторы создания массива флагов. glEnableClientState (GL_EDGE_FLAG_ARRAY); glEdgeFlagPointer (offset, edgeFlagArray); Параметр offset показывает количество битов между значениями флагов сто- рон в массиве edgeFlagArray. По умолчанию значение параметра offset равно 0. ФУНКЦИЯ ПЕРЕДНЕЙ СТОРОНЫ В OpenGL Хотя по умолчанию передняя и задняя стороны многоугольника идентифицируются при задании вершин этого многоугольника, существует возможность независимой маркировки выбранных поверхностей сцены (как передних или задних). glFrontFace (vertexorder); Если параметру vertexorder присвоить значение константы OpenGL GL_CW, то задающийся после этого многоугольник, вершины которого расположены в на- правлении по часовой стрелке, будет считаться повернутым лицевой стороной. Этой возможностью пакета OpenGL можно воспользоваться для перестановки местами поверхностей многоугольников, вершины которых заданы по часовой стрелке. Кон- станта GL_CCW означает, что лицевой стороне многоугольника соответствует задание вершин в направлении против часовой стрелки, что и является порядком задания вершин по умолчанию.
4.15. Атрибуты символов 317 Тело Выносной элемент Рис. 4.35. Примеры тел символов 4.15. АТРИБУТЫ СИМВОЛОВ Внешний вид изображаемых символов можно контролировать с помощью таких ат- рибутов, как начертание, размер, цвет и ориентация. Во многих пакетах атрибуты можно задавать как для целой строки символов (текста), так и для отдельных симво- лов, используемых в особых целях, например, при построении графиков данных. Существует очень много возможных опций изображения текста. Прежде всего, можно выбирать начертание (или шрифт), которое представляет собой набор сим- волов определенного стиля написания, такой как New York, Courier, Helvetica, Lon- don, Times Roman и различные группы специальных символов. Кроме того, символы выбранного шрифта можно изображать с использованием специально подобранных видов подчеркивания (сплошного, путисгирного, с двойным подчеркиванием), а также полужирного шрифта, курсива, OUTLINE (контурного стиля) или стиля с тенью. Спецификацию цвета изображаемого текста можно занести в список атрибутов системы и использовать в процедурах для создания описаний символов в буфере кадра. Если нужно изобразить строку символов, то для задания значений пикселей в буфере кадра, соответствующих форме и положению символов, используется теку- щий цвет. Размер текста можно устанавливать, изменяя все размеры (высоту и ширину) символов, только высоту или только ширину. Для принтеров и наборщиков размер (высота) символов задается в пунктах, где 1 пункт (пт, pt) приблизительно равен 0,035146 сантиметра (или 0,013837 дюйма, что составляет около дюйма). Напри- мер, символы в этой книге имеют размер 10 пунктов. Количество пунктов описывает размер тела символа (рис. 4.35), но при различных начертаниях одно и то же число пунктов может давать символы различного размера, в зависимости от внешнего вида шрифта. Расстояние между нижней и верхней линией тела символа для всех символов определенного шрифта и размера одинаково, но ширина тела может меняться. В про- порциональных шрифтах ширина тела узких символов, таких как i,j, I и f, меньше, чем ширина широких символов, таких как W или М. Высота символа определяется
318 Глава 4. Атрибуты графических примитивов Рис. 4.36. Текстовые строки, изображенные при различных значениях высоты символов и при постоянном отношении ширины к высоте Высота I Высота 2 Высота 3 ширина 0,5 ширина 1,0 Рис. 4.37. Текстовые строки, изображенные при различных значе- ниях ширины символов при фиксированной высоте ширина 2,0 Промежуток 0,0 Промежуток 0,5 Рис. 4.38. Текстовые строки, изображенные при различных р значениях расстояния между символами ИрОМсЖуТОК 1 , О как расстояние между базовой строкой и верхней линией очертания символов. Буквы с выносным элементом, такие как f и j на рис. 4.35, обычно выходят за границы тела символа, а буквы с нижними выносными элементами (g,j,p,q,y) выходят за базо- вую строку. Дизайнер шрифтов располагает каждый символ в рамках тела символа таким образом, чтобы в печатных строках и между ними сохранялось расстояние, поскольку текст изображается с примыканием тел символов друг к другу. Иногда размер текста подбирается без изменения отношения ширины символа к его высоте. На рис. 4.36 показана строка символов, изображенных при трех различ- ных значениях высоты символов, причем отношение ширины к высоте сохраняется постоянным. Примеры текста, изображаемого с постоянной высотой символов, но при различных ширинах, приведены на рис. 4.37. Расстояние между символами — это еще один атрибут, который часто определяет вид строки символов. На рис. 4.38 показана строка символов, изображенная при трех различных значениях расстояния между символами. Ориентацию строки символов можно задавать в соответствии с направлением вектора ориентации знаков. Текст изображается таким образом, чтобы ориентация символов от базовой строки до верхней линии очертания совпадала с направлением вектора ориентации. Например, при направлении вектора ориентации 45° текст будет
4.15. Атрибуты символов 319 Рис. 4.39. От направления вектора ориента- ции знаков (панель а) зависит ориентация изображаемого текста (панель б) Рис. 4.40. Для того чтобы получить горизонтальное или вертикаль- ное расположение строк символов, задаются атрибуты направления текстовой дорожки Р О к d строка а кор: с а к о Р 1 Рис. 4.41. Текстовая строка, изображенная с помощью четырех опций направления 1 текстовой дорожки: влево, вправо, вверх и вниз изображаться так, как показано на рис. 4.39. С помощью процедуры выбора ориен- тации текста можно поворачивать символы таким образом, чтобы боковые стороны тел символов (от базовой строки до верхней линий очертания) были направлены вдоль вектора ориентации. Впоследствии стандарты развертки повернутых символов преобразуются и заносятся в буфер кадра. Во многих приложениях строки символов удобно размещать вертикально или горизонтально. Примеры такого расположения приведены на рис. 4.40. Кроме того, символы в текстовой строке можно выстраивать в направлении вперед или назад.
320 Глава 4. Атрибуты графических примитивов а) направление вектора ориентации знаков Рис. 4.42. Спецификация вектора ориентации (панель а) и соответствующие направления текстовой дорожки (панель б) б) направление текста Рис. 4.43. Вектор ориентации 45° на рис. 4.42 дает изображение при направлении текстовой дорожки вниз (панель а) и вправо (па- нель б) Примеры изображения текста с использованием этих опций приведены на рис. 4.41. Процедура для придания текстовой дорожке определенной ориентации реализуется следующим образом: согласно выбранной опции в буфере кадра устанавливаются положения отдельных символов. Ориентацию строк символов можно также задавать через вектор ориентации и направление текстовой дорожки, в результате чего получается наклонный текст. На рис. 4.42 показаны направления строк символов, полученных с помощью различных настроек направления текстовой дорожки при векторе ориентации 45°. Примеры строк символов, полученных при значениях направления текстовой дорожки вниз и вправо для этого же вектора ориентации, показаны на рис. 4.43.
4.15. Атрибуты символов 321 Строка — Верх - - Верхняя линия начертания ------Середина — Базовая строка Левая сторона Центр Правая сторона — Верх — Верхняя линия начертания — Базовая строка -- Низ Середина Левая сторона I Правая сторона Центр Рис. 4.44. Выравнивание символов в горизонтальной и вертикальной строке В п Выравнивание р 0 по правому краю а в в е « Р Выравнивание в у по центру н п и о в а н и J Выравнивание е у по левому краю Рис. 4.45. Выравнивание строк символов Еще один возможный атрибут строки символов — это выравнивание. С помощью этого атрибута описывают, как должен располагаться текст относительно определен- ной опорной точки. Например, отдельные символы могут выравниваться относитель- но базовых линий или центров символов. На рис. 4.44 показаны характерные поло- жения символов при горизонтальном и вертикальном выравнивании. Можно вырав- нивать и строки символов, а на рис. 4.45 показаны обычные способы выравнивания для горизонтальных и вертикальных текстовых надписей.
322 Глава 4. Атрибуты графических примитивов В некоторых графических пакетах существует также атрибут четкости текста. Этот параметр говорит о количестве деталей и особых опциях обработки, которые следует использовать для этой текстовой строки. Для текстовых строк с небольшой четкостью такие атрибуты, как направление текстовой дорожки, опускаются, и для обработки символов в конвейере наблюдения (viewing pipeline) используются более быстрые процедуры. Наконец, в библиотеках стандартных процедур обработки текста часто предла- гаются наборы специальных символов, таких как небольшие кружки или крестики, которые применяются в различных приложениях. Чаще всего эти символы использу- ются как маркеры на сетевых схемах или графиках данных. Атрибутами этих марки- ровочных символов, как правило, выступают цвет и размер. 4.16. ФУНКЦИИ АТРИБУТОВ СИМВОЛОВ В OpenGL OpenGL предлагает два способа изображения символов. Можно либо разрабатывать шрифт, используя функции битового отображения из корневой библиотеки, либо вы- зывать стандартные процедуры GLUT для создания отдельных символов. В библиоте- ке GLUT содержатся функции для изображения предопределенных наборов битовых и векторных символов. Следовательно, атрибуты, которые можно применять к этим символам, — это те атрибуты, которые применяются либо к битовым массивам, либо к прямолинейным отрезкам. Как для битового, так и для контурного шрифта, цвет изображения опреде- ляется текущим состоянием цвета. В общем случае, расстояние между символа- ми и размер самих символов зависит от заданных параметров шрифта (например, GLUT_BITMAP_9_BY_15 или GLUT_ STROKE_MONO_ROMAN). Кроме этого, можно задавать ширину и тип линий контурных символов. Ширина линии задается с помо- щью функции glLineWidth, а тип линии — с помощью функции glLineStipple. Штриховые шрифты GLUT можно изображать, используя текущие значения атрибу- тов OpenGL для ширины и типа линии. Некоторые другие характеристики изображаемого текста можно задавать с помо- щью функций преобразований, описанных в главе 5. Стандартные процедуры пре- образований позволяют изменять масштаб и положение контурных символов GLUT, а также разворачивать их, как в двух-, так и в трехмерном пространстве. Кроме то- го, трехмерные преобразования изображений (глава 7) можно использовать и для создания других визуальных эффектов.
4.17. Защита от наложения 323 4.17. ЗАЩИТА ОТ НАЛОЖЕНИЯ Прямолинейные отрезки и другие графические примитивы, полученные с помощью растровых алгоритмов, которые обсуждались в главе 3, как правило, бывают зубча- тыми (или ступенчатыми), поскольку при дискретизации значения координат точек объекта оцифровываются, в результате чего получаются дискретные целочисленные значения координат пикселей. Такое искажение информации, вызванное процессом дискретизации с небольшой частотой (выборка с недостаточной частотой), назы- вается наложением (aliasing). Внешний вид изображаемых растровых линий можно улучшить, воспользовавшись методами защиты от наложения (antialiasing), которые компенсируют процесс выборки с недостаточной частотой. Пример эффекта выборки с недостаточной частотой показан на рис. 4.46. Что- бы избежать потерь информации о таких периодических объектах, нужно выбирать частоту дискретизации по меньшей мере в два раза больше наибольшей частоты, встречающейся в этом объекте (частота Найквиста) fs: fs = 2fmax. (4.12) Другая формулировка этого правила: интервал дискретизации должен быть не боль- ше, чем половина интервала цикла (еще его называют интервалом дискретизации Найквиста). Для дискретизации с интервалом х интервал дискретизации Найквиста Д.т6 равен Ах. = ^=S, (4.13) где Д^цикла = 1//max- На рис. 4.46 интервал дискретизации в полтора раза боль- ше, чем интервал цикла, т.е. интервал дискретизации, по меньшей мере, в три раза больше, чем нужно. Если требуется восстановить всю информацию об объекте из этого примера, нужно сократить интервал дискретизации до одной трети размера, показанного на этом рисунке. /VWW\ * * * * * а) + б) Рис. 4.46. Дискретизация периодического изобра- жения (панель а) в указанных точках дает зубцеоб- разную низкочастотную интерпретацию (панель б)
324 Глава 4. Атрибуты графических примитивов Один из способов увеличения частоты дискретизации растровых систем заклю- чается просто в изображении объектов с большим разрешением. Однако даже при самом большом разрешении, возможном для данной технологии, зубцы будут в неко- торой степени заметны. Существует предел того, насколько большим может быть буфер кадра, чтобы скорость регенерации оставалась равной 60 или больше кадрам в секунду. Для того чтобы точно передавать объекты с непрерывными параметрами, необходимы бесконечно малые интервалы дискретизации. Следовательно, до тех пор, пока развитие аппаратных методов не достигнет того уровня, когда можно будет иметь дело с бесконечно большими буферами кадра, увеличение разрешающей способности экрана не будет полностью решать проблему контурных неровностей изображений. При использовании растровых систем, способных выдавать более двух уровней интенсивности каждого цвета, можно воспользоваться методами защиты от наложе- ния и изменить интенсивности пикселей. Соответствующим образом изменяя интен- сивности пикселей, расположенных вдоль границ примитивов, можно сгладить края объектов таким образом, чтобы уменьшить их зубцеобразный вид. Прямой метод устранения контурных неровностей заключается в увеличении ча- стоты дискретизации, если считать, что экран покрыт более мелкой сеткой, чем это есть в действительности. Тогда на этой более мелкой сетке для определения соответ- ствующего уровня интенсивности каждого пикселя экрана можно использовать боль- шее количество точек выборки. Такая техника дискретизации характеристик объекта с высокой разрешающей способностью и изображения полученного результата при более низком разрешении называется сверхдискретизацией (или постфильтрацией, поскольку общий метод заключается в вычислении интенсивностей для подсетки пикселей с последующим объединением результатов для получения значений интен- сивности пикселей). Изображаемые пиксели представляют собой пятна света, занима- ющие определенную площадь экрана, а не бесконечно малые математические точки. Однако в алгоритмах построения прямых линий и закрашивания областей рисунка интенсивность каждого пикселя определяется по положению одной точки на границе объекта. Путем сверхдискретизации мы получаем информацию об интенсивности во многих точках, которые делают свой вклад в общую интенсивность пикселя. Альтернатива сверхдискретизации — это определение интенсивности пикселя пу- тем вычисления площади перекрывания каждого пикселя с изображаемым объектом. Устранение контурных неровностей путем вычисления площади перекрывания на- зывается дискретизацией площади (или предварительной фильтрацией, поскольку интенсивность пикселя как целого определяется без вычисления интенсивностей под- пикселей). Площадь перекрывания пикселей можно найти, определяя те участки, где границы объекта пересекаются с границами отдельных пикселей. Устранить контурные неровности растровых объектов можно также путем смеще- ния площади пикселя на изображении. Эта методика, называемая фазировкой пиксе- лей, применяется путем “микропозиционирования” электронного луча относительно
4.17. Защита от наложения 325 геометрических размеров объекта. Например, пиксели, расположенные вдоль прямо- линейного отрезка, можно переместить ближе к заданной траектории прямой и таким ( образом устранить растровый эффект зубчатости. ’ СВЕРХДИСКРЕТИЗАЦИЯ ПРЯМОЛИНЕЙНЫХ ОТРЕЗКОВ Сверхдискретизацию можно реализовать несколькими способами. В прямолинейном отрезке каждый пиксель можно разделить на ряд подпикселей и подсчитать коли- чество подпикселей, которые накладываются на саму прямую. После этого уровень интенсивности каждого пикселя устанавливается равным тому значению, которое пропорционально количеству подсчитанных подпикселей. Пример применения этого метода приведен на рис. 4.47. Квадратный участок, соответствующий каждому пиксе- I лю, делится на девять одинаковых квадратных подпикселей, а с помощью закрашен- ! ных участков показаны те подпиксели, которые были бы выбраны при использовании ! алгоритма Брезенхема. Такая схема дает три уровня интенсивности, превышающих ‘ 0, поскольку максимальное количество подпикселей, которые можно выбрать в пре- ! делах каждого пикселя, равно трем. В этом примере пикселю, который находится в положении (10, 20), присваивается максимальное значение интенсивности (уровень । 3); пикселям с координатами (11, 21) и (12, 21) присваивается второе по величине 1 значение интенсивности (уровень 2); а пикселям с координатами (11, 20) и (12, 22) присваивается самое низкое значение интенсивности, превышающее нуль (уровень 1). Таким образом, интенсивность прямой распределяется по большему количеству пикселей, за счет чего устраняется изначальная неровность контура. При примене- j нии этой процедуры в районе ступенек (между горизонтальными участками) полу- ( чается некое размытое изображение прямой линии. Если для устранения контурной ; неровности прямой линии этим методом потребуется использовать больше уровней j интенсивности, нужно будет увеличить количество частей, на которые делится каж- * дый пиксель. При шестнадцати подпикселях мы получим четыре отличных от нуля i ( уровня интенсивности; двадцать пять подпикселей дадут пять уровней, и т.д. Рис. 4.47. Сверхдискретизация подпикселей, расположенных вдоль прямолинейного отрезка, левый конец которого нахо- дится в точке с экранными координатами (10, 20)
326 Глава 4. Атрибуты графических примитивов Рис. 4.48. Сверхдискретизация подпикселей относительно внутренней области прямой линии конечной ширины В примере сверхдискретизации на рис. 4.47 рассматриваются пиксели с конечной площадью, но ведь прямая линия — это математический объект с нулевой шириной. В действительности ширина изображаемых линий приблизительно равна ширине одного пикселя. Если учитывать конечную ширину прямой линии, то сверхдискрети- зацию можно выполнять путем задания интенсивности пикселей, пропорциональной количеству подпикселей, которые попадают в многоугольник, представляющий собой площадь прямой. Подпиксель можно считать находящимся внутри прямой, если его нижний левый угол находится внутри границы многоугольника. Преимущество этой процедуры сверхдискретизации состоит в том, что количество возможных уровней интенсивности каждого пикселя равно общему количеству подпикселей, составляю- щих один пиксель. Прямой из примера на рис. 4.47 можно придать конечную ширину, расположив границы многоугольника параллельно траектории прямой, как показано на рис. 4.48. Теперь каждому пикселю можно поставить в соответствие один из девяти возможных уровней интенсивности, превышающих нулевое значение. Еще одно преимущество сверхдискретизации прямой с конечной шириной за- ключается в том, что общая интенсивность линии распределяется по большему ко- личеству пикселей. Теперь на рис. 4.48 включается пиксель с координатами (10, 21) (с уровнем интенсивности 2), кроме этого, учитываются вклады пикселей, которые находятся непосредственно под точкой с координатами (10, 21) и слева от нее. К тому же, при наличии цветного изображения, этот метод можно дополнить таким образом, чтобы в нем учитывались цвета фона. Отдельная прямая линия может пересекать несколько различных цветных областей, и для того, чтобы получить значения ин- тенсивности пикселей, нужно усреднить значения подпикселей. Например, если мы определили, что пять подпикселей, составляющих один пиксель, попадают в область красной линии, а остальные четыре подпикселя приходятся на область синего фона, тогда цвет этого пикселя рассчитывается следующим образом: (5 • красный + 4 • синий) цвет пикселя = -------------------
4.17. Защита от наложения 327 Ради получения этих преимуществ сверхдискретизации прямой с конечной шириной необходимо идти на компромисс, который заключается в том, что для определения внутренних подпикселей необходимо больше вычислений, чем просто для определе- ния того, какие подпиксели попадают на траекторию прямой. К тому же, необходимо учитывать положение границ прямой относительно ее траектории. Это положение зависит от угла наклона прямой. Для прямой, расположенной под углом 45°, траек- тория прямой проходит по центру многоугольника; но при работе с горизонтальной или вертикальной прямой хотелось бы, чтобы одной из границ многоугольника была сама прямая. Приведем такой пример: горизонтальную линию, проходящую через точку с координатами сетки (10, 20), можно было бы представить как многоугольник, ограниченный горизонтальными линиями сетки у = 20иу = 21. Аналогично мно- гоугольник, представляющий собой вертикальную линию, которая проходит через точку (10, 20), может иметь вертикальные границы, совпадающие с линиями сетки х = 10 и х — 11. Для прямых, тангенс угла наклона которых |m| < 1, математи- ческая траектория прямой располагается пропорционально ближе к нижней границе многоугольника; а для прямых, тангенс угла наклона которых |m| > 1, траектория прямой проходит ближе к верхней границе многоугольника. МАСКИ УДЕЛЬНОГО ВЕСА ПОДПИКСЕЛЕЙ Алгоритмы сверхдискретизации часто реализуются путем учета с большими весовы- ми коэффициентами тех подпикселей, которые находятся в центре пикселя, поскольку можно ожидать, что эти подпиксели будут более значимыми при определении общей интенсивности пикселя. При делении пикселя на сетку размером 3 на 3, которое мы рассматривали до сих пор, можно пользоваться такой схемой распределения удельно- го веса, которая показана на рис. 4.49. Здесь центральный подпиксель идет с весовым коэффициентом, который в четыре раза больше, чем угловые, и в два раза больше, чем остальные подпиксели. Затем при усреднении интенсивностей, рассчитанных для каждого из девяти подпикселей, интенсивность центрального подпикселя умножает- ся на весовой коэффициент |; верхний, нижний и боковые подпиксели умножаются на коэффициент |; а угловые подпиксели умножаются на коэффициент Массив значений, описывающих относительный вклад каждого подпикселя, обычно называ- ют маской удельного веса. Аналогичные маски можно задавать и для больших сеток 1 2 1 2 4 2 1 2 1 Рис. 4.49. Удельный вес подпикселей сетки размером 3 на 3
328 Глава 4. Атрибуты графических примитивов фильтр фильтр фильтр Рис. 4.50. Характерные фильтрующие функции, которые используются для устранения контурных неровностей прямых линий. Объем каждого фильтра нормирован на 1, а зна- чение высоты дает относительный удельный вес каждого подпикселя подпикселей. Кроме того, часто эти маски дополняют таким образом, чтобы в них учитывались вклады подпикселей, принадлежащих к соседним пикселям; чтобы мож- но было усреднять интенсивности примыкающих друг к другу пикселей и получать более равномерное распределение интенсивности между пикселями. ДИСКРЕТИЗАЦИЯ ПРЯМОЛИНЕЙНЫХ ОТРЕЗКОВ ПО ПЛОЩАДИ Дискретизация прямолинейных отрезков по площади выполняется путем присвое- ния пикселям значений интенсивности, пропорциональных площади перекрывания пикселя прямой линией конечной ширины. Прямую линию можно рассматривать как прямоугольник, а отрезок прямой, лежащий между двумя соседними вертикальными (или горизонтальными) линиями сетки экрана, — как трапецию. Чтобы вычислить площади перекрывания пикселей, следует определить, какая часть трапеции пере- крывается каждым пикселем в этом столбце (или строке). На рис. 4.48 пиксель с ко- ординатами сетки экрана (10, 20) приблизительно на 90 % перекрывается площадью прямой, поэтому его интенсивность будет иметь значение, равное 90 % от максималь- ной интенсивности. Аналогично пикселю с координатами (10, 21) будет присвоено значение, равное 15 % от максимальной интенсивности. Метод оценки площади пере- крывания пикселя показан на рис. 4.48. Общее количество подпикселей, попадающих в пределы прямой линии, приблизительно равно площади перекрывания, а уточнить это значение можно, используя более мелкую сетку подпикселей.
4.17. Защита от наложения 329 МЕТОДЫ ФИЛЬТРАЦИИ Более точный способ устранения контурных неровностей прямых линий — это ис- пользование методов фильтрации. Этот способ напоминает применение маски удель- ного веса пикселей, но в данном случае мы представляем себе непрерывную по- верхность удельного веса (или фильтрующую функцию), которая накладывается на пиксель. На рис. 4.50 приведены примеры прямоугольной, конической и гауссовой фильтрующих функций. Способы применения фильтрующих функций аналогичны способам применения масок удельного веса, но в данном случае для того, чтобы найти среднюю интенсивность, выполняется интегрирование по всей поверхности пикселя. Для уменьшения объема вычислений интегралы, как правило, находятся с помощью таблиц соответствий. ФАЗИРОВКА ПИКСЕЛЕЙ В растровых системах, где возможна адресация положений подпикселей в преде- лах сетки экрана, для устранения контурных неровностей объектов можно использо- вать фазировку пикселей. Изображение прямой линии при применении этого метода сглаживается путем перемещения (микропозиционирования) пикселей ближе к тра- ектории прямой. Системы, в которых существует возможность фазировки пикселей, проектируются таким образом, чтобы электронный луч можно было смещать на часть диаметра пикселя. Как правило, электронный луч смещается на |, | или | диаметра пикселя, в результате чего точки на экране появляются ближе к истинной траектории прямой или стороне объекта. А в некоторых системах можно еще и подбирать разме- ры отдельных пикселей, что является дополнительным средством для распределения интенсивностей. На рис. 4.51 приведены примеры действия фазировки пикселей на ряд прямых линий. КОМПЕНСАЦИЯ РАЗЛИЧИЙ В ИНТЕНСИВНОСТИ ЛИНИИ Устранение контурных неровностей прямой с целью сглаживания зубцов компенсиру- ет и еще один растровый эффект, который показан на рис. 4.52. Обе линии построены с помощью одинакового количества пикселей, но, несмотря на это, диагональная ли- ния длиннее, чем горизонтальная в д/2 раз. Например, если длина горизонтальной линии 10 см, то длина диагональной прямой будет больше 14 см. Визуальный эф- фект этого явления состоит в том, что диагональные линии выглядят менее яркими, чем горизонтальные, поскольку при изображении диагональной линии на единицу длины приходится меньшая интенсивность. Алгоритм для построения прямых линий можно приспособить таким образом, чтобы этот эффект компенсировался, подбирая интенсивность каждой линии в соответствии с ее наклоном. Горизонтальные и вер- тикальные линии должны изображаться с наименьшей интенсивностью, тогда как линии с углом наклона в 45° должны иметь наибольшую интенсивность. Но если
330 Глава 4. Атрибуты графических примитивов Рис. 4.51. Зубцеобразные линии (панель а), изображенные с помощью системы Merlin 9200, сглаживаются (панель б) с помощью метода устранения контурных неровностей, который на- зывается фазировкой пикселей. Этот метод состоит в увеличении количества точек, адресация которых возможна в данной системе, от 768 на 576 до 3072 на 2304 (перепечатано с разрешения Peritek Corp.) к изображению применяются методы защиты от наложения, тогда интенсивность компенсируется автоматически. При учете конечной ширины линии интенсивности пикселей подбираются таким образом, чтобы общая интенсивность была прямо про- порциональна ее длине. УСТРАНЕНИЕ КОНТУРНЫХ НЕРОВНОСТЕЙ ГРАНИЦ ФИГУР Понятия устранения контурных неровностей, которые рассматривались для прямых линий, точно так же можно применять и к границам фигур. Эти процедуры можно ввести в растровый алгоритм, чтобы границы фигуры сглаживались сразу же при ее создании. Если возможности системы позволяют перемещать пиксели, то границы области можно сгладить, смещая пиксели ближе к самой границе. При применении других методов интенсивность пикселей, расположенных на границе, подбирается в соответ- ствии с процентом площади пикселя, которая находится внутри объекта. На рис. 4.53
4.17. Защита от наложения 331 Рис. 4.52. Линии различной длины, изображенные с помощью одинакового количества пикселей в каждой линии интенсивностей пикселей, расположенных на размером 4 на 4 пикселя, приблизительно половина площади пикселя с координатами (х, у) лежит внутри многоугольника. Следовательно, интенсивность в этой точке будет равна половине значения, присвоенного этому пикселю. В следующей точке границы (х + 1, у + 1) интенсивность равна приблизительно одной третьей от присвоенного значения для этой точки. Аналогично, основываясь на процентном соотношении площади пере- крывания пикселя, присваиваются значения интенсивности всем остальным точкам по всей границе объекта.
332 Глава 4. Атрибуты графических примитивов Рис. 4.55. Разделенная область пикселей с тремя частями, на- Область, разделенная холящимися внутри границы объекта на подпиксели Рис. 4.56. Граничная сторона закрашенной области, которая прохо- дит через часть сетки пикселей Методы сверхдискретизации можно применять, определяя количество подпиксе- лей, которые попадают во внутреннюю область объекта. Схема разделения с четырь- мя подобластями на каждый пиксель показана на рис. 4.54. Исходная сетка пикселей размером 4 на 4 превращается в сетку размером 8 на 8, и теперь, вместо четырех, мы обрабатываем восемь строк развертки этой сетки. На рис. 4.55 показан один из участ- ков этой сетки пикселей, который накладывается на границу объекта. Рассматривая две строки развертки, можно определить, что три области подпикселей находятся внутри границы. Поэтому интенсивность пикселя устанавливается равной 75 % от ее максимального значения. Еще один способ определить процентное отношение части пикселя, которая попа- дает в закрашенную область, разработан Питтвеем (Pitteway) и Уоткинсоном (Watkin- son) и основан на алгоритме средней точки для построения прямой линии. При выпол- нении этого алгоритма следующее положение пикселя на прямой выбирается путем проверки положения точки, лежащей посередине между двумя пикселями. Как и в алгоритме Брезенхема, здесь выбирается параметр принятия решения р, знак кото- рого сообщает, какой из следующих двух возможных пикселей находится ближе к прямой. Немного изменив вид параметра р, получим величину, которая также дает процентную долю текущей площади пикселя, которая накладывается на объект. Сначала рассмотрим этот метод по отношению к прямой с тангенсом угла на- клона т, значение которого попадает в диапазон от 0 до 1. На рис. 4.56 показана прямая линия на сетке пикселей. Предположим, что только что был нанесен пиксель с координатами (жд., у^У, следующим пикселем, ближайшим к этой прямой в точке
4.17. Защита от наложения 333 Рис. 4.57. Область перекрывания прямоугольного пикселя с центром в точке (+, уь) пересекается с внут- ренней областью закрашенного мно- гоугольника Рис. 4.58. Многоугольники, у которых через площадь отдельного пикселя проходит больше, чем одна граничная сторона I = Хк +1, будет либо пиксель с координатой ук, либо пиксель с координатой ук +1. Какой из этих пикселей будет ближе, можно определить с помощью уравнения У ~ УтИ = + 1) + b] - (ук + 0,5). (4.14) Это дает вертикальное расстояние от реальной координаты у на прямой до точки, находящейся посередине между пикселями в положениях у к и у к + 1. Если эта рас- считанная разность отрицательна, то ближе к прямой будет пиксель у к- Если разность положительна, то ближе будет пиксель у к +1. Можно подобрать это уравнение таким образом, чтобы оно давало положительное число в диапазоне от 0 до 1, прибавив к нему величину 1 — т: р = [m(rrfc + 1) + b] - (ук + 0,5) + (1 — т). (4.15) Теперь пиксель ук будет ближе, если р < 1 — т, а пиксель yk + 1 будет ближе, если р > 1 — т. Кроме того, параметр р показывает, какая часть текущего пикселя перекрывается с закрашенной областью. Для пикселя (хк, Ук) на рис. 4.57 площадь закрашенной части пикселя можно найти из выражения площадь = т • Хк + b — у к + 0, 5. (4.16)
334 Глава 4. Атрибуты графических примитивов Эта формула для площади перекрывания пикселя (хк, у к) точно такая же, как и для параметра р в уравнении (4.15). Следовательно, найдя параметр р для определе- ния следующего положения пикселя на границе многоугольника, мы найдем также и процентную долю площади перекрывания для текущего пикселя. Этот алгоритм можно обобщить для работы с прямыми с отрицательным танген- сом угла наклона или с прямыми, тангенс угла наклона которых больше единицы. Затем это выражение для вычисления параметра р можно включить в алгоритм сред- ней точки для прямой, что позволит определить положения пикселей на сторонах многоугольников и одновременно подобрать интенсивности пикселей на граничных линиях. Кроме того, можно подобрать выражения для вычисления опорных координат пикселей относительно координат их левого нижнего угла и сохранения пропорций площади, о чем говорится в разделе 3.13. В вершинах многоугольника или в очень тонких многоугольниках (рис. 4.58) через площадь одного пикселя проходит больше, чем одна граничная сторона. В таких случаях для обработки всех сторон, проходящих через данный пиксель, и правильного определения внутренней области приходится несколько изменять алгоритм Питтвея- Уоткинсона. Методы фильтрации, которые рассматривались для устранения контурных неров- ностей прямых, также можно применять и к сторонам закрашенных фигур. Различ- ные способы защиты от наложения могут применяться к многоугольникам или к областям с кривыми границами. Для оценки части пикселя, которая перекрывает- ся с фигурой, используются уравнения, описывающие границы этих фигур, а при обработке строк развертки между ними вычисления упрощаются, если применить когерентные методы. 4.18. ФУНКЦИИ OpenGL ЗАЩИТЫ ОТ НАЛОЖЕНИЯ Стандартные процедуры устранения контурных неровностей в OpenGL активизиру- ются с помощью команды glEnable (primitiveType); Здесь параметру primitiveType присваивается значение одной из символь- ных констант GL_POINT_SMOOTH, GL_LINE_SMOOTH или GL_POLYGON_SMOOTH. Предположив, что цветовые значения задаются в режиме RGBA, нужно еще активи- зировать операции OpenGL смешивания цветов. glEnable (GL_BLEND); Далее применяется метод смешивания цветов, описанный в разделе 4.3, и вызы- вается функция glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
4.19. Функции запроса в OpenGL 335 Операции сглаживания будут более эффективными, если для цветовых специфи- каций объектов использовать большие значения альфа. Устранение контурных неровностей может применяться и тогда, когда использу- ются цветовые таблицы. Однако в таком цветовом режиме нужно создавать линейно изменяющийся цветовой шаблон — таблицу оттенков цветов от цвета фона до цве- та объекта. Затем этот шаблон используется для устранения контурных неровностей границ объектов. 4.19. ФУНКЦИИ ЗАПРОСА В OpenGL Текущие значения любого параметра состояния, в том числе настройки атрибутов, можно извлекать с помощью функций запроса OpenGL. Эти функции применяются для копирования заданных значений состояния в массив, который можно сохранить для последующего повторного использования или проверки текущего состояния си- стемы, если возникает какая-то ошибка. Для текущих значений атрибутов используется соответствующая функция “glGet”: glGetBooleanv ( ) glGetFloatv ( ) glGetlntegerv ( ) glGetDoublev ( ) В каждой из вышеприведенных функций задается два аргумента. Первый аргу- мент — символьная константа OpenGL, которая определяет атрибут или другой па- раметр состояния. Второй аргумент — ссылка на массив того типа данных, который указан в имени функции. Например, текущие цветовые настройки в режиме RGBA с плавающей запятой можно извлечь с помощью функции glGetFloatv (GL_CURRENT_COLOR, colorvalues); Затем текущие цветовые компоненты передаются в массив colorValues. Что- бы найти целочисленные значения цветовых компонентов, вызывается функция glGetlntegerv. В некоторых случаях для возвращения заданного типа данных может понадобиться преобразование типа данных. В этих функциях для возвращения текущих значения параметров состояния могут использоваться и другие константы OpenGL: GL_POINT_SIZE, GL_LINE_WIDTH или GL_CURRENT_RASTER_POSITION. Диапазон значений размеров точки или ши- рины линии, который поддерживается данной системой, можно проверить с помощью констант GL_POINT_SIZE_RANGE или GL_LINE_WIDTH_RANGE. Независимо от того, что существует возможность извлекать и повторно исполь- зовать значения отдельных атрибутов с помощью функций glGet, в пакете OpenGL
336 Глава 4. Атрибуты графических примитивов предлагаются и другие функции для сохранения групп атрибутов и повторного ис- пользования их значений. Применение этих функций для сохранения текущих на- строек атрибутов мы рассмотрим в следующем разделе. Существует еще много других параметров системы и состояния, относительно которых иногда нужно сделать запрос. Например, чтобы определить, сколько битов приходится в буфере кадра на один пиксель, можно запросить систему о том, сколько битов доступно для описания каждого отдельного цветового компонента: glGetlntegerv (GL_RED_BITS, redBitSize); Здесь массиву redBitSize присваивается значение, равное количеству битов красного цвета, существующему в каждом из буферов (кадра, глубины, накопле- ния и шаблонов). Аналогично можно сделать запрос относительно других цветовых компонентов, воспользовавшись параметрами GL_GREEN_BITS, GL_BLUE_BITS, GL_ALPHA_BITS или GL_INDEX_BITS. Можно также узнать, установлены ли флаги сторон, помечена ли поверхность многоугольника как передняя или задняя, и поддерживает ли данная система двой- ную буферизацию. Также можно уточнить, активизированы ли такие процедуры, как смешивание цветов, наложение текстуры на линии или защита от наложения. 4.20. ГРУППЫ АТРИБУТОВ В OpenGL Атрибуты и другие параметры состояния OpenGL образуют группы атрибутов. Каж- дая группа содержит набор взаимосвязанных параметров состояния. Например, в группе атрибутов точек содержатся такие параметры, как размер и уровень сглажи- вания (защиты от наложения) точки, а в группе атрибутов прямых линий содержится ширина, тип пунктира, узор пунктирного рисунка, счетчик повтора пунктирного ри- сунка и состояние сглаживания линии. Аналогично в группе атрибутов многоуголь- ников содержится одиннадцать параметров многоугольника, таких как узор заполне- ния, флажок обозначения лицевой или обратной стороны и состояние сглаживания многоугольника. Поскольку цвет является атрибутом всех примитивов, он относится к своей группе атрибутов. Отметим, что некоторые параметры могут входить больше, чем в одну группу. В пакете OpenGL существует более двадцати различных групп атрибутов, но все параметры одной или нескольких групп можно сохранять или изменять с помо- щью одной функции. Чтобы сохранить все параметры, которые относятся к заданной группе, используется следующая команда. glPushAttrib (attrGroup);
4.21. Резюме 337 Параметру attrGroup присваивается значение символьной константы OpenGL (GL_POlNT_BIT, GL_LINE_BIT или GL_POLYGON_ BIT), которая определяет группу атрибутов. Для сохранения параметров цвета используется символьная кон- станта GL_CURRENT_BIT. Все параметры состояния во всех группах атрибутов мож- но сохранить с помощью константы GL_ALL_ATTRIB_BITS. Функция glPushAt- trib служит для занесения всех параметров, которые входят в заданную группу, в стек атрибутов. Можно также сохранять параметры из двух или нескольких групп, объединяя соответствующие им символьные константы с помощью логической операции ИЛИ. Используя следующий оператор, все параметры точек, прямых линий и многоуголь- ников заносят в стек атрибутов. glPushAttrib (GL_POINT_BIT | GL_LINE_BIT | GL_POLYGON_BIT); Записав группу параметров состояния, все значения из стека атрибутов можно восстановить с помощью такой функции. glPopAttrib ( ); В функции glPopAttrib нет аргументов, поскольку она служит для изменения текущего состояния, а для этого используются все значения из стека. Указанные команды для сохранения и переназначения параметров состояния ис- пользуют стек атрибутов сервера. В пакете OpenGL есть еще стек атрибутов клиента для сохранения и переопределения параметров состояния клиента. Функци- ями доступа в этот стек являются glPushClientAttrib и glPopClientAttrib. Существует только две группы атрибутов клиента: одна для режимов сохранения пик- селей, а другая — для массивов вершин. К параметрам сохранения пикселей относится такая информация, как расположение байтов и тип массивов, которые используются для записи фрагментов изображения. Параметры массива вершин дают информа- цию о текущем состоянии массива вершин, например, об активизации различных массивов. 4.21. РЕЗЮМЕ Атрибуты служат для управления характеристиками изображения графических при- митивов. Во многих графических системах значения атрибутов сохраняются как пе- ременные состояния, и примитивы создаются с учетом текущих значений атрибутов. Когда меняется значение переменной состояния, это отражается только на тех при- митивах, которые задаются после этого изменения.
338 Глава 4. Атрибуты графических примитивов Общим атрибутом для всех примитивов является цвет, который чаще всего зада- ется в виде компонентов RGB (или RGBA). Значения для красного, зеленого и синего компонентов записываются в буфер кадра, а затем используются для управления интенсивностью трех электронных пушек RGB-монитора. Кроме того, выбор цвета можно осуществлять и с помощью цветовых поисковых таблиц. В этом случае цвет в буфере кадра обозначается как элемент таблицы, а значение, которое находится на месте этого элемента в таблице, представляет собой определенный набор цветовых компонентов RGB. Цветовые таблицы удобны в приложениях, связанных с визуа- лизацией данных и обработкой изображений, а также их можно использовать для предоставления широкого диапазона цветов, не требующего большого буфера кад- ра. В пакетах компьютерной графики часто предлагаются опции для использования цветовых таблиц или значений, записанных непосредственно в буфер кадра. Основные атрибуты точек — цвет и размер. В растровых системах точки различ- ных размеров изображаются как квадратные массивы пикселей. Атрибуты прямых линий — это цвет, ширина и стиль. Описание ширины линии задается с помощью значений, кратных стандартному значению ширины линии в один пиксель. К атри- бутам стиля прямых линий относятся сплошные, пунктирные или штрихпунктирные линии, а также различные виды кисти или пера. Эти атрибуты можно применять как к прямым линиям, так и к кривым. К атрибутам закрашенных фигур относятся закрашивание одним цветом, заполне- ние узором или изображение пустой (каркасной) фигуры, когда показываются только границы области. Различные узоры заполнения можно задавать с помощью цветовых массивов, которые затем накладываются на внутреннюю часть фигуры. Для закра- шивания многоугольников, окружностей и эллипсов обычно используются растровые (построчные) методы. В каждой строке развертки узор заполнения применяется к тем пикселям, которые находятся внутри каждой пары точек пересечения с границами области в направлении слева направо. При пересечении строки развертки с верши- ной многоугольника может появиться нечетное количество точек пересечения. Эту проблему можно решить, укорачивая некоторые стороны многоугольника. Растровые алгоритмы закрашивания фигур можно упростить, если закрашиваемые фигуры яв- ляются выпуклыми многоугольниками. Еще большей простоты можно достичь, если все закрашенные фигуры сцены — треугольники. Внутренним пикселям в каждой строке развертки присваиваются соответствующие цветовые значения в зависимости от спецификаций атрибутов закрашивания. При использовании программ рисования закрашенные фигуры, как правило, изображаются с помощью методов граничного заполнения или методов потокового заполнения. Для каждого из этих двух мето- дов заполнения необходима начальная внутренняя точка. Затем внутренняя область закрашивается пиксель за пикселем, от начальной точки до границ фигуры. Фигуры можно закрашивать также с помощью метода смешивания цветов. Этот вид закрашивания находит свое применения в пакетах для рисования и устранении
4.21. Резюме 339 контурных неровностей. Процедуры мягкого окрашивания позволяют заполнять об- ласть новым цветом такого же оттенка, как и предыдущий цвет заполнения. Один из примеров этого метода — линейный алгоритм мягкого окрашивания, в котором предполагается, что предыдущий цвет был линейной комбинацией следующего цве- та и цвета фона. Затем этот же линейный закон взаимосвязи выводится из настроек буфера кадра и используется для перекрашивания фигуры в новый цвет. Изображаемые символы могут быть различного стиля (начертания), цвета, разме- ра, направления, между ними может быть разное расстояние. Для того чтобы задать ориентацию строки символов, можно задать направление вектора ориентации симво- ла и направление текстовой дорожки. Кроме того, можно задать выравнивание тексто- вой строки относительно координат начальной точки. Отдельные символы, которые называют маркировочными, можно использовать в таких приложениях, как построе- ние графиков данных. Маркировочные символы могут быть разного размера и цвета, для их изображения используются стандартные знаки или специальные символы. Поскольку преобразование стандартов развертки — это процесс оцифровки в растровых системах, изображенные примитивы получаются зубцеобразными. Это вызвано недостаточной частотой выборки входной информации, при которой значе- ния координат пикселей округляются до целых значений. Внешний вид растровых примитивов можно улучшить, воспользовавшись процедурами устранения контур- ных неровностей, суть которых состоит в подборе интенсивностей пикселей. Один из способов достижения этого эффекта — сверхдискретизация, при которой каждый пиксель рассматривается таким образом, как будто он состоит из подпикселей. Затем находят интенсивность каждого подпикселя, и значения интенсивностей всех под- пикселей усредняются. Можно также вычислить удельный вес каждого подпикселя в зависимости от его положения, придавая больший вес центральным подпикселям. Или же можно выполнить дискретизацию области и найти процентную долю площади перекрывания для каждого пикселя на экране, а затем присвоить пикселю значение интенсивности, пропорциональное этой процентной доле. Еще один способ устра- нения контурных неровностей — построить специальное оборудование, с помощью которого можно сдвигать положения пикселей на экране. В пакете OpenGL значения атрибутов примитивов записываются как переменные состояния. Настройка определенного атрибута действует на все задаваемые после этого примитивы, до тех пор, пока значение атрибута не будет изменено. Измене- ние значения атрибута не влияет на примитивы, изображенные до этого. В пакете OpenGL цвета можно задавать, используя либо цветовой режим RGB (RGBA), либо режим цветовых индексов, при котором для выбора цвета используются элементы цветовой таблицы. Кроме того, значения цветов смешиваются с помощью цветового компонента альфа. Также можно задавать значения цветовых массивов, которые ис- пользуются вместе с массивами вершин. Кроме того, в пакете OpenGL предлагаются функции для выбора размера точки, ширины линии, стиля линии и стиля заполне-
340 Глава 4. Атрибуты графических примитивов ния выпуклого многоугольника, а также функции для изображения многоугольных закрашенных фигур в виде набора сторон или набора точек-вершин. Можно также удалить с рисунка выделенные стороны многоугольника и поменять местами перед- нюю и заднюю поверхности. В пакете OpenGL можно создавать текстовые строки, используя для этого битовые массивы или стандартные процедуры, существующие в библиотеке GLUT. К числу атрибутов, которые можно присваивать изображениям символов библиотеки GLUT, относятся цвет, шрифт, размер, расстояние между сим- волами, ширина и тип линии. В библиотеке OpenGL предлагаются также функции для устранения контурных неровностей изображения результирующих примитивов. Кроме того, чтобы узнать текущее значение переменной состояния, можно восполь- зоваться функциями запроса, а также узнать все значения группы атрибутов OpenGL с помощью одной функции. В табл. 4.2 приведены все функции атрибутов OpenGL, которые рассматривались в этой главе. Кроме того, в таблице есть несколько функций, имеющих непосред- ственное отношение к атрибутам. ТАБЛИЦА 4.2. Обзор функций атрибутов OpenGL Функция Описание glutlnitDisplayMode Выбирается цветовой режим: GLUT_RGB либо GLUT_INDEX glColor* gllndex* Задается цвет RGB или RGBA Задается цвет с использованием элемен- тов таблицы цветов glutSetColor (index, r, g, b); glEnable (GL_BLEND); Запись цвета в определенную позицию таблицы цветов Активизация функции смешивания цветов glBlendFunc (sFact, dFact); glEnableClientState (GL_COLOR_ARRAY); Задаются коэффициенты смешивания цветов Активизируются возможности создания цветовых массивов OpenGL glColorPointer(size, type, stride, array); Задается цветовой массив RGB gllndexPointer(type, stride, array); Задается цветовой массив в режиме цве- товых коэффициентов
Литература 341 Окончание табл. 4.2 Функция Описание glPointSize (size) Задается размер точки glLineWidth (width); Задается ширина линии glEnable Активизируется стиль линии (GL_LINE_STIPPLE); glEnable Активизируется стиль заполнения (GL_POLYGON_STIPPLE); glLineStipple (repeat, pattern); Задается узор стиля линии glPolygonStipple Задается узор стиля заполнения (pattern); glPolygonMode Передняя или задняя сторона фигуры изобража- ется как набор сторон или вершин glEdgeFlag Устанавливается флаг стороны закрашенного многоугольника со значением GL_TRUE или GL_FALSE, что определяет статус этой стороны glFrontFace Порядок вершин передней стороны задается как GL_CCW или GL_CW glEnable Активизируется устранение контурных неровно- стей с помощью функций GL_POINT_SMOOTH, GL_LINE_SMOOTH или GL_POLYGON_SMOOTH. (Еще нужно активизировать функцию смешива- ния цветов) glGet** Различные функции запроса, выявляющие специ- фикацию типа данных, имя символьной констан- ты параметра состояния и ссылку на массив glPushAttrib Сохранение всех параметров состояния в задан- ной группе атрибутов glPopAttrib Восстановление всех значений параметров состо- яния, которые были сохранены последними IM ЛИТЕРАТУРА Методики мягкого окрашивания описываются в статье [97]. Способы устранения контурных неров- ностей рассматриваются в работах [68, 109, 175, 182, 260, 362, 402]. Приложения, в которых исполь- зуются оттенки серого цвета, изучаются в работе [67]. Другие рассуждения, связанные с атрибутами и параметрами состояния, можно найти в публикациях [8, 122, 151, 176, 244].
342 Глава 4. Атрибуты графических примитивов Примеры программ с использованием функций атрибутов OpenGL приведены в книге [400]. Полный перечень функций атрибутов OpenGL можно найти в справочнике [320], а атрибуты сим- волов библиотеки GLUT обсуждаются в книге [174]. УПРАЖНЕНИЯ 4.1. Воспользуйтесь функцией glutSetColor и составьте цветовую таблицу из набора вход- ных цветовых значений. 4.2. С помощью цветового массива и массива вершин составьте описание сцены, содержащей по меньшей мере шесть двухмерных объектов. 4.3. Напишите программу для изображения двухмерной сцены, описанной в предыдущем упраж- нении. 4.4. С помощью цветового массива и массива вершин составьте описание сцены, содержащей по меньшей мере четыре трехмерных объекта. 4.5. Напишите программу для изображения двухмерной сцены, на которой с помощью шкалы яркости нанесены “облака”, причем форма облаков описывается с помощью точечных узоров на фоне голубого неба. Темные и светлые участки облаков смоделируйте точками разных размеров и при разном расстоянии между этими точками. (Например, очень светлую область можно смоделировать с помощью мелких, расположенных далеко друг от друга светло-серых точек. Точно так же темную область можно передать с помощью больших, расположенных ближе друг к другу темно-серых точек.) 4.6. Измените программу из предыдущего упражнения таким образом, чтобы изображенные облака были красного и желтого цвета, как они могли бы выглядеть во время заката или восхода солнца. Для достижения эффекта реальности воспользуйтесь различными оттенками красного и желтого (а возможно, и зеленого) цветов при изображении точек. 4.7. Примените общую функцию стиля линии, изменив алгоритм Брезенхема для построения прямой линии, чтобы получилось изображение сплошной, штрихованной или пунктир- ной линии. 4.8. Примените функцию стиля линии, воспользовавшись алгоритмом средней точки, чтобы по- лучилось изображение сплошной, штрихованной или пунктирной линии. 4.9. Придумайте параллельный способ реализации функции стиля линии. 4.10. Придумайте параллельный способ реализации функции ширины линии. 4.11. Прямую линию, заданную двумя конечными точками и шириной линии, можно преобра- зовать в прямоугольник с четырьмя вершинами, а затем изобразить с помощью растрового метода. Разработайте эффективный алгоритм для вычисления координат четырех вершин, необходимых для определения такого прямоугольника, используя концы отрезка и ширину линии в качестве входных параметров. 4.12. Примените функцию ширины линии в программе для построения прямой линии таким образом, чтобы можно было изобразить любую из трех ширин линий. 4.13. Напишите программу для построения линейного графика трех наборов данных в одном и том же диапазоне координат х. Входные данные программ должны включать в себя три набора значений и подписи к графикам. Наборы данных должны иметь соответствующий масштаб, позволяющий графикам попадать в координатную область окна изображения. Ис- пользуйте различные стили линий для разных кривых. 4.14. Измените программу из предыдущего упражнения таким образом, чтобы можно было по- строить три графика разного цвета, а также с разными стилями линий. L
Упражнения 343 4.15. Установите алгоритм для изображения широких линий со стыковым, овальным и проекци- онным прямоугольным перекрытием. Эти опции могут предлагаться в меню. 4.16. Придумайте алгоритм для изображения широкой ломаной линии с угловым, скругленным или косым соединением. Эти опции могут предлагаться в меню. 4.17. Измените фрагменты программы из раздела 4.8 для изображения линейных графиков дан- ных таким образом, чтобы процедуре linePlot сообщался параметр ширины линии. 4.18. Измените фрагменты программы из раздела 4.8, чтобы при изображении линейных графиков процедуре linePlot сообщался параметр стиля линии. 4.19. Завершите программу из раздела 4.8, чтобы она изображала линейные графики, воспользо- вавшись входными значениями из файла данных. 4.20. Завершите программу из раздела 4.8, чтобы она изображала линейные графики, воспользо- вавшись входными значениями из файла данных. Кроме того, программа должна обозначать координатные осей и координаты изображенной на экране области. Наборы данных должны иметь соответствующий масштаб, чтобы попадать в координатную область окна изображе- ния, а каждая линия на графике должна быть другого цвета, ширины и стиля. 4.21. Примените опции меню кисти и пера в процедуре для построения прямой линии, исполь- зовав по меньшей мере две опции: круглую и квадратную форму. 4.22. Измените алгоритм для построения прямой линии таким образом, чтобы интенсивность изображаемой линии была пропорциональна углу ее наклона. Это означает, что при под- боре интенсивностей пикселей согласно значению тангенса угла наклона интенсивность изображаемых линий в расчете на единицу длины будет одинаковой. 4.23. Определите и примените функцию для управления стилем линии (сплошная, штрихованная, пунктирная) изображаемого эллипса. 4.24. Определите и примените функцию для назначения ширины изображаемого эллипса. 4.25. Напишите процедуру изображения гистограммы в любой заданной части экрана. Входные данные должны содержать набор данных, обозначения координатных осей и координаты области экрана. Набор данных должен иметь соответствующий масштаб, чтобы попадать в обозначенную область экрана, а столбцы гистограммы должны закрашиваться заданным цветом или узором. 4.26. Напишите процедуру изображения двух наборов данных, заданных в одном и том же диа- пазоне координат х, где значения данных должны иметь соответствующий масштаб, чтобы попадать в заданную область окна изображения. Столбцы гистограммы одного из наборов данных должны изображаться горизонтально, чтобы получился узор из перекрывающихся столбцов гистограммы, что упрощает процесс сравнения этих двух наборов данных. Для разных наборов столбцов гистограмм используйте разные цвета или узоры заполнения. 4.27. Придумайте алгоритм реализации цветовой поисковой таблицы. 4.28. Предположите, что дана система с экраном размером 8 на 10 дюймов, на котором можно получить изображение 100 пикселей на один дюйм. Если в этой системе используется цвето- вая поисковая таблица, состоящая из 64 элементов, то каким будет наименьший возможный размер (в байтах) буфера кадра? 4.29. Рассмотрим растровую RGB-систему с буфером кадра размером 512 на 512 при 20 бит на пиксель и с цветовой поисковой таблицей с 24 бит на пиксель. 1. Сколько различных оттен- ков серого цвета можно получить с помощью этой системы? 2. Сколько различных цветов (в том числе и оттенков серого) можно изобразить? 3. Сколько цветов можно изображать за один раз? 4. Каков общий объем памяти? 5. Опишите два способа уменьшения размера памяти при сохранении таких же возможностей передачи цветов.
344 Глава 4. Атрибуты графических примитивов 4.30. Измените растровый алгоритм таким образом, чтобы к внутренней части многоугольника можно было применить любой заданный прямоугольный узор заполнения, начиная с обо- значенной точки узора. 4.31. Напишите программу для преобразования стандартов развертки внутренней области задан- ного эллипса, служащую для закрашивания его одним цветом. 4.32. Напишите процедуру для закрашивания внутренней области данного эллипса заданным узором. 4.33. Напишите процедуру для заполнения внутренней области любого заданного набора вер- шин закрашенной фигуры, в том числе и фигуры с пересекающимися сторонами, используя правило ненулевого количества витков для определения внутренних областей. 4.34. Измените алгоритм граничного заполнения четырехсвязной области таким образом, чтобы можно было избежать занесения в стек лишней информации, включив в него растровые методы. 4.35. Напишите процедуру для граничного заполнения восьмисвязной области. 4.36. Объясните, как эллипс, изображенный с помощью метода средней точки, можно правильно закрасить с помощью алгоритма граничного заполнения. 4.37. Разработайте и реализуйте алгоритм потокового заполнения для закрашивания внутренней части любой заданной фигуры. 4.38. Определите и реализуйте процедуру для изменения размера существующего прямоугольного узора заполнения. 4.39. Напишите процедуру реализации алгоритма мягкого закрашивания. Тщательно определите, какой алгоритм мягкого закрашивания следует применить и какие цвета объединить. 4.40. Придумайте алгоритм для подбора высоты и ширины символов, заданных в виде прямо- угольной сетки. 4.41. Примените стандартные функции для определения вектора ориентации символов и направ- ления текстовой дорожки для управления изображением текстовой строки. 4.42. Напишите программу для выравнивания текста с помощью заданных входных значений параметров выравнивания. 4.43. Разработайте процедуры для применения атрибутов маркеров (размера и цвета). 4.44. Реализуйте процедуру устранения контурных неровностей, дополнив алгоритм построения прямой линии Брезенхема таким образом, чтобы можно было подбирать интенсивности пикселей непосредственно около траектории прямой. 4.45. Реализуйте процедуру устранения контурных неровностей в алгоритме средней точки для прямой линии. 4.46. Разработайте алгоритм для устранения контурных неровностей границ эллипса. 4.47. Измените растровый алгоритм для закрашивания фигур, включив в него функцию устра- нения контурных неровностей. Воспользуйтесь когерентными методами для уменьшения количества вычислительных операций в следующих друг за другом строках развертки. 4.48. Напишите программу для применения алгоритма сглаживания Питтвея-Уоткинсона как растровой процедуры для заполнения внутренней области многоугольника, воспользовав- шись функцией нанесения точек на график пакета OpenGL.
BA 5 Геометрические преобразования Ландшафтная сцена, при построении которой использовались броуновское движение и отражение луны в воде (перепечатано с разрешения Кена Масгрейва (Ken Musgrave) и Бенуа Мандельброта (Benoit Mandelbrot), факультет математики и информатики, Йельский университет)
5.1. Базовые двухмерные геометрические преобразования 5.9. Геометрические преобразования в трехмерном пространстве 5.2. Матричные представления и однородные 5.10. Трехмерная трансляция координаты 5.11. Трехмерный поворот 5.3. Обратные преобразования 5.12. Трехмерное масштабирование 5.4. Двухмерные сложные преобразования 5.13. Сложные трехмерные преобразования 5.5. Другие двухмерные преобразования 5.14. Другие трехмерные преобразования 5.6. Растровые методы геометрических преобразований 5.15. Переход между трехмерными системами координат 5.7. Растровые преобразования в OpenGL 5.16. Аффинные преобразования 5.8. Переход между двухмерными системами координат 5.17. 5.18. Функции OpenGL геометрических преобразований Резюме д о этого момента рассказывалось, как сцену можно описать через такие графические примитивы, как отрезки и закрашенные области, используя параметры этих примитивов. Кроме того, изучалось отображение выход- ных примитивов на растровое устройство с помощью алгоритмов строк развертки. В данной главе рассматриваются преобразования, под воздействием кото- рых объекты меняют свое положение или размеры. Эти операции также используются в процедурах наблюдения, переводящих описание сцены во внешних координатах на устройство вывода. Кроме того, они применяются во множестве других приложений, например, автоматизированном проектировании и компьютерной анимации. Архи- тектор, например, создает план, варьируя ориентацию и размер частей-компонентов, а специалист по компьютерной анимации проектирует видеоряд, перемещая “камеру” или объекты сцены по заданным траекториям. Операции, применяющиеся к геомет- рическому описанию объекта с целью изменения его положения, ориентации или размера, называются геометрическими преобразованиями. Иногда операции геометрического преобразования также называются преобразо- ваниями моделирования, но в некоторых графических пакетах значения этих двух терминов отличаются. Вообще, преобразования моделирования используются для построения сцены или формирования иерархического описания сложного объекта, составленного из нескольких частей, которые, в свою очередь, можно разделить на более простые части, и т.д. В качестве примера рассмотрим самолет. Он состоит из
348 Глава 5. Геометрические преобразования крыльев, хвоста, фюзеляжа, двигателя и других частей, каждая из которых представ- ляется через компоненты второго уровня, которые также можно представить набором частей нижестоящего иерархического уровня. Таким образом, самолет можно описать через эти компоненты и соответствующие преобразования “моделирования”, показы- вающие, как данный компонент встраивается в общую схему самолета. С другой сто- роны, геометрические преобразования используются для описания того, как объект движется по сцене в анимационной последовательности, или просто для того, чтобы посмотреть на объекты под другим углом. Некоторые графические пакеты обладают двумя наборами процедур преобразования, тогда как другие пакеты содержат один набор функций, который можно использовать и в геометрических преобразованиях, и в преобразованиях моделирования. БАЗОВЫЕ ДВУХМЕРНЫЕ ГЕОМЕТРИЧЕСКИЕ ПРЕОБРАЗОВАНИЯ Во всех графических пакетах есть функции для выполнения таких геометрических преобразований, как трансляция, вращение и масштабирование. В число других по- лезных процедур, которые часто включают в пакеты, входят процедуры отражения и сдвига. Чтобы представить общие концепции, связанные с геометрическими преоб- разованиями, рассмотрим вначале операции в двух измерениях, затем обсудим, как эти базовые идеи можно расширить на трехмерные сцены. Отметим, что знание ба- зовых концепций позволяет легко писать процедуры геометрических преобразований объектов двухмерной сцены. ДВУХМЕРНАЯ ТРАНСЛЯЦИЯ Трансляция отдельной точки выполняется путем добавления смещений к ее коорди- натам, в результате чего получается точка с новыми координатами. По сути, исходная точка перемещается по прямой линии в новое положение. Подобным образом дей- ствие трансляции на объект, определенный множеством точек (например, четырех- угольник), заключается в перемещении всех точек объекта на одинаковое расстояние вдоль параллельных прямых. Затем весь объект отображается в новом положении. Чтобы транслировать двухмерную точку, к исходным координатам (х, у) добав- ляются приращения tx nty, в результате чего получается новая точка с координатами (х1, у'}, как показано на рис. 5.1. xl = x + tx, y' = y + ty. (5-1) Пара приращений (tx, называется вектором трансляции или вектором сдвига.
5.1. Базовые двухмерные геометрические преобразования 349 Рис. 5.1. Трансляция точки из положения Р в положение Р' с ис- пользованием вектора трансляции Т Уравнения трансляции (5.1) можно записать как одно матричное уравнение, в котором будут фигурировать приведенные ниже векторы-столбцы, представляющие координаты точек и вектор трансляции. Р = Р' = tx ty (5.2) т = Такие обозначения позволяют записать двухмерные уравнения трансляции в матрич- ной форме: Р' Р Т (5-3) Трансляция является жестким преобразованием, передвигающим объекты без дефор- мации. Следовательно, все точки объекта транслируются на одну величину. Чтобы транслировать отрезок прямой, преобразование (5.3) применяется к обеим конеч- ным точкам отрезка, после чего между двумя новыми концами проводится линия. Многоугольник транслируется аналогично: к каждой вершине прибавляется вектор трансляции, а затем многоугольник строится заново с использованием нового набора вершин. На рис. 5.2 иллюстрируется действие с заданным вектором трансляции для перемещения объекта из одного положения в другое. Операция трансляции иллюстрируется в следующей процедуре. С помощью вход- ного вектора трансляции п вершин многоугольника перемещаются из одного поло- жения в другое, а для повторного построения многоугольника применяются проце- дуры OpenGL. class wcPt2D { public: GLfloat x, у;
350 Глава 5. Геометрические преобразования void translatePolygon (wcPt2D * verts, GLint nVerts, GLfloat tx, GLfloat ty) { GLint k; for (к = 0; к < nVerts; k++) { verts [k].x = verts [k].x + tx; verts [k].y = verts [k].y + ty; } glBegin (GL_POLYGON) ; for (к = 0; к < nVerts; k++) glVertex2f (verts [k].x, verts [k].y); glEnd ( ); Если исходный многоугольник требуется удалить, его можно перед трансляцией закрасить цветом фона. В некоторых графических пакетах используются и другие методы удаления компонентов изображения. Кроме того, если исходное положение многоугольника нужно сохранить, транслированные точки можно записать в другом массиве. Для трансляции других объектов используются сходные методы. Чтобы изменить положение круга или эллипса, транслируются координаты центра, а затем фигура перерисовывается в новом положении. Для сплайновой кривой транслируются точки, определяющие ее траекторию, а затем восстанавливаются точки, лежащие между транслированными.
5.1. Базовые двухмерные геометрические преобразования 351 Рис. 5.3. Поворот объекта на угол 0 вокруг центра вращения (хТ, уг) Рис. 5.4. При повороте на угол 9 относительно начала координат точка из положения (т. у) переходит в положение (х', у'). Исходное угловое смещение точки от оси х равно ф ДВУХМЕРНЫЙ ПОВОРОТ Для поворота объекта задается ось вращения и угол поворота. Затем все точки объекта переводятся в новые положения путем поворота точек на заданный угол вокруг оси вращения. Двухмерный поворот объекта — это перемещение объекта по круговой траектории на плоскости ху. В этом случае объект поворачивается относительно оси вращения, перпендикулярной плоскости ху (параллельной координатной оси z). Параметра- ми двухмерного поворота являются угол поворота в и точка (хг, уг), называемая центром поворота (или центром вращения), вокруг которой поворачивается объект (рис. 5.3). Центр поворота является точкой пересечения оси вращения с плоскостью ху. Положительный угол в определяет направление против часовой стрелки вокруг центра поворота, и этот вариант иллюстрируется на рис. 5.3, а при отрицательном угле объект поворачивается по часовой стрелке. Чтобы упростить объяснение базового метода, определим вначале уравнения пре- образования вращения точки Р, когда центром вращения является начало координат. Связь углов и координат исходного и конечного положений точки показана на рис. 5.4. На этом рисунке г — постоянное расстояние точки от начала координат, угол ф — исходное угловое положение точки относительно горизонтальной линии, в — угол
352 Глава 5. Гэометрические преобразования поворота. Используя стандартные тригонометрические тождества, преобразованные координаты можно выразить через углы 0 и ф: х' = г cos(0 + в) = г cos ф cos в — г sin ф sin 0; у' = г sin(0 + 0) = г cos ф sin 0 4- г sin </>cos 0. (5.4) Исходные полярные координаты точки равны: х = г cos ф, у — г sin ф. (5-5) Подставляя выражения (5.5) в (5.4), получаем уравнения преобразования для пово- рота точки с координатами (х, у) на угол 0 вокруг начала координат: х' = х cos 0 - у sin 0; у' = ж sin 0 + у cos в. (5.6) Используя представление через векторы-столбцы (5.2), уравнения поворота можно записать в матричной форме: P' = R Р, (5-7) где матрица поворота имеет такой вид: R = cos0 -sin0 sin 0 cos 0 (5.8) Представление координат точки Р вектором-столбцом, как это сделано в уравнени- ях (5.2), является принятой математической формой записи. В то же время, в первых графических системах координаты точки иногда представлялись вектором-строкой. При таком подходе меняется порядок матриц при умножении, выполняемом при рас- чете поворота. Однако в настоящее время такие графические пакеты, как OpenGL, Java, PHIGS и GKS, используют стандартную запись через векторы-столбцы. Поворот точки вокруг произвольной оси иллюстрируется на рис. 5.5. Используя тригонометрические тождества для двух прямоугольных треугольников, показанных на рисунке, уравнения (5.6) можно обобщить и получить формулы преобразования, описывающие поворот точки вокруг любой заданной оси вращения (хг, уг): х1 = xr + (х — xr) cos в — (у — уг} sin 0; у' = Уг + (х - хТ) sin 0 + [у - уг) cos 0. (5.9) Данные общие уравнения поворота отличаются от уравнений (5.6) наличием допол- нительных членов, а также множителей при координатах. Отметим, что матричное
5.1. Базовые двухмерные геометрические преобразования 353 Рис. 5.5. Поворот точки (х, у) в точку (х1, у') на угол в вокруг ТОЧКИ (хг, Ут) выражение (5.7) можно модифицировать, чтобы оно включало координаты центра вращения, введя в него матричное прибавление вектора-столбца, элементы которого содержат аддитивные (отвечающие за трансляцию) члены из уравнений (5.9). Впро- чем, есть лучший путь формулировки таких матричных уравнений, и в разделе 5.2 об- суждается более последовательная схема представления уравнений преобразования. Как и трансляция, поворот — это жесткое преобразование, не деформирующее объекты. Все точки объекта поворачиваются на одинаковый угол. Чтобы повернуть отрезок прямой, на оба его конца действуют преобразованием вращения (5.9), после чего между полученными точками проводится новая линия. Поворот многоугольника включает поворот всех его вершин на заданный угол с последующим построением многоугольника по новым точкам. Для поворота кривой сначала поворачиваются ее определяющие точки, а затем по ним строится новая кривая. Чтобы, например, по- вернуть окружность или эллипс вокруг оси, не проходящей через центр, этот центр перемещается по дуге, стягивающей заданный угол поворота. Наконец, чтобы повер- нуть эллипс вокруг его центра, можно просто вращать большую и малую оси. В приведенном ниже фрагменте кода многоугольник поворачивается вокруг за- данной во внешних координатах оси вращения. Входными параметрами процедуры являются исходные вершины многоугольника, координаты центра вращения и угол поворота theta, заданный в радианах. После преобразования положений вершин многоугольник восстанавливается с использованием процедур OpenGL. class wcPt2D { public: GLfloat x, у; }; void rotatePolygon (wcPt2D * verts, GLint nVerts, wcPt2D pivPt, GLdouble theta) { wcPt2D * vertsRot; GLint k; for (k = 0; k < nVerts; k++)
354 Глава 5. Геометрические преобразования { } vertsRot [к].х = pivPt.x + (verts [к].х - pivPt.x) * cos (theta) - (verts [к].у - pivPt.y) * sin (theta); vertsRot [к].у - pivPt.y + (verts [k].x - pivPt.x) * sin (theta) + (verts [к].у - pivPt.y) * cos (theta); glBegin GL_POLYGON; for (к = 0; к < nVerts; k++) glVertex2f (vertsRot [k].x, vertsRot [k].y); glEnd ( ); ДВУХМЕРНОЕ МАСШТАБИРОВАНИЕ Чтобы изменить размер объекта, применяется преобразование масштабирования. Простая операция двухмерного масштабирования заключается в умножении точек объекта (х, у) на масштабные коэффициенты sx и sy, в результате чего получаются преобразованные координаты (х1, у'): х' = х - sx, у' ~ У ' sy (5.10) Масштабный коэффициент sx отвечает за изменение размеров объекта по оси х, а коэффициент Sy — по оси у. Стандартные уравнения двухмерного масштабирова- ния (5.10) также можно записать в следующей матричной форме: х' _ sx 0 х y'J ~ [ ° SyJ [у или Р' = S Р, (5.Н) (5-12) где S — матрица масштабирования 2 на 2, представленная в уравнении (5.11). Масштабными коэффициентами sx и sy могут быть любые положительные зна- чения. Значения, которые меньше 1, сокращают размер объектов; значения, превы- шающие 1, дают увеличение. Если оба коэффициента sx и sy положить равными 1, размер объекта не изменится. Если коэффициентам sx и sy присвоены одинаковые значения, получаем равномерное масштабирование, при котором поддерживаются относительные пропорции объекта. Неравные значения sx и sy дают дифференци- альное масштабирование, которое часто используется в приложениях разработки, где изображения строятся по нескольким базовым формам, которые можно настраивать с помощью преобразований масштабирования и выбора ориентации (рис. 5.6). В неко-
5.1. Базовые двухмерные геометрические преобразования 355 Рис. 5.6. Превращение квадрата (панель а) в прямоугольник (панель б) с помощью масштабных коэффициентов sx = 2 и sy = 1 Рис. 5.7. Линия, масштабированная с помощью уравнения (5.12) при sx = sy = 0,5, сокращается вдвое и приближается к началу координат У Рис. 5.8. Масштабирование относительно выбранной фиксированной точки (xf, yf ). Расстояние от каждой вершины многоугольника до фиксированной точки масштабируется с помощью уравнений (5.13) торых системах параметрам масштабирования можно присваивать отрицательные значения. При этом объект не только масштабируется, но и отображается относи- тельно одной или нескольких координатных осей. Объекты, преобразованные с помощью уравнения (5.11), масштабируются и пере- носятся в другое место. При масштабных коэффициентах, которые по модулю меньше 1, объекты приближаются к началу координат, а при масштабных коэффициентах, по модулю превышающих 1, объекты удаляются от начала координат. На рис. 5.7 ил- люстрируется масштабирование отрезка, когда обоим масштабным коэффициентам sx и Sy в уравнении (5.11) присвоено значение 0,5. При этом и длина отрезка, и его расстояние от начала координат уменьшается вдвое. Положение масштабированного объекта можно контролировать, задавая непо- движную точку, которая не меняется при преобразовании. Координаты неподвижной точки (х f, yf) часто выбираются так, чтобы она принадлежала объекту, зачастую в качестве неподвижной точки выбирается центр масс тела (приложение А), но точно
356 Глава 5. Геометрические преобразования так же можно выбрать любую точку пространства. В таком случае изменение раз- меров объекта происходит за счет изменения расстояний между точками объекта и неподвижной точкой (рис. 5.8). Затем с помощью указанных ниже преобразований для точки с координатами (х, у) вычисляются масштабированные координаты (х', у'). х' -xf = (x-xf)sx, у' -yf = (у ~yf)sy (5.13) Уравнения (5.13) можно переписать, чтобы разделить мультипликативные и аддитив- ные члены: х' = X sx + Xf(l - sx), у' = у- Sy + yf(l-Sy), (5.14) где аддитивные члены жу(1 — sx) и уД1 — sy) являются константами для всех точек объекта. Координаты неподвижной точки включаются в уравнения масштабирования по- добно тому, как в уравнения поворота включаются координаты центра вращения. Вначале можно сформировать вектор-столбец, элементами которого являются по- стоянные члены в уравнениях (5.14), затем прибавить этот вектор-столбец к про- изведению S • Р в уравнении (5.12). В следующем разделе обсуждается матричная формулировка уравнений преобразования, включающая только умножение матриц. Многоугольники масштабируются следующим образом: вначале преобразова- ния (5.14) применяются к каждой вершине, затем по преобразованным вершинам строится новый многоугольник. При обработке других объектов уравнения масшта- бирования применяются к параметрам, определяющим эти объекты. Чтобы изменить размер круга, можно масштабировать его радиус и рассчитать новые координаты точек окружности. Чтобы изменить размер эллипса, на главные оси воздействуют па- раметрами масштабирования, а затем строится новый эллипс (неподвижной точкой является центр эллипса). В приведенной ниже процедуре иллюстрируется масштабирование многоуголь- ника. Входными параметрами процедуры являются координаты вершин многоуголь- ника и фиксированных точек, а также масштабные коэффициенты. Преобразовав координаты, с помощью процедур OpenGL мы генерируем масштабированный мно- гоугольник. class wcPt2D { public: GLfloat x, у;
5.2. Матричные представления и однородные координаты 357 void scalePolygon (wcPt2D * verts, GLint nVerts, wcPt2D fixedPt, GLfloat sx, GLfloat sy) { wcPt2D vertsNew; GLint k; for (к = 0; к < nVerts; k++) { vertsNew [k],x = verts [k].x * sx + fixedPt.x * (1 - sx); vertsNew [k].y = verts [к].у * sy + fixedPt.у * (1 - sy); ) glBegin GL_POLYGON; for (к = 0; к < nVerts; k++) glVertex2f (vertsNew [k].x, vertsNew [kj.y); glEnd ( ); 5.2. МАТРИЧНЫЕ ПРЕДСТАВЛЕНИЯ И ОДНОРОДНЫЕ КООРДИНАТЫ Во многих графических приложениях реализованы последовательности геометриче- ских преобразований. В анимации может потребоваться транслировать и поворачи- вать объект на последовательность кадров. В приложениях разработки и построе- ния изображений трансляция, повороты и масштабирование выполняются для того, чтобы правильно разместить компоненты изображения в нужных местах. Кроме то- го, преобразование наблюдения включает в себя последовательность трансляций и поворотов, необходимых, чтобы перейти от исходной спецификации сцены к изоб- ражению на устройстве вывода. Ниже показывается, как матричные представления, рассмотренные в предыдущих разделах, можно переформулировать так, чтобы по- следовательности преобразования обрабатывались эффективно. В разделе 5.1 показывалось, что любое из трех базовых двухмерных преобразова- ний (трансляция, поворот и масштабирование) можно выразить в общей матричной форме: P' = Mi-P + M2, (5.15) где координаты точек Р и Р' представлены векторами-столбцами. Матрица Mi имеет размер 2 на 2 и содержит множители, а М2 — это двухэлементная матрица-столбец, содержащая трансляционные члены. В случае трансляции Mi — единичная мат- рица. При повороте или масштабировании М2 содержит трансляционные члены, связанные с осью вращения или неподвижной точкой преобразования масштабиро- вания. Чтобы с помощью этих уравнений получить последовательность преобразова- ний (например, масштабирование с последующим поворотом и трансляцией), можно рассчитать преобразованные координаты поэтапно. Вначале точки масштабируются,
358 Глава 5. Геометрические преобразования затем поворачиваются и транслируются. Однако гораздо эффективнее вначале объ- единить преобразования, чтобы координаты конечных точек получались непосред- ственно из координат исходных, без расчета координат промежуточных точек. Для этого можно переформулировать уравнение (5.15) и исключить из него операцию матричного сложения. ОДНОРОДНЫЕ КООРДИНАТЫ Мультипликативные и трансляционные члены двухмерного геометрического преоб- разования можно объединить в одну матрицу, если расширить координатные пред- ставления на матрицы 3 на 3. При этом в третий столбец матрицы преобразования можно будет ввести трансляционные члены, и тогда все уравнения преобразований можно будет выразить в форме умножения матриц. Однако, чтобы это сделать, нуж- но также расширить матричное представление двухмерных точек в трехэлементный вектор-столбец (матрицу). Стандартной техникой, используемой при этом, является расширение представления двухмерной точки (х, у) до трехэлементного представле- ния (хн, Ун, h), именуемого представлением в однородных координатах, где одно- родный параметр h — это такая ненулевая величина, при которой Xh УН Х = Т' У = Т- (5.16) Следовательно, произвольное представление в двухмерных однородных координатах можно также записать как (h- х, h у, h). Для геометрических преобразований одно- родный параметр h можно положить равным любому ненулевому значению. Следо- вательно, существует бесконечное число эквивалентных однородных представлений каждой точки с координатами (х, у). Поэтому удобно просто положить h = 1. В этом случае любая двухмерная точка будет представляться однородными координатами (х, у, 1). Другие значения параметра h требуются, например, в матричной формулировке трехмерных преобразований наблюдения. Термин однородные координаты используется при описании данного представле- ния уравнениями в ПДСК. Когда точка с декартовыми координатами (х, у) переводит- ся в однородное представление (хн, Ун, h), уравнения, содержащие х и у, такие как /(х,у) = 0, становятся однородными уравнениями по трем параметрам .тд, уд и h. Сказанное просто означает, что, если все параметры уравнения заменить величиной v, умноженной на этот параметр, значение v можно будет вынести из уравнения. Выражение точек в однородных координатах позволяет представить все уравне- ния геометрических преобразований в форме матричного умножения, что и являет- ся стандартным методом, используемым в графических системах. Двухмерные точ- ки представляются трехэлементными векторами-столбцами, а двухмерные операции преобразования выражаются матрицами 3 на 3.
5.2. Матричные представления и однородные координаты 359 МАТРИЦА ДВУХМЕРНОЙ ТРАНСЛЯЦИИ Используя концепцию однородных координат, уравнения двухмерной трансляции точ- P' = T(fx,tJ-P, (5.18) где T(fx, ty) — матрица трансляции 3 на 3, записанная в уравнении (5.17). В ситуаци- ях, когда параметры трансляции неоднозначны, матрицу трансляции можно просто представлять как Т. МАТРИЦА ДВУХМЕРНОГО ПОВОРОТА Уравнения двухмерного поворота вокруг начала координат можно выразить в мат- ричной форме следующим образом: 'х'~ 'cos 9 —sin# 0‘ 'x' у' = sin# cos # 0 У (5-19) 1 0 0 1 .1. или так: Р' = R(#) • P (5.20) Оператор преобразования вращения R(#) — это матрица 3 на 3 из уравнения (5.19) с параметром поворота 9. Данную матрицу поворота можно записывать просто как R. В некоторых графических библиотеках функция двухмерного поворота генери- рует только поворот вокруг начала координат, представленный в уравнении (5.19). Поворот вокруг любой другой оси нужно реализовывать как последовательность преобразований. Альтернативный подход — ввести в процедуру поворота дополни- тельные параметры, определяющие координаты оси вращения. После этого процеду- ра поворота, включающая параметр центра вращения, будет задавать общую матрицу поворота без вызова последовательности функций преобразований.
360 Глава 5. Геометрические преобразования МАТРИЦА ДВУХМЕРНОГО МАСШТАБИРОВАНИЯ Наконец, преобразование масштабирования относительно начала координат можно выразить в виде следующего умножения матриц: ~х'~ 0 О’ ~х' у' = 0 sy 0 У (5-21) . 1 . . 0 0 1. .1. или P' = S(S!r,sy)-P. (5.22) Оператор масштабирования S(sx, sy) — это матрица 3 на 3 из уравнения (5.21) с па- раметрами sx и Sy. Далее матрицу масштабирования часто будем записывать просто как S. В некоторых библиотеках имеются только функции масштабирования относи- тельно начала координат, описываемого уравнением (5.21). В этом случае преобразо- вание масштабирования относительно другой точки выполняется как последователь- ность операций преобразования. В то же время, в другие системы включена процеду- ра масштабирования, позволяющая строить однородную матрицу масштабирования относительно любой заданной неподвижной точки. 5.3. ОБРАТНЫЕ ПРЕОБРАЗОВАНИЯ В матрице обращения трансляции расстояния, на которые выполнялась трансляция, берутся с противоположными знаками. Следовательно, если двухмерная трансляция выполнялась на расстояния tx и ty, обратная матрица трансляции имеет такой вид: т-1 ’1 0 -tx' 0 1 -ty О 0 1 (5.23) Эта матрица определяет трансляцию в противоположном направлении, причем про- изведение матрицы трансляции и обратной к ней дает единичную матрицу. Обращение поворота выполняется поворотом на минус тот же угол. Например, двухмерному повороту на угол в вокруг начала координат соответствует следующая матрица обратного преобразования: R-1 cos О sin 6 0 -sin# cos 6 0 0 0 1 (5-24)
5.4. Двухмерные сложные преобразования 361 Отрицательные значения углов поворота дают вращение по часовой стрелке, поэто- му при умножении матрицы поворота на обратную получается единичная матрица. Поскольку при изменении знака угла поворота меняется значение только функции си- нус, обратную матрицу можно получить, поменяв местами строки и столбцы прямой матрицы. Следовательно, матрица, обратная к матрице поворота R, равна транспо- нированной матрице (R-1 = Rr). Матрица обратного преобразования масштабирования получается заменой пара- метров масштабирования обратными величинами. При двухмерном масштабирова- нии с параметрами sx и sy относительно начала координат обратная матрица запи- сывается следующим образом: Обратная матрица генерирует противоположное преобразование масштабирования, поэтому умножение любой матрицы масштабирования на обратную дает единичную матрицу. ДВУХМЕРНЫЕ СЛОЖНЫЕ ПРЕОБРАЗОВАНИЯ Используя матричные представления, последовательность преобразований можно за- дать в виде матрицы сложного преобразования, вычислив произведение отдель- ных преобразований. Поиск произведений матриц преобразований часто называется сверткой матриц. Поскольку точка представляется однородным вектором-столбцом, на вектор-столбец нужно перемножить слева направо матрицы, представляющие тре- буемые преобразования. Кроме того, поскольку обычно одна последовательность пре- образований применяется ко многим точкам сцены, эффективнее вначале перемно- жить матрицы преобразования и получить одну матрицу сложного преобразования. Таким образом, если требуется применить два преобразования к точке Р, новое по- ложение точки будет вычислено следующим образом: Р' = М2 • Mi • Р = = М Р. (5.26) Точка преобразуется с помощью комплексной матрицы М, а не с использованием сначала преобразования Mi, а потом преобразования М2.
362 Глава 5. Геометрические преобразования СЛОЖНЫЕ ДВУХМЕРНЫЕ ТРАНСЛЯЦИИ Если два последовательных вектора трансляции (tix, tiy) и (t^x, t?y) применяются к двухмерной точке Р, окончательное положение Р' вычисляется следующим образом: Р' = T(t2x, hy) {T(t 1Ж, tiy) Р} = = {T(t2x, t2j/) • T(tix, tly)} • P, (5.27) где P и Pz представляются в однородных координатах трехэлементными векторами- столбцами. Данный результат можно проверить, вычислив матричное произведение двух соответствующих матриц. Кроме того, матрица суммарного преобразования, определенного данной последовательностью трансляций, имеет такой вид: 1 0 t2x О 1 t2y О 0 1 ’1 0 tlx О 1 tly О 0 1 1 0 t\x -|- t2x О 1 + ^2у О 0 1 (5.28) или T(t2x, ^2у) • Т(tlx, tly) = T(tix -г t2x, tly + t2y), (5.29) откуда видно, что две последовательные трансляции являются аддитивными. СЛОЖНЫЕ ДВУХМЕРНЫЕ ПОВОРОТЫ Два последовательных поворота, примененные к Р, дают следующее положение: p' = r(02)-W0-P} = = {R(02) • R(0!)} • P. (5.30) Перемножая две матрицы поворота, можно убедиться, что два последовательных по- ворота являются аддитивными: R(02) • R(0i) = R(0i + (531) так что координаты конечной точки можно вычислить с помощью матрицы сложного поворота: P' = R(0i+02)-P- (532)
5.4. Двухмерные сложные преобразования 363 СЛОЖНОЕ ДВУХМЕРНОЕ МАСШТАБИРОВАНИЕ Свертка матриц двух последовательных операций масштабирования дает следующую сложную матрицу масштабирования: «2х О О О s2y О О 0 1 Six о О О siy О О 0 1 slx ' s2x О о О 0‘ siy * S2y О О 1 (5.33) или S(s2xi *^2у) ‘ — S(si;r • S2хi $ ty ' S2y). (5.34) В этом случае суммарная матрица указывает на то, что последовательные опера- ции масштабирования являются мультипликативными. Следовательно, если дважды утроить размер объекта, в результате объект увеличится в 9 раз. ПРОИЗВОЛЬНЫЙ ДВУХМЕРНЫЙ ПОВОРОТ ВОКРУГ ОСИ Если в графическом пакете имеется только функция поворота вокруг начала коорди- нат, двухмерный поворот вокруг любой другой оси (хг, уг) можно получить, выпол- нив следующую последовательность операций трансляции-поворота-трансляции. 1. Транслировать объект, чтобы положение центра вращения совместилось с нача- лом координат. 2. Повернуть объект вокруг начала координат. 3. Так транслировать объект, чтобы центр вращения вернулся в исходное положение. Данная последовательность преобразований иллюстрируется на рис. 5.9. Матрица суммарного преобразования для данной последовательности действий получается как свертка: '1 0 хг' Г cos# -sin# 0" Г1 0 - -xr~ 0 1 Ут • sin# cos# 0 • 01- -Уг = .001. L о 0 1. [o 0 1 ’cos# -sin# xr(l — cos#) + yrsin#’ = sin в cos# yr(l — cos # ) — xr sin # 1 (5.35) 0 0 1 что можно выразить в следующей форме: Т(хг, уг) • R(#) • Т( жг, yr) = R(xr, уг, 0), (5.36)
364 Глава 5. Геометрические преобразования а) исходное положение объекта и центра вращения б) такая трансляция объекта, чтобы центр вращения совпал с началом координат в) поворот вокруг начала координат г) такая трансляция объекта, чтобы центр вращения вернулся в положение (хг, уг) Рис. 5.9. Последовательность преобразований при повороте объекта вокруг заданной точки с использованием матрицы поворота R(0), представленной в уравнении (5.19) а) исходное положение объекта и фиксированной точки б) такая трансляция объекта, чтобы фиксированная точка (ху, уу) попала в начало координат в) масштабирование объекта относительно начала координат г) такая трансляция объекта, чтобы фиксированная точка вернулась в положение (ху, уу) Рис. 5.10. Последовательность преобразований при масштабировании объекта относительно заданной неподвижной точки с использованием матрицы масштабирования, S(sx,sv), пред- ставленной в уравнении (5.21) где Т(—хг, —уг) = Т-1(хг, уг). Вообще, функцию поворота в графической библио- теке можно структурировать так, чтобы она принимала координаты центра вращения, угол поворота и автоматически генерировала матрицу поворота, представленную в уравнении (5.35). ОБЩЕЕ ДВУХМЕРНОЕ МАСШТАБИРОВАНИЕ ОТНОСИТЕЛЬНО НЕПОДВИЖНОЙ ТОЧКИ На рис. 5.10 иллюстрируется последовательность преобразований, дающая двухмер- ное масштабирование относительно выбранной неподвижной точки (xj, yf) при на- личии функции, которая может масштабировать только относительно начала коорди- нат. Данная последовательность формулируется следующим образом.
5.4. Двухмерные сложные преобразования 365 Рис. 5.11. Масштабные параметры si и s?, характеризующие орто- гональные направления масштабирования, смещенные относительно координатных осей на угол в 1. Транслировать объект так, чтобы неподвижная точка совместилась с началом координат. 2. Масштабировать объект относительно начала координат. 3. Использовать преобразование, обратное к трансляции в п. 1, чтобы вернуть объ- ект на первоначальное место. Свертка матриц трех указанных операций дает искомую матрицу масштабирования: ’1 0 xf~ Sx 0 O' ‘1 0 ~xf’ 0 xf(l - sxy 0 1 yf 0 sy 0 0 1 -yf = 0 sy У/(1 - sy) (5.37) .0 0 1. . 0 0 1. .0 0 1 . 0 0 1 или T(xf,yf)-S(sx,sy)-yf) = S(xf,yf,sx,sy>). (5.38) Данное преобразование автоматически генерируется в системах, предлагающих функ- ции масштабирования, в которые вводятся координаты неподвижной точки. ПРОИЗВОЛЬНЫЕ ДВУХМЕРНЫЕ НАПРАВЛЕНИЯ МАСШТАБИРОВАНИЯ Параметры sx и sy отвечают за масштабирование объекта вдоль направлений х и у. Вообще, размеры объекта можно менять в любых направлениях, повернув объект так, чтобы направления предполагаемого масштабирования совпали с координатны- ми осями. Предположим, что требуется применить масштабные преобразования, определен- ные параметрами si и S2, в направлениях, показанных на рис. 5.11. Чтобы выпол- нить масштабирование, не меняя ориентацию объекта, вначале нужно повернуть тело так, чтобы направления si и совместились с осями х и у соответственно. После этого применяется преобразование масштабирования S(si,S2), а затем выполняется
366 Глава 5. Гэометрические преобразования Рис. 5.12. Квадрат (панель а) превра- щается в параллело- грамм (панель б) с ис- пользованием слож- ной матрицы преоб- разования (5.39), где «1 = 1, «2 = 2 и 0 = 45° обратный поворот, возвращающий точки к исходной ориентации. Матрица общего преобразования (произведение матриц отдельных операций) выглядит так: R-1(0)-S(si,s2)-R(0) = $1 cos2 в + S2 sin2 в (s2 - Si) cos в sin в О (s2 — Si) cos в sin в si sin2 0 + s2 cos2 0 0 (5-39) 0 0 1 В качестве примера данного преобразования масштабирования превратим квадрат в параллелограмм (рис. 5.12), растянув его вдоль диагонали, идущей от (0, 0) к (1, 1). Вначале совместим поворотом диагональ с осью у, используя 0 = 45°, затем удвоим ее длину, используя масштабные коэффициенты si = 1hs2 = 2, и поворотом вернем диагональ в исходное положение. В уравнении (5.39) предполагается, что масштабирование выполняется относи- тельно начала координат. Данную операцию можно усложнить и выполнить свертку матрицы этого преобразования с матрицей трансляции, так что суммарная матрица будет включать параметры, задающие неподвижную точку масштабирования. СВОЙСТВА ПРОИЗВЕДЕНИЯ МАТРИЦ Умножение матриц ассоциативно. Для любых трех матриц Mi, М2 и Мз в произ- ведении Мз • М2 • Mi все равно, какое умножение выполнять первым — Мз и М2 или М2 и Mi: Мз • М2 • Mi = (Мз • М2) • Mi = Мз • (М2 • Mi). (5.40) Следовательно, в зависимости от порядка, в котором заданы преобразования, слож- ную матрицу можно строить, перемножая матрицы либо слева направо (умножение слева), либо справа налево (умножение справа). Некоторые графические пакеты тре- буют, чтобы преобразования задавались в том порядке, в котором их нужно приме- нять. В этом случае вначале нужно активизировать преобразование Mi, затем М2 и
5.4. Двухмерные сложные преобразования 367 б) Рис. 5.13. Обращение порядка выполнения ряда преобразований может повлиять на положение преобразованного объекта. На панели а объект вначале транслируется в положительном направ- лении оси х, затем поворачивается против часовой стрелки на угол 45°. На панели б объект вначале поворачивается на 45° против часовой стрелки, а затем транслируется в положительном направлении оси х Мз. При вызове каждой последующей процедуры преобразования соответствующая матрица присоединяется слева от предыдущего матричного произведения. В то же время, в других графических системах матрицы умножаются справа, так что данная последовательность преобразований будет вызываться в обратном порядке: послед- нее активизированное преобразование (в приведенном примере это Mi) применяется первым, а первое вызванное преобразование (в рассматриваемом случае — Мз) будет применено последним. В то же время, произведение преобразований может не быть коммутативным. Матричное произведение Мг • Mi в общем случае не равно Mi • М2. Это означа- ет, что, если требуется транслировать и повернуть объект, нужно аккуратно указать порядок, в котором вычисляется матрица суммарного преобразования (рис. 5.13). В некоторых частных случаях (например, когда подряд выполняется несколько преоб- разований одного типа) умножение матриц преобразований коммутативно. Напри- мер, два последовательных поворота можно выполнить в любом порядке, при этом конечное положение объекта не изменится. Данное свойство коммутативности так- же справедливо для двух последовательных трансляций или изменений масштаба. Другой коммутирующей парой операций является поворот и пропорциональное мас- штабирование (Sx = Sy). ПРОИЗВОЛЬНЫЕ ДВУХМЕРНЫЕ СЛОЖНЫЕ ПРЕОБРАЗОВАНИЯ И ВЫЧИСЛИТЕЛЬНАЯ ЭФФЕКТИВНОСТЬ Двухмерное преобразование, представляющее любую комбинацию трансляций, по- воротов и операций масштабирования, можно выразить в следующей форме: г “1 X у' 1 Т*8хх Т*$ху tTSx % ГЗух T'Syy tTSy • у 0 0 1 1 (5.41)
368 Глава 5. Геометрические преобразования Четыре элемента rs^ являются мультипликативными членами преобразования, отве- чающими за повороты и масштабирование в преобразовании, и представляют собой комбинации углов поворота и масштабных коэффициентов. Элементы ti'sx и trsy являются трансляционными членами и представляют собой комбинации расстояний трансляции, координат осей вращения и неподвижных точек, углов поворота и пара- метров масштабирования. Например, если объект нужно масштабировать, повернуть вокруг центра масс, имеющего координаты (хс, ус), а затем транслировать, матрица сложного преобразования будет иметь такие компоненты: Т(£д;, • R.(xc, Уо @) ' 8(хс, Усу $ху &у) — sxcosf) —sy sin в xc(l — sxcosf)) + ycsysinf) + tx sx sin в sy cos в уС(1 — sy cos в) — xcsx sin в + ty 0 0 1 (5-42) Хотя матричное уравнение (5.41) требует девяти умножений и шести сложений, явные формулы расчета преобразованных координат имеют такой вид: X — X • rsxx + у • rsxy + trsx, у1 = X rsyx+у rSyy + trSy. (5.43) Таким образом, в действительности преобразование координат требует только четы- рех умножений и четырех сложений. Это максимальное число операций, требуемых для любой последовательности преобразований после свертки отдельных матриц и расчета элементов сложной матрицы. Без свертки отдельные преобразования будут применяться по одному, и объем вычислений значительно возрастет. Следовательно, чтобы эффективно реализовать операции преобразования, нужно сформулировать матрицы преобразований, провести свертку последовательности преобразований и вычислить преобразованные координаты из уравнений (5.43). Отметим, что в систе- мах с параллельной обработкой прямое умножение матриц и расчет сложной матрицы преобразования по уравнению (5.41) может быть одинаково эффективным. Поскольку расчет поворота требует вычисления тригонометрических функций и нескольких умножений для каждой преобразуемой точки, вычислительная эффек- тивность может стать важным моментом при реализации преобразований поворота. В анимации и других приложениях, включающих множество повторяющихся пре- образований и небольшие углы поворотов, для сокращения вычислений в уравне- ниях сложного преобразования можно использовать аппроксимации и итеративные расчеты. Когда угол поворота мал, тригонометрические функции можно заменить приблизительными значениями, рассчитанными по первым членам их разложения в степенной ряд. Для достаточно малых углов (менее 10°) cos в примерно равен 1,0, а значение sin 0 близко к значению в в радианах. Если, например, нужно поворачивать объект вокруг начала координат с небольшим шагом по углу, cos в можно положить
5.4. Двухмерные сложные преобразования 369 равным 1,0 и сократить расчеты на каждом этапе до двух умножений и двух сложений для каждого набора координат. Данные формулы для расчета преобразований имеют такой вид: х' = х — у sin в, у1 = х sin# + у, (5.44) где sin# вычисляется единожды для каждого этапа, если предположить, что угол поворота не меняется. Ошибка, вводимая данным приближением, на каждом шаге уменьшается при уменьшении угла поворота. Однако даже при малых углах поворота суммарная ошибка по большому числу шагов может стать довольно большой. Чтобы контролировать суммарную ошибку, на каждом шаге вычисляется ошибка по х' и у', и, когда суммарная ошибка становится слишком большой, корректируется положе- ние объекта. Некоторые приложения анимации автоматически обновляют положения объекта через фиксированные интервалы, например, каждые 360° или каждые 180°. Сложные преобразования часто включают обратные матрицы. Например, после- довательности преобразований для произвольных направлений масштабирования и определенных отражений и сдвигов (раздел 5.5) требуют обратных поворотов. Как отмечалось выше, представления обратных матриц для базовых геометрических пре- образований можно сгенерировать с помощью простых процедур. Матрица обратной трансляции получается путем изменения знаков расстояний трансляции, а матрица обратного поворота находится транспонированием прямой матрицы (или изменением знаков синусоидальных членов). Понятно, что данные операции гораздо проще, чем прямой расчет обратной матрицы. ДВУХМЕРНЫЕ ЖЕСТКИЕ ПРЕОБРАЗОВАНИЯ Если матрица преобразования включает только параметры трансляции и поворота, она относится к матрицам жестких преобразований. Общий вид двухмерной матри- цы жесткого преобразования таков: Гц trx ух УУ *ГУ 0 0 1 (5.45) где четыре элемента гуд. — это мультипликативные члены поворота, а элементы trx и try — это трансляционные члены. Жесткое изменение координат также иногда назы- вается преобразованием жесткой структуры. Все углы и расстояния между точками при преобразовании не меняются. Кроме того, матрица (5.45) обладает следующим свойством: ее верхняя левая подматрица 2 на 2 является ортогональной. Это означает, что если рассматривать все строки (или все столбцы) подматрицы как векторы, тогда два вектора-строки (гхх, гху) и (гух, гуу) (или два вектора-столбца) формируют орто-
370 Глава 5. Геометрические преобразования тональный набор единичных векторов. Подобный набор векторов также называется ортонормальным набором векторов. Каждый вектор имеет единичную длину: rL + гху = гух + гуу = 1, (5.46) и векторы перпендикулярны (скалярное произведение равно 0): ГххТух 4” ГхуГуу — 0. (5-47) Следовательно, если указанные единичные векторы преобразовываются подматрицей вращения, тогда вектор (гхх, гху) переходит в единичный вектор, параллельный оси х, а вектор (гух, гуу) переходит в единичный вектор, параллельный оси у системы координат: Гхх О’ fXX ’Г гух ГУУ 0 гху — 0 (5.48) 0 0 1. _ 1 _i_ f XX Лгу О' Гуа; 'О' гУх ГУУ 0 ГУУ = 1 (5.49) 0 0 1. _ 1 _ 1, Например, в приведенном ниже жестком преобразовании объект вначале поворачи- вается на угол в вокруг точки (хТ, ут), а затем транслируется. T(tx,ty) -R(xr,yr,9) = cos 9 sin 9 О — sin# ггг(1 — cos 9) + yr sin 9 + tx cos 9 yr(l — cos 9) — xr sin 9 + ty 0 1 (5.50) В этом примере ортогональные единичные векторы в левой верхней подматрице 2 на 2 равны (cos 9, — sin #) и (sin 9, cos #), кроме того, cos 9 — sin 9 0 sin 9 cos 9 0 0 0 1 cos 9 — sin# 1 (5.51) 1 О 1 Подобным образом единичный вектор (sin #, cos #) под действием указанной матрицы преобразования переходит в единичный вектор (0, 1), направленный по оси у. ПОСТРОЕНИЕ ДВУХМЕРНЫХ МАТРИЦ ПОВОРОТА Ортогональность матриц поворота полезна при построении матрицы, когда известна конечная ориентация объекта, а не угол, требуемый, чтобы перевести объект в это
5.4. Двухмерные сложные преобразования 371 Рис. 5.14. Матрицу пово- рота, переводящую объект из положения а в поло- жение б, можно постро- ить по значениям единич- ных векторов и' и v' ори- ентации относительно ис- ходного положения положение. Данную информацию об ориентации можно определить, изучая располо- жение определенных объектов на сцене или опорные положения системы координат. Например, может потребоваться повернуть объект, чтобы совместить его ось сим- метрии с направлением наблюдения (камеры), или расположить объект так, чтобы он находился над другим объектом. На рис. 5.14 показан объект, который выравнивается по единичным векторам направления и' и v\ Предполагая, что исходная ориентация объекта, как показано на рис. 5.14, а, выровнена по координатным осям, искомое преобразование строится путем присвоения элементов и' первой строке матрицы по- ворота и занесения элементов v' во вторую строку. В приложениях моделирования, например, этот метод можно использовать для получения матрицы преобразования в локальной системе координат объекта, если известно, какой должна быть его ори- ентация на общей сцене (внешние координаты). Подобным является преобразование описаний объекта из одной системы координат в другую, и данные методы более подробно рассмотрены в разделах 5.8 и 5.15. ПРИМЕР ПРОГРАММИРОВАНИЯ ДВУХМЕРНОЙ СЛОЖНОЙ МАТРИЦЫ В качестве примера реализации последовательности геометрических преобразований ниже приводится программа OpenGL. Изначально сложная матрица compMatrix активизируется как единичная матрица. В этом примере для построения сложной матрицы преобразования используется порядок свертки слева направо, и процедуры преобразования вызываются в порядке их выполнения. При вызове процедуры каждо- го базового преобразования (масштабирование, поворот и трансляция) матрица этого преобразования определяется и множится слева на сложную матрицу. После того как все преобразования будут заданы, сложное преобразование применяется к тре- угольнику. В результате треугольник вначале масштабируется относительно центра масс (приложение А), затем поворачивается вокруг него и, наконец, транслируется. На рис. 5.15 показаны исходное и конечное положение треугольника, преобразован- ного указанной последовательностью операций. Для вывода исходного и конечного положения треугольника на экран используются процедуры OpenGL.
372 Глава 5. Геометрические преобразования у 200 -- 150-- 100 - 50- Ч--------1------1-------1----- 50 100 150 200 х б) Рис. 5.15. Треугольник (панель а) преобразовывается в положение (панель б) с использованием сложной матрицы, рассчитанной в процедуре transformVerts2D ♦include <GL/glut.h> ♦include <stdlib.h> ♦include <math.h> /* Задается исходный размер окна на экране дисплея. */ GLsizei winWidth = 600, winHeight = 600; /* Задается диапазон изменения внешних координат. */ GLfloat xwcMin = 0.0, xwcMax = 225.0; GLfloat ywcMin = 0.0, ywcMax = 225.0; class wcPt2D { public: GLfloat x, y; }; typedef GLfloat Matrix3x3 [3][3]; Matrix3x3 matComposite; const GLdouble pi = 3.14159; void init (void) { /* Устанавливается цвет окна - белый. */ glClearColor (1.0, 1.0, 1.0, 0.0); } /* Строится единичная матрица 3 на 3. */ void matrix3x3Set!dentity (Matrix3x3 matldent3x3) { GLint row, col; for (row = 0; row < 3; row++) for (col = 0; col < 3; col++) matldent3x3 [row][col] = (row == col); }
5.4. Двухмерные сложные преобразования 373 /* Матрица ml слева множится на m2, результат записывается в m2. */ void matrix3x3PreMultiply (Matrix3x3 ml, Matrix3x3 m2) { GLint row, col; Matrix3x3 matTemp; for (row = 0; row < 3; row++) for (col = 0; col < 3 ; col++) matTemp [row][col] = ml [row][0] * m2 [0][col] + ml [row][l] * m2 [l][col] + ml [row][2] * m2 [2][col]; for (row = 0; row < 3; row++) for (col = 0; col < 3; col++) m2 [row][col] = matTemp [row][col]; ] void translate2D (GLfloat tx, GLfloat ty) { Matrix3x3 matTransl; /* Матрица трансляции инициализируется как единичная. */ matrix3x3Set!dentity (matTransl); matTransl [0] [2] = tx; matTransl [1] [2] = ty; /* Выполняется свертка матрицы matTransl co сложной матрицей. */ matrix3x3PreMultiply (matTransl, matcomposite); ] void rotate2D (wcPt2D pivotPt, GLfloat theta) { Matrix3x3 matRot; /* Матрица поворота инициализируется как единичная. */ matrix3x3Set!dentity (matRot); matRot [0][0] = cos (theta); matRot [0][1] = -sin (theta); matRot [0][2] = pivotPt.x * (1 - cos (theta)) + pivotPt.у * sin (theta); matRot [1][0] = sin (theta); matRot [1] [1] = cos (theta); matRot [1] [2] = pivotPt.у * (1 - cos (theta)) - pivotPt.x * sin (theta); /* Проводится свертка матрицы matRot со сложной матрицей. */ matrix3x3PreMultiply (matRot, matComposite);
374 Глава 5. Гэометрические преобразования void scale2D (GLfloat sx, GLfloat sy, wcPt2D fixedPt) { Matrix3x3 matscale; /* Матрица масштабирования инициализируется как единичная. */ matrix3x3Set!dentity (matScale); matScale [0][0] = sx; matScale [0] [2] = (1 - sx) * fixedPt.x; matScale [1][1] = sy; matScale [1][2] = (1 - sy) * fixedPt.y; /* Проводится свертка матрицы matScale co сложной матрицей. */ matrix3x3PreMultiply (matScale, matComposite); } /* С помощью сложной матрицы вычисляются преобразованные координаты. */ void transformVerts2D (GLint nVerts, wcPt2D * verts) { GLint k; GLfloat temp; for (k = 0; k < nVerts; k++) { temp = matComposite [0][0] * verts [k],x + matComposite [0][1] * verts [k].y + matComposite [0][2]; verts [k],y = matComposite [1] [0] * verts [k].x + matComposite [1][1] * verts [k].y + matComposite [1][2]; verts [k].x = temp; } void triangle (wcPt2D *verts) { GLint k; glBegin (GL_TRIANGLES) ; for (k = 0; k < 3; k++) glVertex2f (verts [k].x, verts [k].y); glEnd ( ); void displayFcn (void) { /* Определяются исходные положения вершин треугольника. */ GLint nVerts = 3; wcPt2D verts [3] = 50.0, 25.0, 150.0, 25.0, 100.0, 100.0 ; /* Вычисляется положение центра масс треугольника. */ wcPt2D centroidPt; GLint k, xSum = 0, ySum = 0; for (k = 0; k < nVerts; k++) { xSum += verts [k]. x; ySum += verts [k].y; }
5.4. Двухмерные сложные преобразования 375 centroidPt.х = GLfloat (xSum) I GLfloat (nVerts); centroidPt.у = GLfloat (ySum) / GLfloat (nVerts); /* Задаются параметры геометрического преобразования. */ wcPt2D pivPt, fixedPt; pivPt = centroidPt; fixedPt = centroidPt; GLfloat tx = 0.0, ty = 100.0; GLfloat sx = 0.5, sy = 0.5; GLdouble theta = pi/2.0; glClear (GL_COLOR_BUFFER_BIT); // Очищается окно на экране. glColor3f (0.0, 0.0, 1.0); /* Исходный цвет заполнения выбирается синим. */ triangle (verts); // Отображается синий треугольник. /* Сложная матрица инициализируется как единичная. */ matrix3x3Set!dentity (matComposite); /* Строится сложная матрица для последовательности преобразований. */ scale2D (sx, sy, fixedPt); /* Первое преобразование: масштабирование. */ rotate2D (pivPt, theta); /* Второе преобразование: поворот. */ translate2D (tx, ty); /* Последнее преобразование: трансляция. */ /* Сложная матрица действует на вершины треугольника. */ transformVerts2D (nVerts, verts); glColor3f (1.0, 0.0, 0.0); /* Задается цвет преобразованного треугольника. */ triangle (verts); /* Отображается красный преобразованный треугольник. */ glFlush ( ) ; } void winReshapeFcn (GLint newWidth, GLint newHeight) { glMatrixMode (GL_PROJECTION) ; glLoadldentity ( ); gluOrtho2D (xwcMin, xwcMax, ywcMin, ywcMax); glClear (GL_COLOR_BUFFER_BIT); }
376 Глава 5. Геометрические преобразования void main (int argc, char ** argv) { glutlnit (&argc, argv); glutlnitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutlnitWindowPosition (50, 50); glutlnitWindowSize (winWidth, winHeight); glutCreateWindow ("Последовательность геометрических преобразований"); init ( ); glutDisplayFunc (displayFcn); glutReshapeFunc (winReshapeFcn); glutMainLoop ( ) ; } 5.5. ДРУГИЕ ДВУХМЕРНЫЕ ПРЕОБРАЗОВАНИЯ Такие базовые преобразования, как трансляция, поворот и масштабирование, явля- ются стандартными компонентами графических библиотек. Некоторые пакеты пред- лагают несколько дополнительных преобразований, полезных в определенных при- ложениях. Двумя такими преобразованиями являются отражение и сдвиг. ОТРАЖЕНИЕ Преобразование, дающее зеркальное изображение объекта, называется отражени- ем. При двухмерном отражении это изображение генерируется относительно оси отражения как поворот объекта на 180° относительно оси отражения. Ось отра- жения можно выбрать на плоскости ху или перпендикулярно плоскости ху. Когда ось отражения является линией на плоскости ху, траектория поворота вокруг этой оси находится в плоскости, перпендикулярной плоскости ху. Когда ось отражения перпендикулярна плоскости ху, траектория поворота лежит в плоскости ху. Ниже приводятся примеры некоторых распространенных отражений. Отражение от линии у = 0 (ось х) выполняется с помощью матрицы преобразо- вания 1 0 0 0-10 0 0 1 (5.52)
5.5. Другие двухмерные преобразования 377 1 У ? / v I \ Исходное ' \ ПОПОЧ/ДПиР г Рис. 5.16. Отражение объекта от оси х Рис. 5.17. Отражение объекта от оси у Данное преобразование сохраняет значения х, но “перебрасывает” значения у то- чек. Получающаяся ориентация объекта после его отражения от оси х показана на рис. 5.16. Чтобы представить ход преобразования, можно вообразить плоский объект, который выносится с плоскости ху, поворачивается на 180° в трехмерном простран- стве вокруг оси х и возвращается на плоскости ху с другой стороны оси х. Отражение от линии х = 0 (ось у) перебрасывает координаты х и сохраняет координаты у. Матрица этого преобразования равна -1 0 О' 0 1 0 0 0 1 (5.53) На рис. 5.17 иллюстрируется изменение положения объекта при отражении отно- сительно линии х = 0. В этом случае эквивалентный поворот — на 180° через трехмерное пространство вокруг оси у.
378 Глава 5. Геометрические преобразования Рис. 5.18. Отражение объекта относительно начала координат. Это преобразование можно выполнить, повернув объект в плоскости ху вокруг начала координат У Рис. 5.19. Отражение объекта относи- тельно оси, перпендикулярной плос- кости ху и проходящей через точку ^reflect Чтобы перевернуть координаты точки х и у, нужно отразить точку от оси, пер- пендикулярной плоскости ху и проходящей через начало координат. Данное преоб- разование иногда называется отражением относительно начала координат, и оно эквивалентно отражению от обеих координатных осей. В матричной форме это отра- жение записывается так: -10 0 0-10 0 0 1 (5.54) Пример отражения относительно начала координат приведен на рис. 5.18. Здесь матрица отражения (5.54) записывается так же, как матрица поворота R(0) при в — 180°. Объект просто поворачивается в плоскости ху на полоборота вокруг начала координат.
5.5. Другие двухмерные преобразования 379 Рис. 5.20. Отражение объекта относительно линии у = х Отражение (5.54) можно обобщить на любой центр отражения в плоскости ху (рис. 5.19). Данное отражение не отличается от поворота на 180° в плоскости ху вокруг центра отражения. Если в качестве оси отражения выбрать диагональ у = х (рис. 5.20), матрица отражения запишется как 0 1 0 1 0 0 0 0 1 (5.55) Данную матрицу можно вывести, произведя свертку матриц поворота и отражения от координатной оси. Одна возможная последовательность преобразований (матриц) приведена на рис. 5.21. Здесь вначале выполняется поворот по часовой стрелке вокруг начала координат на угол 45°, при этом линия у — х переходит в ось х. Затем выполняется отражение относительно оси х. Последней операцией является возврат линии у = х к исходному положению — поворот против часовой стрелки на угол 45°. Тот же результат можно получить и с помощью другой последовательности преобразований — вначале отразить объект относительно оси х, затем повернуть его против часовой стрелки на 90°. Чтобы получить матрицу преобразования, описывающую отражение относитель- но диагонали у = —х, можно выполнить свертку матриц последовательности таких преобразований: 1) поворот по часовой стрелке на 45°; 2) отражение относительно оси у; 3) поворот против часовой стрелки на 45°. В результате получается следующая матрица преобразования: 0-10 -10 0 0 0 1 (5.56) На рис. 5.22 показано исходное и конечное положения объекта, преобразованного с помощью данной матрицы отражения.
380 Глава 5. Гэометрические преобразования Рис. 5.21. Последовательность преобразований, дающих отражение относительно линии у = х: поворот по часовой стрелке на 45° (па- нель а), отражение относительно оси х (панель б) и поворот против часовой стрелки на 45° (панель в) Отражение относительно любой прямой у = тх + Ь в плоскости ху можно вы- полнить с помощью комбинации преобразований трансляции-поворота-отражения. В общем случае вначале прямая транслируется так, чтобы она проходила через нача- ло координат. Затем прямая поворотом совмещается с одной из координатных осей и отражается относительно этой оси. Наконец, с помощью обратного поворота и обратной трансляции линия возвращается в исходное положение. Отражение относительно координатных осей или начала координат можно реали- зовать как масштабирование с отрицательным масштабным коэффициентом. Кроме того, элементам матрицы отражения можно присваивать другие значения, кроме ±1. Параметр отражения, по модулю превышающий 1, смещает зеркальное изображение точки дальше от оси отражения, а параметр, который по модулю меньше 1, прибли- жает изображение точки к оси отражения. Следовательно, отраженный объект также можно увеличить, уменьшить или исказить.
5.5. Другие двухмерные преобразования 381 Рис. 5.22. Отражение относительно линии у = —х СДВИГ Преобразование, которое так искажает форму объекта, что преобразованная форма выглядит, будто объект составлен из внутренних слоев, которые скользят один по дру- гому, часто называется сдвигом (shear). Двумя распространенными преобразованиями сдвига являются сдвиги координат х и сдвиги координат у. Сдвиг в направлении оси х получается с помощью матрицы преобразования: 1 shx О О 1 О О 0 1 а координаты при этом меняются следующим образом: х' = х + shx • у, у' = у. (5.57) (5.58) Параметр сдвига shx может иметь любое действительное значение. Точка (х, у) сдви- гается горизонтально на величину, пропорциональную ее расстоянию по перпенди- куляру до оси х (значение у). Если, например, присвоить параметру shx значение 2, квадрат, показанный на рис. 5.23, превратится в параллелограмм. При отрицательных значениях shx точки смещаются влево. Сдвиги в направлении х относительно других опорных линий можно сгенериро- вать с помощью такой матрицы: 1 shx shx • yTef О 1 О О 0 1 (5.59)
382 Глава 5. Геометрические преобразования у Рис. 5.23. Единичный квад- рат (панель а) преобразу- ется в параллелограмм (па- нель б) с использованием матрицы сдвига по направ- лению х (5.57) при shx — 2 Рис. 5.24. Единичный квадрат (панель а) пре- образуется в сдвину- тый параллелограмм (па- нель б) при таких значе- ниях параметров: shx = О, 5 и yTef = — 1 в матри- це сдвига (5.59) Рис. 5.25. Единичный квадрат (панель а) превращается в сдви- нутый параллелограмм (панель б) при таких значениях параметров: shy — 0, 5 и xref = — 1 в преобразовании сдвига в направлении оси у (5.61) Теперь координаты изменяются следующим образом: х'= х + shx(у - у1е(), у' = у. (5.60) Пример данного преобразования сдвига приведен на рис. 5.24 для параметра сдвига | относительно линии yref = — 1.
5,6. Растровые методы геометрических преобразований 383 Сдвиг в направлении оси у относительно линии х = xref получается с помощью следующей матрицы преобразования: 1 shy О О О 1 shy * О 1 причем координаты преобразуются так: х! = х, у' = у + shy(x - zref). (5.61) (5.62) Данное преобразование смещает точку вертикально на величину, пропорциональную ее расстоянию до опорной линии х = xTef. На рис. 5.25 иллюстрируется преобразо- вание квадрата в параллелограмм при shy = 0,5 и xref = — 1. I Операции сдвига можно выразить как последовательность базовых преобразо- [ ваний. Матрицу сдвига в направлении оси х (5.57), например, можно представить как матрицу сложного преобразования, в котором используется ряд матриц поворо- L та и масштабирования. Данное сложное преобразование масштабирует единичный квадрат, показанный на рис. 5.23, вдоль его диагонали, при этом сохраняя исход- : ные длины и ориентацию сторон параллельно оси х. Смещения положений объектов относительно линий сдвига эквивалентны трансляции. 5.6. РАСТРОВЫЕ МЕТОДЫ ГЕОМЕТРИЧЕСКИХ ПРЕОБРАЗОВАНИЙ [ Характеристики растровых систем предлагают альтернативный метод выполнения 1 определенных двухмерных преобразований. Растровые системы хранят информацию I об изображениях как цветовые схемы в буфере кадров. Следовательно, некоторые [ простые преобразования объектов можно выполнить быстро, манипулируя массивом | значений пикселей. Требуется всего лишь несколько арифметических операций, так f что преобразования пикселей очень эффективны. I Как отмечалось в разделе 3.19, функции работы с прямоугольными массивами I пикселей называются растровыми операциями, а перемещение блока значений пик- I селей именуется пересылкой блока, поблочной передачей или передачей пикселей. I Обычно в графическом пакете имеется несколько процедур для выполнения опреде- | ленных растровых операций. I На рис. 5.26 иллюстрируется двухмерная трансляция, реализованная как блочная I передача области буфера регенерации. Все значения битов в показанной прямоуголь- I ной области копируются как блок в другую часть буфера кадров. Набор значений
384 Гпава 5. Геометрические преобразования Рис. 5.27. Поворот массива значений пикселей. Исходный массив показан на панели а, положение элементов р массива после поворота на 90° про- $ тив часовой стрелки показано на па- ? g нели б, а положение элементов мае- щ ц сива после поворота на 180° приво- дится на панели в а) в исходном положении можно вытереть, присвоив всем пикселям этого блока цвет фона (предполагается, что вытираемый объект не перекрывается с другими объекта- ми сцены). Повороты с шагом 90° легко выполняются путем переупорядочения элементов массива пикселей. Двухмерный объект или узор можно повернуть на 90° против часовой стрелки, обратив значения пикселей в каждой строке массива, а затем по- меняв местами строки и столбцы. Поворот на 180° достигается путем обращения порядка элементов каждой строки с последующим обращением порядка строк. На рис. 5.27 демонстрируются манипуляции с массивом, которые можно использовать для поворота блока пикселей на 90° и 180°.
5.6. Растровые методы геометрических преобразований 385 Искомая область пикселей Искомый массив пикселей прямо- выпол- Рис. 5.28. Растровый поворот угольного блока пикселей можно нить, отобразив искомые области пиксе- лей в повернутый блок Масштабированный массив Рис. 5.29. Отображение ис- комых областей пикселей в масштабированный массив значений пикселей. Преоб- разование выполняется с масштабными коэффициен- тами sx = sy = 0,5 и непо- движной ТОЧКОЙ Чтобы повернуть массив на угол, не кратный 90°, требуется больше работы. Об- щая процедура иллюстрируется на рис. 5.28. Каждая искомая область пикселей отоб- ражается в повернутый массив, и вычисляется величина наложения с повернутыми областями пикселей. Цвет целевого пикселя вычисляется как среднее цветов наклады- вающихся исходных пикселей, учитываемых с весовыми коэффициентами, равными доле накладывающейся площади. Или же для определения цвета получаемых пиксе- лей можно использовать метод аппроксимации (как в схеме защиты от наложения). Методы, подобные описанным выше, можно использовать для масштабирования блока пикселей. Области пикселей в исходном блоке масштабируются с использо- ванием заданных значений sx и sy, а затем отображаются в целевые пиксели. Цвет каждого целевого пикселя определяется согласно области, занимаемой накладываю- щимися масштабированными областями пикселей (рис. 5.29). Чтобы отразить объект, можно использовать растровые преобразования, обра- щающие значения строки или столбца блока пикселей, дополненные трансляцией. Сдвиги получаются путем смещения положений элементов массива по строкам или столбцам.
386 Глава 5. Геометрические преобразования 5.7. РАСТРОВЫЕ ПРЕОБРАЗОВАНИЯ В OpenGL Большинство функций OpenGL для выполнения растровых операций вводилось в разделе 3.19. Трансляцию прямоугольного массива кодов цвета, соотнесенных с пик- селями, из одной области буфера в другую в OpenGL можно выполнить как операцию копирования: glCopyPixels (xmin, ymin, width, height, GL_COLOR); В первых четырех параметрах этой функции указываются положение и размеры блока пикселей. Символьная константа OpenGL GL_COLOR определяет, что копиро- ваться должны коды цвета. Данный массив пикселей будет скопирован в прямоуголь- ную область буфера регенерации, левый нижний угол которой задается текущим растровым положением. Коды цвета, соотнесенные с пикселями, копируются либо как RGBA-значения, либо как индексы таблицы цветов в зависимости от текущих настроек режима цвета. Отметим, что копируемая область (источник) и целевая об- ласть принадлежат диапазону изменения экранных координат. Данная трансляция может выполняться в любом буфере OpenGL, используемом для обновления экрана, или даже между различными буферами. Исходный буфер, указываемый в функции glCopyPixels, выбирается с помощью процедуры glReadBuf fer, а целевой бу- фер — с помощью процедуры glDrawBuf fer. Чтобы повернуть блок кодов цвета на угол, кратный 90°, блок вначале записыва- ется в массив, затем элементы массива переупорядочиваются и помещаются обратно в буфер регенерации. Как показывалось в разделе 3.19, блок RGB-кодов в буфере можно записать в массиве с помощью такой функции glReadPixels (xmin, ymin, width, height, GL_RGB, GL_UNSIGNED_BYTE, colorArray); Если в точках, отвечающих пикселям, хранятся индексы таблицы цветов, вместо константы GL_RGB используется константа GL_COLOR_INDEX. Чтобы повернуть набор кодов цвета, строки и столбцы массива цветов переупорядочиваются так, как описывалось в предыдущем разделе. Затем повернутый массив возвращается в буфер с помощью команды glDrawPixels (width, height, GL_RGB, GL_UNSIGNED_BYTE, colorArray); Левый нижний угол этого массива помещается в текущее растровое положение. Исходный буфер, содержащий первоначальный блок значений пикселей, задает- ся с помощью команды glReadBuffer, а целевой буфер задается командой glDrawBuffer. Двухмерное преобразование масштабирования можно выполнить как растровую операцию в OpenGL, задав масштабные коэффициенты, а затем вызвав процедуру
5.8. Переход между двухмерными системами координат 387 glCopyPixels или glDrawPixels. Масштабные коэффициенты растровой опе- рации задаются следующим образом: glPixelZoom (sx, sy); Здесь параметрам sx и sy могут присваиваться любые ненулевые значения с плавающей запятой. Положительные значения, превышающие 1,0, увеличивают раз- мер элемента в исходном массиве, а положительные значения, которые меньше 1,0, сокращают размер элемента. Если параметры sx или sy (либо оба) имеют отри- цательное значение, получаем отражение с масштабированием элементов массива. Таким образом, если sx = sy = —3,0, исходный массив отражается относительно текущего растрового положения, и каждый цветной элемент массива отображается в блок 3 на 3 целевых пикселей. Если центр целевого пикселя находится внутри прямо- угольной области масштабированного цветного элемента массива, ему присваивается цвет этого элемента массива. Целевым пикселям, центры которых находятся на ле- вой или верхней границе масштабированного элемента массива, также присваивается цвет этого элемента. По умолчанию значение обоих параметров sx и sy равно 1,0. Растровые преобразования можно также объединить с логическими операциями, рассмотренными в разделе 3.19, и получить различные эффекты. С помощью опе- ратора исключающее ИЛИ, например, две последовательные копии массива пиксе- лей в одну и ту же область буфера восстановят значения, изначально находившиеся в данной области. Эту технику можно использовать в приложениях анимации для трансляции объекта по сцене, позволяющей не затрагивать при его движении фон (цвет фоновых пикселей). 5.8. ПЕРЕХОД МЕЖДУ ДВУХМЕРНЫМИ СИСТЕМАМИ КООРДИНАТ Приложения компьютерной графики включают преобразования координат между раз- личными системами на разных этапах обработки сцены. Процедуры наблюдения пе- реводят описание объекта из внешних координат в координаты устройства. В прило- жениях моделирования и проектирования отдельные объекты обычно определяются в собственных локальных декартовых системах координат. Данные описания в ло- кальных координатах затем нужно преобразовать в положения и ориентации системы координат общей сцены. Программа создания схемы офиса, например, имеет отдель- ные координатные описания стульев и столов, а также другой мебели, которую можно размещать на плане этажа, используя множественные копии стульев и столов в раз- личных положениях. Кроме того, сцены иногда определяются в недекартовых системах координат, что позволяет использовать симметрию объекта. Координатные представления в этих
388 Глава 5. Гэометрические преобразования Рис. 5.30. Декартова система х'у', привязанная к точке (хд,уо) и имеющая ориентацию д в декартовой системе координат ху системах нужно с целью обработки перевести во внешнюю декартову систему коор- динат. Приведем несколько примеров недекартовых систем: полярные, сферические, эллиптические и параболические координаты. Связь между декартовыми системами координат и некоторыми распространенными недекартовыми системами приводится в приложении А. Здесь мы рассмотрим только преобразования, возникающие при переходе от одной декартовой системы координат к другой. На рис. 5.30 показана декартова система координат х'у' с началом отсчета (то, уо) и углом ориентации в относительно эталонной декартовой системы координат ху. Чтобы преобразовать описания объектов из координат ху в координаты х'у', задается преобразование, накладывающее оси х'у' на оси ху. Это выполняется в два этапа. 1. Трансляция, переводящая начало координат (то, уо) системы х'у' в начало коор- динат (0, 0) системы ху. 2. Поворот оси х' до совмещения с осью х. Трансляция начала координат выполняется с помощью следующего матричного пре- образования: Г1 0 Т(-гго,-Уо) = -х0 -уо 1 (5.63) 0 0 Ориентация двух систем после трансляции будет выглядеть так, как показано на рис. 5.31. Чтобы совместить оси двух систем, выполняется поворот по часо- вой стрелке cos в sin 0 0 0 1 R(-0) = —sin# 0 cos# 0 (5-64) Выполняя свертку этих двух матриц преобразования, получаем сложную матрицу преобразования описаний объектов из системы ху в систему х'у': ^ху,х'у' = Н(~0) • Т(-Хо, -уо). (5.65)
5.8. Переход между двухмерными системами координат 389 Рис. 5.31. Положение систем отсчета, показанных на рис. 5.30, по- сле трансляции начала координат системы х'у' в начало координат системы ху Рис. 5.32. Декартова система х'у' с началом коор- динат в точке Ро = (я:о,уо) и осью у', параллель- ной вектору V v = м = Альтернативный метод описания ориентации системы координат х'у' — задать вектор V, указывающий положительное направление оси у' (рис. 5.32). Вектор V можно задать как точку в эталонной системе координат ху относительно начала координат этой системы, и это представление можно преобразовать в единичный вектор (5.66) Чтобы получить единичный вектор и, идущий по направлению оси х', можно вектор v повернуть на 90° по часовой стрелке: u= (vy,-vx) — (5.67) В разделе 5.4 отмечалось, что элементы любой матрицы поворота можно выразить как набор ортонормальных векторов. Следовательно, матрица, с помощью которой можно поворотом совместить систему х'у' с системой ху, записывается так: R = Vx о иу 0 0 0 1 (5.68)
390 Глава 5. Гзометрические преобразования Рис. 5.33. Декартова система х'у', определенная двумя точ- ками Ро и Pi в эталонной системе координат ху Например, предположим, что мы выбрали ориентацию оси у' как V = (—1,0). Тогда ось х' идет в положительном направлении оси у, и матрица поворота записывается как ' 0 10 -10 0 0 0 1 Аналогично данную матрицу поворота можно получить из уравнения (5.64), положив угол ориентации равным в = 90°. В интерактивных приложениях иногда удобнее выбрать направление вектора V относительно точки Ро, чем задавать его относительно начала координат системы ху. В таком случае единичные векторы и и v можно ориентировать так, как показано на рис. 5.33. Компоненты вектора v теперь рассчитываются как Р1-Ро |Р1 -РоГ (5.69) а вектор и получается как перпендикуляр к v, формирующий правостороннюю де- картову систему координат. 5.9. ГЕОМЕТРИЧЕСКИЕ ПРЕОБРАЗОВАНИЯ В ТРЕХМЕРНОМ ПРОСТРАНСТВЕ Методы геометрических преобразований в трех измерениях являются развитием двухмерных методов, в которые добавлены соображения, касающиеся координаты z. Трансляция объекта теперь выполняется с помощью заданного трехмерного векто- ра трансляции, который определяет, насколько нужно переместить объект по каждой из трех координат. Аналогично, чтобы масштабировать объект, выбирают масштаб- ный коэффициент для каждой из трех декартовых координат. Однако расширение методов двухмерных поворотов в три измерения не так прямолинейно. При обсуждении двухмерных поворотов на плоскости ху требовалось рассмот- реть только повороты вокруг осей, перпендикулярных плоскости ху. В трехмерном
5.10. Трехмерная трансляция 391 пространстве можно выбирать любую пространственную ориентацию осей поворо- та. Некоторые графические пакеты могут обрабатывать трехмерные повороты как совокупность трех поворотов — по одному на каждую декартову ось. В качестве аль- тернативного решения можно задать общие уравнения поворота, дающие ориентацию оси поворота и требуемого угла поворота. Трехмерное положение, выраженное в однородных координатах, представляется четырехэлементным вектором-столбцом. Следовательно, каждый оператор геомет- рического преобразования — это матрица 4 на 4, которая множится слева на вектор- столбец. Кроме того (как и в двух измерениях), любая последовательность преобразо- ваний представляется одной матрицей, сформированной последовательной сверткой матриц отдельных преобразований. Каждая следующая матрица последовательности преобразований действует слева на предыдущую матрицу преобразования. 5.10. ТРЕХМЕРНАЯ ТРАНСЛЯЦИЯ Точка Р = (х, у, г) трехмерного пространства транслируется в положение Р' = (x',y',z') путем прибавления расстояний трансляции tx, ty и tz к декартовым коор- динатам точки Р: х' = х + tx, У = y + ty, z' = z + tz. (5.70) Трехмерная трансляция точки иллюстрируется на рис. 5.34. Данную операцию трехмерной трансляции можно выразить в матричной форме, как в уравнении (5.17) для двухмерной ситуации. Однако теперь точки Р и Рх пред- ставляются в однородных координатах четырехэлементными векторами-столбцами, и оператор трансляции Т — это матрица 4 на 4: tx 1 х ty . У tz z 1J U (5.71) О»* (tx,ty,tz) Действие на точку вектора трансляции Т =
392 Глава 5. Гзометрические преобразования Рис. 5.35. Смещение положения трехмерного объекта с исполь- зованием вектора трансляции Т ИЛИ Р' = Т Р (5-72) Чтобы транслировать объект в трех измерениях, нужно преобразовать все координа- ты объекта, затем восстановить объект в новом положении. Если объект представлен как набор многоугольных поверхностей, транслируется каждая вершина каждой по- верхности (рис. 5.35), и в конечных положениях строятся многоугольные грани. Приведенный ниже фрагмент программы иллюстрирует построение матрицы трансляции для данного входного набора параметров трансляции. Чтобы постро- ить матрицы, в этих процедурах используются методы, подобные примененным в программе из раздела 5.4. typedef GLfloat Matrix4x4 [4][4]; /* Построение единичной матрицы 4 на 4. */ void matrix4x4Set!dentity (Matrix4x4 matldent4x4) { GLint row, col; for (row = 0; row <4; row++) for (col = 0; col < 4 ; col++) matldent4x4 [row][col] = (row == col); void translate3D (GLfloat tx, GLfloat ty, GLfloat tz) ( Matrix4x4 matTransl3D; /* Матрица трансляции инициализируется как единичная. */ matrix4x4Set!dentity (matTransl3D); matTransl3D [0][3] = tx; matTransl3D [1][3] = ty; matTransl3D [2][3] = tz;
5.11. Трехмерный поворот 393 Матрица, обратная к матрице трехмерной трансляции, получается с использова- нием тех же процедур, что применялись при двухмерной трансляции. Следовательно, меняется знак расстояний трансляции tx, ty и tz. В результате получается трансля- ция в противоположном направлении, причем произведение матрицы трансляции и обратной к ней равно единичной матрице. 5.11. ТРЕХМЕРНЫЙ ПОВОРОТ Объект можно поворачивать вокруг любой оси в пространстве, но легче всего обра- батывать повороты вокруг осей, параллельных декартовым осям. Кроме того, можно использовать комбинации поворотов координатных осей (дополненные соответству- ющей трансляцией) для того, чтобы задать повороты вокруг любой другой линии пространства. Таким образом, вначале рассмотрим операции, фигурирующие при поворотах вокруг координатных осей, а затем обсудим расчеты, необходимые для других осей поворотов. По договоренности положительные углы поворота дают повороты против часо- вой стрелки вокруг координатной оси при условии, что мы смотрим в отрицательном направлении координатной оси (рис. 5.36). Это согласуется с предыдущим обсуж- дением поворотов в двух измерениях на плоскости ху, которые выполняют против часовой стрелки вокруг оси вращения (линия, параллельная оси z). ТРЕХМЕРНЫЕ ПОВОРОТЫ ВОКРУГ КООРДИНАТНОЙ ОСИ Уравнения двухмерного поворота вокруг оси z легко распространяются на три изме- рения: х' = х cos 0 — у sin в, у' = х sin в + у cos в, (5-73) Z1 = Z. Параметр 0 задает угол поворота вокруг оси z, а значения координаты z при этом пре- образовании не меняются. Уравнения трехмерного поворота вокруг оси z следующим образом записываются через однородные координаты: cos 0 — sin 0 О О sin0 COS0 0 0 0 0 1 0 0 0 0 1 (5-74) 1
394 Глава 5. Гэометрические преобразования а) Рис. 5.36. Положительные повороты вокруг коорди- натной оси выполняются против часовой стрелки, если смотреть вдоль положительной половины оси к началу координат что можно записать более компактно: P' = R2(0)-P. (5.75) Поворот объекта вокруг оси z иллюстрируется на рис. 5.37. Уравнения преобразования для поворотов вокруг двух других координатных осей можно получить с помощью цикличной перестановки параметров х, у и z в уравне- ниях (5.73): х —» у —* z —* х. (5.76)
5.11. Трехмерный поворот 395 Рис. 5.37. Поворот объекта вокруг оси z Рис. 5.38. Циклическая перестановка декартовых осей, дающая три набора уравнений поворота вокруг координатных осей Таким образом, чтобы получить уравнения для поворотов вокруг оси х и оси у, х заменяется на у, у на z и z на т, как показано на рис. 5.38. Подставляя перестановки (5.76) в уравнения (5.73), получаем выражения для поворота вокруг оси х: у = у cos 0 — z sin 0; z' = у sin0 + zcos0; (5-77) Поворот объекта вокруг оси х демонстрируется на рис. 5.39. Циклическая перестановка координат в уравнениях (5.77) дает уравнения преоб- разования для поворота вокруг оси у: z = z cos в — х sin 0; х' = z sin в + х cos 0; У1 = У- Пример поворота вокруг оси у приведен на рис. 5.40. (5.78)
396 Глава 5. Гэометрические преобразования у Рис. 5.39. Поворот объекта вокруг оси х Рис. 5.40. Поворот объекта вокруг оси у Матрица, обратная к матрице трехмерного поворота, получается аналогично мат- рице обратного поворота в двух измерениях. Нужно всего лишь заменить угол 0 углом —в. Отрицательные значения углов поворота вращают тело по часовой стрел- ке, и при умножении матрицы поворота на обратную к ней получается единичная матрица. Поскольку при изменении знака угла поворота меняется только значение функции синус, обратную матрицу можно также получить, поменяв строки и столб- цы. Следовательно, матрицу, обратную к любой матрице поворота R, можно найти, вычислив транспонированную матрицу (R'1 = RT). ПРОИЗВОЛЬНЫЕ ТРЕХМЕРНЫЕ ПОВОРОТЫ Матрицу поворота вокруг любой оси, не совпадающей с координатной, можно сфор- мировать, рассмотрев сложное преобразование, включающее трансляцию и повороты вокруг координатных осей. Итак, вначале нужно переместить требуемую ось враще- ния на одну из координатных осей. Затем применяется подходящая матрица поворота для этой координатной оси. Последний шаг — возврат оси вращения в исходное положение.
5.11. Трехмерный поворот 397 а) исходное положение объекта в) поворот объекта на угол в б) трансляция оси вращения в ось х г) трансляция оси вращения в исходное положение Рис. 5.41. Последова- тельность преобразова- ний при повороте объ- екта вокруг оси, парал- лельной оси х В частном случае, когда объект нужно повернуть вокруг оси, параллельной одной из координатных осей, получить искомый поворот позволяют следующие действия. 1. Транслировать объект так, чтобы ось вращения совпала с параллельной коорди- натной осью. 2. Выполнить заданный поворот вокруг этой оси. 3. Транслировать объект так, чтобы ось вращения вернулась в исходное положение. Описанная последовательность действий иллюстрируется на рис. 5.41. С помощью этой последовательности точка Р преобразуется следующим образом: Р' = Т"1 • Rx(0) • Т • Р, (5.79) где сложная матрица преобразования выглядит так: R(0) = Т-1 • Rx(0) • Т. (5.80) Данная сложная матрица имеет ту же форму, что и для двухмерного поворота вокруг оси, параллельной оси z (центр вращения не лежит в начале координат).
398 Глава 5. Гэометрические преобразования Р2» / / Исходное положение Этап 1. Транслировать Р, в начало координат на ось z вокруг оси I Этап 4. Повернуть ось в начальное положение Этап 5. Транслировать ось в исходное положение Рис. 5.42. Пять этапов преобразования, при выполнении которых находится сложная матрица поворота вокруг произвольной оси. Ось вращения проектируется в ось z Когда объект нужно повернуть вокруг оси, не параллельной ни одной из коорди- натных осей, нужны дополнительные преобразования. В этом случае также требуется поворот, выравнивающий ось вращения с выбранной координатной осью, а также воз- врат оси поворота к исходной ориентации. Для данной спецификации оси вращения и угла поворота требуемый поворот можно выполнить за пять шагов. 1. Транслировать объект так, чтобы ось вращения прошла через начало координат. 2. Так повернуть объект, чтобы ось вращения совместилась с одной из координат- ных осей. 3. Выполнить заданный поворот вокруг выбранной координатной оси. 4. Применить обратные повороты для возврата оси вращения к исходной ориентации. 5. Применить обратную трансляцию, чтобы вернуть ось вращения к исходному про- странственному положению. Ось вращения можно совместить с любой из трех координатных осей. Часто удобно использовать ось z, и далее рассматривается последовательность преобразований с использованием матрицы поворота вокруг оси z (рис. 5.42).
5.11. Трехмерный поворот 399 Рис. 5.43. Ось вращения (пунктир), определенная точками Pi и Рг. На- правление единичного вектора оси и определяется заданным направлением поворота Ось вращения можно определить двумя точками, как показано на рис. 5.43, или одной точкой и направляющими углами (или направляющими косинусами), которые ось вращения образует с двумя координатными осями. Предполагается, что ось вра- щения определяется двумя точками, как показано на рисунке, и что направление поворота — против часовой стрелки, если смотреть по оси в направлении от Р2 к Рр Компоненты вектора оси вращения вычисляются следующим образом: У = Р2-Р! = = (%2 ~ Хг,у2 ~ V1,Z2 ~ Zi). Единичный вектор оси вращения и записывается так: и= и =(а'лл (5.81) (5.82) где компоненты а, b и с — направляющие косинусы оси вращения: Если поворот нужно выполнить в противоположном направлении (по часовой стрел- ке, если смотреть от Р2 к Pi), тогда нужно так развернуть вектор оси V и единичный вектор и, чтобы они указывали в направлении от Р2 к Рр Первый шаг при выполнении поворота — задать матрицу трансляции, так перено- сящую ось вращения, чтобы она проходила через начало координат. Поскольку тре- буется, чтобы вращение выполнялось против часовой стрелки, если смотреть вдоль оси от Р2 к Pi (рис. 5.43), в начало координат перемещается точка Рр (Если поворот задан в противоположном направлении, в начало координат помещается точка Р2.) Данная матрица трансляции записывается так: Т = 1 О о о о 1 о о о о 1 о -Х1 -у\ -zi 1 (5.84) и она перемещает ось вращения и объект так, как показано на рис. 5.44.
400 Глава 5. Гэометрические преобразования Рис. 5.44. Трансляция оси вращения в начало координат Рис. 5.45. Единичный вектор и поворачи- вается вокруг оси х и помещается на плос- кость xz (панель а), затем поворачивается вокруг оси у и совмещается с осью z (па- нель б) Рис. 5.46. Поворот вектора и вокруг оси х на плоскость xz выполняется путем вращения вектора и' (проекции и на плоскость j/z) на угол а вокруг оси z Далее нужно сформулировать преобразования, которые совместят ось вращения с осью z. Чтобы выполнить это совмещение в два этапа, можно использовать повороты вокруг координатных осей, также есть множество других способов двухэтапного преобразования. В данном примере мы вначале выполним поворот вокруг оси х, а затем вокруг оси у. Поворот вокруг оси х переводит вектор и на плоскость xz, а поворот вокруг оси у совмещает и с осью z. Указанные повороты иллюстрируются на рис. 5.45 для одной возможной ориентации вектора и. Поскольку в расчете поворота фигурируют функции синус и косинус, то, чтобы получить элементы двух матриц поворота, можно использовать стандартную ориен- тацию вектора (приложение А). Чтобы найти косинус, можно использовать скалярное произведение векторов, а для расчета синуса применяется векторное произведение. Чтобы записать матрицу преобразования, характеризующую поворот вокруг оси х, нужно определить синус и косинус угла поворота, необходимого для перевода век- тора и на плоскость xz. Данный угол поворота образуется проекцией и на плоскость yz и положительным направлением оси z (рис. 5.46). Если представить проекцию и на
5.11. Трехмерный поворот 401 плоскость yz как вектор и' = (0, Ь, с), тогда косинус угла поворота а можно опреде- лить по скалярному произведению uz и единичного вектора и2, идущего вдоль оси z: и' • и2 с соза = Г7П—Г=л’ (5-85) МЫ d где d — модуль вектора и': d = y/b2 + c2. (5.86) Подобным образом синус а можно определить по векторному произведению и'и и2. Координатно-независимая форма векторного произведения выглядит так: и' х и2 = Uz |и'| |и2| sin а, (5.87) а в декартовых координатах векторное произведение выглядит следующим образом: и' х и2 = щ b. (5.88) Приравнивая правые части уравнений (5.87) и (5.88) и учитывая, что |и2| = 1 и |u'| = d, получаем: d sin а = b или b sm а = -. d (5.89) Теперь значения cos а и sin а определены через компоненты вектора и, и можно задавать элементы матрицы поворота этого вектора вокруг оси х с последующим вращением в плоскости xz\ (5.90) Следующий этап формирования последовательности преобразований состоит в опре- делении матрицы, под действием которой единичный вектор, находящийся в плоско- сти xz, поворотом против часовой стрелки вокруг у совмещается с положительным
402 Глава 5. Геометрические преобразования Рис. 5.47. Поворот единичного вектора и" (вектор и после поворо- та на плоскость xz) вокруг оси у. Положительный угол поворота 0 совмещает и" с вектором иг направлением оси z. На рис. 5.47 показана ориентация единичного вектора на плос- кости xz, полученного поворотом вокруг оси х. Данный вектор помечен и", и его х-я компонента равна а, поскольку поворот вокруг оси х не меняет значение компонента х. Компонент z вектора равен d (модуль и'), поскольку вектор и' был повернут во- круг оси z. Наконец, компонент у вектора uz/ — 0, поскольку вектор сейчас лежит в плоскости xz. Как и выше, косинус угла поворота (3 можно определить по скалярному произведению единичных векторов и" и и2. Следовательно, поскольку |и21 = |uzz | = 1. Сравнивая координатно-независимую форму векторного произведения и" х и2 - иу |и"| |и21 sin (3 (5.92) с представлением в декартовых координатах и" х и2 = иу (—а), (5.93) получаем, что sin/3=— a. (5.94) Следовательно, матрица преобразования, характеризующая поворот вектора и" во- круг оси у, равна 'd 0 —a 0 0 1 0 0 Ry(/3) = a 0 d 0 0 0 0 1 (5.95)
5.11. Трехмерный поворот 403 Рис. 5.48. Локальная система координат оси вращения, определяемой еди- ничным вектором и С помощью матриц (5.84), (5.90) и (5.95) мы выровняли ось вращения по положи- тельному направлению оси z. Теперь поворот на заданный угол в можно выполнить вокруг оси z: cos в - sin# 0 O' sin 0 cos# 0 0 R-z(^) — 0 0 1 0 (5.96) 0 0 0 1 Чтобы завершить требуемый поворот вокруг данной оси, нужно вернуть ось враще- ния в исходное положение. Для этого применяются преобразования, обратные к (5.84), (5.90) и (5.95). Матрицу преобразования, описывающую поворот вокруг произволь- ной оси, можно выразить через совокупность семи отдельных преобразований: R(0) = Т-1 • R“x(a) • R;1^) • R2(#) • R,(/3) • Rz(a) • T. (5.97) Более быстрым, но, возможно, менее очевидным методом получения сложной матрицы поворота Ry(/3) • R^a) является использование того факта, что сложная матрица любой последовательности трехмерных поворотов имеет вид >11 Г12 Г13 0 R = r21 ?’22 7’23 0 (5.98) Г .31 r32 7’33 0 .° 0 0 !. Левая верхняя подматрица 3 на 3 данной матрицы ортогональна. Это означает, что строки (или столбцы) этой подматрицы формируют набор ортогональных единич- ных векторов, которые под действием матрицы R поворачиваются на оси х, у и z соответственно: R- Hl' П2 П.З = 1 0 0 , R- r21' Г22 Г23 = 0 1 0 , R 7’3i Г32 ГЗЗ = 0 0 1 . (5.99) 1 1 1 1 1 1
404 Глава 5. Геометрические преобразования Следовательно, можно задать локальную систему координат, одна из осей ко- торой совпадает с осью вращения. Затем единичные векторы трех координатных осей используются для построения столбцов матрицы поворота. Предполагая, что оси поворота не параллельны ни одной из координатных осей, можно сформировать следующий набор единичных локальных векторов (рис. 5.48). u'z = и, , _ и х щ Uy |ихиж|’ < = х и'2. Если выразить элементы единичных локальных векторов оси вращения как 4 = K1X2X3L Ч = КрЧй’Чз)’ и'2 = (ц'21,<2,Чз), (5.100) (5.101) тогда искомая сложная матрица, равная произведению Ry(/3) -R^a), запишется так: <1 и'х2 <3 o’ R = Ч1 / U'y3 / 0 (5.102) UZ1 u'z2 uz3 0 0 0 0 1 Данная матрица переводит единичные векторы и^, и и2 в оси х, у и z соответ- ственно, и это действие совмещает ось вращения с осью z, поскольку и2 = и. ИСПОЛЬЗОВАНИЕ КВАТЕРНИОННЫХ МЕТОДОВ В РАСЧЕТЕ ТРЕХМЕРНЫХ ПОВОРОТОВ Более эффективным методом генерации поворота вокруг выбранной произвольной оси является использование кватернионного представления (приложение А) в пре- образовании поворота. Кватернионы, которые являются расширением двухмерных комплексных чисел, полезны во множестве процедур компьютерной графики, вклю- чая генерацию фрактальных объектов. Они требуют меньше памяти для хранения, чем матрицы 4 на 4, и для последовательностей преобразований процедуры с ис- пользованием кватернионов пишутся легче. Это особенно важно в анимации, где часто нужны изощренные последовательности движения и интерполяция с помощью движения двух данных положений объекта.
5.11. Трехмерный поворот 405 / Рис. 5.49. Параметры в и и единичного кватерниона задают поворот вокруг данной оси Кватернион можно охарактеризовать упорядоченной парой, состоящей из скаляр- ной части и векторной части'. q = (s,v). Кватернион можно также представлять как комплексное число более высокого по- рядка с одной действительной частью (скалярная часть) и тремя комплексными ча- стями (элементы вектора v). Поворот вокруг любой оси, проходящей через начало координат, выполняется с помощью единичного кватерниона с такими скалярной и векторной частями: где и — единичный вектор, направленный по заданной оси вращения, а в — заданный угол поворота вокруг этой оси (рис. 5.49). Любую точку Р, которую нужно повернуть с помощью этого кватерниона, можно представить в кватернионной форме записи: Р = (0,р), где координаты точки образуют векторную часть кватерниона р = (х, у, z). Поворот точки выполняется с помощью следующей кватернионной операции: Р' = gPg-1 (5.104) где g-1 = (s, —v) — обратное к единичному кватерниону q, скалярная и векторная части которого даны в уравнениях (5.103). В результате данного преобразования получается следующий новый кватернион: Р' = (0,Р')- (5.105) Второй член данной упорядоченной пары — это повернутая точка р', которая вычис- йяется с помощью скалярного и векторного произведений: р' = s2p + v(p • v) + 2s(v x p) + v x (v x p). (5.106)
406 Глава 5. Геометрические преобразования Значения параметров s и v получаются из выражений (5.103). Во множестве систем компьютерной графики используются эффективные аппаратные реализации данных векторных расчетов, с помощью которых быстро находятся трехмерные повороты объектов. Преобразование (5.104) эквивалентно повороту вокруг оси, проходящей через начало координат. Это то же, что и последовательность преобразований поворота в уравнении (5.97), совмещающая ось вращения с осью z, поворачивающая объект вокруг оси z, а затем возвращающая ось вращения к исходной ориентации в начале координат. Члены в уравнении (5.106) вычисляются с использованием умножения кватер- нионов, определенного в приложении А. Кроме того, обозначая компоненты век- торной части q как v = (а, Ь, с), получаем элементы сложной матрицы поворота R71(ct) R.“1(/3) • Rz(0) • Rj/(/3) • R.-rf/i) в форме 3 на 3: Мй(0) = '1 -262 -2с2 2ab + 2sc 2ac — 2sb 2ab — 2sc 1 — 2a2 — 2c2 2bc + 2sa 2ac + 2sb 2bc — 2sa 1 - 2a2 - 2b2 (5.107) Расчеты, присутствующие в этой матрице, можно существенно сократить, подставив явные значения параметров а, Ь, с и s, а затем использовав следующие тригономет- рические тождества для упрощения членов: 2 е 2в „ ее cos-----sin - = 1 — 2 sin -=cos0, 2 cos - sin - = sin 0. 2 2 2 2 2 Таким образом, матрицу (5.107) можно переписать как Мд(0) = (5.108) u2(l — cos 0) + cos е ихиу(1 — cos 0) — uz sin 0 uxuz(l — cos 0) + Uy sin0 uyux(l — cos 0) + uz sin 0 u2(l — cos 0) + cos 0 uyuz(l — cos 0) — ux sin0 UzUx(l — COS0) — Uysin0 UzUy(l — cos в) + ux sin0 u2(l — cos 0) + cos 0 где ux, Uy и uz — компоненты единичного вектора оси u. Чтобы завершить последовательность преобразований для поворота вокруг про- извольно расположенной оси вращения, нужно добавить трансляции, переносящие ось вращения в начало координат и возвращающие ее в исходное положение. Таким образом, полное выражение для поворота с помощью кватернионов, соответствующее уравнению (5.97), выглядит так: R(0) = Т-1 • Мд Т. (5.109)
5.11. Трехмерный поворот 407 В качестве примера покажем, как повернуть тело вокруг оси z, положив вектор оси вращения и равным единичному вектору оси z (0, 0, 1). Подставляя компоненты это- го вектора в матрицу (5.108), получим вариант 3 на 3 матрицы поворота вокруг оси z R2(0) в уравнении преобразования (5.74). Аналогично, подставляя значения пара- метров поворота вокруг единичного кватерниона в уравнение преобразования (5.104), получим повернутые координаты из уравнений (5.73). В приведенной ниже программе дан пример процедур, которые можно исполь- зовать для построения трехмерной матрицы поворота. Кватернионное представление в уравнении (5.109) используется для задания матричных элементов произвольного трехмерного поворота. | class wcPt3D { |, public: I GLfloat x, у, z; }; typedef float Matrix4x4 [4] [4]; Matrix4x4 matRot; | /* Построение единичной матрицы 4 на 4. */ | void matrix4x4Set!dentity (Matrix4x4 matldent4x4) { GLint row, col; for (row = 0; row < 4; row++) for (col =0; col < 4 ; col++) matldent4x4 [row][col] = (row == col); /* Умножение слева ml на m2, результат записывается в m2. */ void matrix4x4PreMultiply (Matrix4x4 ml, Matrix4x4 m2) { GLint row, col; Matrix4x4 matTemp; for (row = 0; row < 4; row++) for (col = 0; col < 4 ; col++) matTemp [row][col] = ml [row][0] * m2 [0][col] + ml [row][l] * m2 [1][col] + ml [row][2] * m2 [2][col]+ ml [row][3] * m2 [3][col]; for (row = 0; row < 4; row++) for (col - 0; col < 4; col++) m2 [row][col] = matTemp [row][col]; ) void translate3D (GLfloat tx, GLfloat ty, GLfloat tz) { Matrix4x4 matTransl3D; /* Матрица трансляции инициализируется как единичная. */ matrix4x4Set!dentity (matTransl3D); matTransl3D [0][3] = tx; matTransl3D [1][3] = ty; matTransl3D [2][3] = tz;
408 Глава 5. Геометрические преобразования /* Конкатенация матрицы трансляции с матрицей matRot. */ matrix4x4PreMultiply (matTransl3D, matRot); } void rotate3D (wcPt3D pl, wcPt3D p2, GLfloat radianAngle) { Matrix4x4 matQuaternionRot; GLfloat axisVectLength = sqrt ((p2.x - pl.x) * (P2. x - pl.x) + (p2.y - pl.y) * (p2.y - pl.y) (p2.z - pl.z) * (p2.z - Pl.z)); GLfloat cosA = cos (radianAngle); GLfloat oneC = 1 - cosA; GLfloat sinA = sin (radianAngle); GLfloat ux = (p2.x - pl.x) / axisVectLength; GLfloat uy = (p2.y - pl.y) / axisVectLength; GLfloat uz = (p2.z - pl.z) / axisVectLength; /* Задается матрица трансляции для перемещения pl в начало координат. */ translate3D (-pl.x, -pl.у, -pl.z); /* Матрица matQuaternionRot инициализируется как единичная. */ matrix4x4Set!dentity (matQuaternionRot); matQuaternionRot [0][0] = ux*ux*oneC + cosA; matQuaternionRot [0][1] = ux*uy*oneC - uz*sinA; matQuaternionRot [0][2] = ux*uz*oneC + uy*sinA; matQuaternionRot [1][0] = uy*ux*oneC + uz*sinA; matQuaternionRot [1][1] = uy*uy*oneC + cosA; matQuaternionRot [1][2] = uy*uz*oneC - ux*sinA; matQuaternionRot [2][0] = uz*ux*oneC - uy*sinA; matQuaternionRot [2][1] = uz*uy*oneC + ux*sinA; matQuaternionRot [2][2] = uz*uz*oneC + cosA; /* Матрица matQuaternionRot объединяется с матрицей трансляции. */ matrix4x4PreMultiply (matQuaternionRot, matRot); /* Задается обратная матрица matTransl3D, и выполняется * ее свертка с произведением предыдущих двух матриц. */ translate3D (pl.x, pl.у, pl.z); void displayFcn (void) { /* Ввод параметров поворота. */ /* Матрица matRot инициализируется как единичная: */ matrix4x4Set!dentity (matRot); /* Параметры поворота передаются процедуре rotate3D. */ /* Отображается повернутый объект. */ }
5.12. Трехмерное масштабирование 409 Рис. 5.50. Удвоение размера объекта с помощью преобразова- ния (5.110) также удаляет объект от начала координат 5.12. ТРЕХМЕРНОЕ МАСШТАБИРОВАНИЕ Матричное выражение трехмерного масштабирования точки Р = (х, у, z) относи- тельно начала координат является простым расширением двухмерного масштаби- рования. В матрицу преобразования просто включается параметр, отвечающий за масштабирование по оси z: (5.110) Преобразование трехмерного масштабирования точки можно представить как Р' = S Р, (5.111) где масштабным коэффициентам sx, sy и sz присваиваются любые положительные значения. Явные выражения для преобразования масштабирования относительно на- чала координат записываются так: х'= х sx, y' = y-sy, z' = z-sz. (5.112) Масштабирование объекта с помощью преобразования (5.110) меняет положе- ние объекта относительно начала координат. При коэффициенте масштабирования, превышающем 1, точка удаляется от начала координат в соответствующем направ- лении. Если же коэффициент меньше 1, точка приближается к началу координат по этой координате. Кроме того, если не все коэффициенты масштабирования равны, меняются относительные размеры объекта. Чтобы сохранить исходную форму объ- екта, используется пропорциональное масштабирование-. sx = sy = sz. Результат пропорционального масштабирования объекта со всеми коэффициентами, равными 2, иллюстрируется на рис. 5.50.
410 Глава 5. Геометрические преобразования Рис. 5.51. Последовательность преобразований при масштаби- ровании объекта относительно выбранной фиксированной точ- ки с использованием уравне- ния (5.110) Хотя некоторые графические пакеты предлагают только процедуры, масштаби- рующие объект относительно начала координат, всегда можно построить преоб- разование масштабирования относительно любой выбранной неподвижной точки (х f,yf, Zf), применив для этого следующую последовательность операций. 1. Транслировать неподвижную точку в начало координат. 2. Применить преобразование масштабирования относительно начала координат, используя уравнение (5.110). 3. Транслировать неподвижную точку обратно. Описанная последовательность преобразований демонстрируется на рис. 5.51. Матричное представление масштабирования относительно произвольной неподвиж- ной точки можно выразить как свертку указанных преобразований трансляции- масштабирования-трансляции: yf’Zf} ' S(sx, Sy, .S2) • T(- X f, -yj^-Zf) = sx 0 0 (1 sx^Xf __ 0 Sy 0 (1 sy)yf 0 0 sz (1 - sz)zf 0 0 0 1 (5.113)
5.12. Трехмерное масштабирование 411 Программные процедуры для построения матриц трехмерного масштабиро- вания можно задать либо с использованием последовательности трансляции- масштабирования-трансляции, либо непосредственно включив в процедуру коорди- наты неподвижной точки. В приведенном ниже примере кода демонстрируется пря- мое построение матрицы трехмерного масштабирования относительно выбранной неподвижной точки с использованием формулы (5.113). class wcPt3D private: GLfloat x, у, z; public: /* * Построение по умолчанию: точка инициализируется * как (0.0, 0.0, 0.0). */ wcPt3D ( ) { к = у = z = 0.0; } setCoords (GLfloat xCoord, GLfloat yCoord, GLfloat zCoord) { x = xCoord; у = yCoord; z = zCoord; } GLfloat getx ( ) const { return x; } GLfloat gety ( ) const { return y; } GLfloat getz ( ) const { return z; } }; typedef float Matrix4x4 [4] [4]; void scale3D (GLfloat sx, GLfloat sy, GLfloat sz, wcPt3D fixedPt) { Matrix4x4 matScale3D; /* Матрица масштабирования инициализируется как единичная. */ matrix4x4Set!dentity (matScale3D); matScale3D [0][0] = sx; matScale3D [0][3] = (1 - sx) * fixedPt.getx ( ); matScale3D [1] [1] = sy; matScale3D [1][3] = (1 - sy) * fixedPt.gety ( ); matScale3D [2] [2] = sz; matScale3D [2] [3] = (1 - sz) * fixedPt.getz ( );
412 Глава 5. Геометрические преобразования Обратная матрица трехмерного масштабирования для уравнения (5.110) или урав- нения (5.113) задается заменой каждого масштабного коэффициента (sx, sy и sz) обратной величиной. Однако данное обратное преобразование не определено, ес- ли любому из коэффициентов присвоено значение 0. Обратная матрица генерирует противоположное преобразование масштабирования, и свертка матрицы трехмерного масштабирования с обратной дает единичную матрицу. 5.13. СЛОЖНЫЕ ТРЕХМЕРНЫЕ ПРЕОБРАЗОВАНИЯ Как и при двухмерных преобразованиях, матрица сложного трехмерного преобразо- вания формируется умножением матричных представлений отдельных операций по- следовательности преобразований. Любую последовательность двухмерных преобра- зований, рассмотренных в разделе 5.4 (например, масштабирование в направлении, не совпадающем с координатной осью), можно выполнить в трехмерном пространстве. Последовательность преобразований можно реализовать путем свертки отдель- ных матриц справа налево или слева направо в зависимости от порядка, в котором заданы матричные представления. Разумеется, крайний справа член произведения матриц всегда является первым преобразованием, применяемым к объекту, а крайний слева — последним. Данный порядок нужно использовать, поскольку координаты точек представляются как четырехэлементные векторы-столбцы, на которые слева действует сложная матрица преобразования 4 на 4. В приведенной ниже программе приводятся примеры процедур построения мат- рицы трехмерного сложного преобразования. Чтобы получить одну сложную матрицу (инициализируется как единичная), в заданном порядке объединяются три базовых геометрических преобразования. В данном примере вначале выполняется поворот, затем масштабирование, потом трансляция. Сложная матрица вычисляется слева на- право, так что преобразования вызываются в порядке их применения. Следовательно, новая построенная матрица присоединяется слева к предыдущей, и в результате об- новляется матрица произведения. class wcPt3D { public: GLfloat x, у, z; }; typedef GLfloat Matrix4x4 [4][4]; Matrix4x4 matComposite;
5.13. Сложные трехмерные преобразования 413 /* Строится единичная матрица 4 на 4. */ void matrix4x4Set!dentity (Matrix4x4 matldent4x4) { GLint row, col; for (row =0; row < 4; row++) for (col = 0; col < 4 ; col++) matldent4x4 [row][col] = (row == col); /* Матрица ml умножается слева на матрицу m2, результат * записывается в m2. */ void matrix4x4PreMultiply (Matrix4x4 ml, Matrix4x4 m2) { GLint row, col; Matrix4x4 matTemp; for (row = 0; row < 4; row++) for (col = 0; col < 4 ; col++) matTemp [row][col] = ml [row][0] * m2 [0][col] + ml [row][l] * m2 [1][col] + ml [row][2] * m2 [2][col] + ml [row][3] * m2 [3][col]; for (row = 0; row < 4; row++) for (col = 0; col < 4; col++) m2 [row][col] = matTemp [row][col]; ) /* Процедура генерации матрицы трехмерной трансляции. */ void translate3D (GLfloat tx, GLfloat ty, GLfloat tz) { Matrix4x4 matTransl3D; /* Матрица трансляции инициализируется как единичная. */ matrix4x4Set!dentity (matTransl3D) ; matTransl3D [0][3] = tx; matTransl3D [1][3] = ty; matTransl3D [2][3] = tz; /* Выполняется свертка матрицы matTransl3D co сложной * матрицей. */ matrix4x4PreMultiply (matTransl3D, matcomposite);
414 Глава 5. Гэометрические преобразования /* Процедура генерации матрицы поворота вокруг кватерниона. */ void rotate3D (wcPt3D pl, wcPt3D p2, GLfloat radianAngle) { Matrix4x4 matQuatRot; float axisVectLength = sqrt ((p2.x - pl.x) * (p2.x - pl.x) + (p2.y - pl.y) * (p2.y - pl.y) + (p2.z - pl.z) * (p2.z - pl.z)); float cosA = cosf (radianAngle); float oneC = 1 - cosA; float sinA = sinf (radianAngle); float ux = (p2.x - pl.x) / axisVectLength; float uy = (p2.y - pl.y) / axisVectLength; float uz = (p2.z - pl.z) / axisVectLength; /* Задается матрица трансляции для перемещения pl * в начало координат, и выполняется свертка матрицы * трансляции с matComposite. */ translate3D (-pl.x, -pl.y, -pl.z); /* Матрица matQuatRot инициализируется как единичная. */ matrix4x4Set!dentity (matQuatRot); matQuatRot [0][0] s= ux*ux*oneC + cosA; matQuatRot [0][1] = ux*uy*oneC - uz*sinA; matQuatRot [0][2] = ux*uz*oneC + uy*sinA; matQuatRot [1][0] = uy*ux*oneC + uz*sinA; matQuatRot [1][1] = uy*uy*oneC + cosA; matQuatRot [1][2] = uy*uz*oneC - ux*sinA; matQuatRot [2][0] = uz*ux*oneC - uy*sinA; matQuatRot [2][1] = uz*uy*oneC + ux*sinA; matQuatRot [2][2] = uz*uz*oneC + cosA; /* Выполняется свертка матрицы matQuatRot со сложной матрицей. */ matrix4x4PreMultiply (matQuatRot, matComposite); /* Строится матрица обратной трансляции для точки pl, и * выполняется ее свертка со сложной матрицей. */ translate3D (pl.x, pl.y, pl.z);
5.13. Сложные трехмерные преобразования 415 /* Процедура генерации матрицы трехмерного масштабирования. */ void scale3D (Gfloat sx, GLfloat sy, GLfloat sz, wcPt3D fixedPt) { Matrix4x4 matScale3D; /* Матрица масштабирования инициализируется * как единичная. */ matrix4x4Set!dentity (matScale3D); matScale3D [0][0] = sx; matScale3D [0][3] = (1 - sx) * fixedPt.x; matScale3D [1][1] = sy; matScale3D [1][3] = (1 - sy) * fixedPt.y; matScale3D [2][2] = sz; matScale3D [2][3] = (1 - sz) * fixedPt.z; /* Выполняется свертка матрицы matScale3D co сложной * матрицей. */ matrix4x4PreMultiply (matScale3D, matComposite); ) void displayFcn (void) { /* Вводится описание объекта. */ /* Вводятся параметры трансляции, поворота и масштабирования. */ /* Задаются процедуры трехмерных преобразований наблюдения. */ /* Матрица matComposite инициализируется как единичная: */ matrix4x4Set!dentity (matComposite); /* Вызываются процедуры преобразования в порядке * их применения: */ rotate3D (pl, р2, radianAngle); // Первое преобразование: поворот. scale3D (sx, sy, sz, fixedPt); // Второе преобразование: масштабирование. translate3D (tx, ty, tz); // Последнее преобразование: трансляция. /* Вызываются процедуры отображения преобразованных * объектов. */ )
416 Глава 5. Геометрические преобразования Отражение в плоскости ху Рис. 5.52. Преобразование коорди- нат между правосторонней и левосто- ронней системами можно выполнить с помощью преобразования отраже- ния (5.114) 5.14. ДРУГИЕ ТРЕХМЕРНЫЕ ПРЕОБРАЗОВАНИЯ Помимо трансляции, поворота и масштабирования во многих трехмерных задачах используются другие преобразования, обсуждавшиеся для двухмерных приложений. В число этих дополнительных преобразований входят отражение, сдвиг и преобразо- вания систем координат. ТРЕХМЕРНЫЕ ОТРАЖЕНИЯ Отражение в трехмерном пространстве можно выполнить относительно выбранной оси отражения или относительно плоскости отражения. Вообще, матрицы трехмер- ного отражения задаются подобно двухмерным матрицам. Отражение относительно данной оси эквивалентно повороту на 180° вокруг этой оси. Отражение относитель- но плоскости эквивалентно повороту на 180° в четырехмерном пространстве. Если плоскостью отражения является координатная плоскость (ху, xz, or yz), преобра- зование можно представлять как переход между левосторонней и правосторонней системами координат (приложение А). Пример отражения, переводящего координатные спецификации из правосторон- ней системы координат в левостороннюю (или наоборот), показан на рис. 5.52. Дан- ное преобразование меняет знак координаты z, оставляя значения координат х и у без изменений. Матричное представление данного отражения относительно плоско- сти ху записывается так: ’1 0 0 О' 0 1 0 0 Wzreflect — 0 0 -1 0 0 0 0 1_ (5.Н4) Матрицы преобразований, характеризующие инверсию координат х или у, определя- ются аналогично — как отражения относительно плоскости yz или xz соответствен- но. Отражения в других плоскостях можно получить как комбинации поворотов и отражений в координатных плоскостях.
5.14. Другие трехмерные преобразования 417 у г а) Рис. 5.53. Единичный куб (панель а) сдвигается относительно начала ко- ординат (панель б) под действием матрицы (5.115), где sh2X = sh2!/ = 1 ТРЕХМЕРНЫЕ СДВИГИ Данные преобразования можно использовать для изменения форм объектов, как и в двухмерных приложениях. Они также применимы в трехмерных преобразовани- ях наблюдения для перспективных проекций. Преобразования сдвига вдоль оси х или у такие же, как преобразования, рассмотренные в разделе 5.5. В трехмерных приложениях можно также генерировать сдвиги вдоль оси z. Произвольное преобразование сдвига вдоль оси z относительно опорной точки выражается следующей матрицей преобразования: 1 0 sh.Zj; shzrr ’ ^ref ^Gshear — 0 1 shZ2/ shz?/ * -^ref 0 0 1 0 (5.115) _0 ° 0 1 Параметры сдвига shzj; и shzy могут принимать любые действительные значения. Под действием этой матрицы преобразования значения координат х и у меняются на величину, пропорциональную расстоянию от zref, координата z при этом не меняется. Плоские области, перпендикулярные оси z, смещаются на величину, равную z — zref. Пример действия данной матрицы сдвига на единичный куб показан на рис. 5.53 для параметров sh23; = shZJ/ = 1 и опорной точки zref = 0. Трехмерные матрицы преобразования, характеризующие сдвиг по оси х и оси у, подобны соответствующим двухмерным матрицам. Единственное, что отличается, — нужно добавить строку и столбец для записи параметров сдвига по оси z.
418 Глава 5. Геометрические преобразования 5.15. ПЕРЕХОД МЕЖДУ ТРЕХМЕРНЫМИ СИСТЕМАМИ КООРДИНАТ В разделе 5.8 исследовались операции, требуемые для переноса двухмерного описа- ния сцены из одной системы координат в другую. В пакеты компьютерной графики внедрены преобразования систем координат, позволяющие строить (моделировать) сцены и реализовать процедуры, необходимые в двух- и трехмерных приложени- ях. Как отмечалось в разделе 5.8, матрица преобразования, переводящая двухмерное описание сцены из одной системы координат в другую, строится с помощью опера- ций, совмещающих оси двух систем. Те же процедуры используются и в трехмерных преобразованиях сцен. Как и ранее, мы рассмотрим только декартовы системы координат и будем пред- полагать, что система х'у'z' определена относительно системы xyz. Чтобы перевести координаты xyz в систему х'у'z', вначале задается трансляция, которая переносит начало координат системы х'у'z' в начало координат системы xyz. Затем выполня- ется последовательность поворотов, совмещающих соответствующие координатные оси. Если в двух системах координат используются разные масштабы, может также потребоваться масштабное преобразование, выравнивающее интервалы в двух систе- мах отсчета. На рис. 5.54 показана система координат x'y'z' с началом в точке (zq, уо, <о) и единичными векторами осей относительно системы отсчета xyz. Начало координат системы х'у'z' согласовывается с началом координат системы xyz под действием матрицы трансляции Т(—xq, — у о, — zq). Кроме того, матрицу вращения координат- ных осей можно сформировать по единичным векторам осей: '<i <2 4з o’ R = 4i ) 42 I 4з 0 (5.116) Uz\ uz2 4з 0 0 0 0 1 Эта матрица переносит единичные векторы u'r, и и'г на оси х, у и z соответ- ственно. Полная последовательность преобразования координат выражается сложной матрицей R, • Т. Данная матрица корректно переводит описания координат из одной декартовой системы в другую, даже если одна система является левосторонней, а другая — правосторонней. Рис. 5.54. Система координат x'y'z', опреде- ленная в системе xyz. Описание сцены пере- водится в новую систему координат с исполь- ---- зованием последовательности преобразований, (0> накладывающих систему координат x'y'z' на оси системы xyz
5.16. Аффинные преобразования 419 5.16. АФФИННЫЕ ПРЕОБРАЗОВАНИЯ Преобразование координат вида X — U'r:rX -J- О ГуУ -р a.rzZ 4" У — аухх 4~ аууУ 4” ayzz 4~ by. Z — Uzxx 4” ^zyy 4” U>zzZ 4“ (5.Н7) называется аффинным преобразованием. Каждая из преобразованных координат х', у' и z' является линейной функцией исходных координат х, у и z, а параметры а^- и bk — это константы, определенные типом преобразования. Аффинные преобразова- ния (двухмерные, трехмерные или более высокой размерности) обладают следующим общим свойством: параллельные линии преобразуются в параллельные линии и ко- нечные точки переводятся в конечные точки. Трансляция, поворот, масштабирование, отражение и сдвиг являются аффинны- ми преобразованиями. Любое аффинное преобразование всегда можно выразить как определенную комбинацию названных пяти преобразований. Другой пример аффин- ных преобразований — преобразование координатных представлений сцены из одной системы координат в другую, поскольку такой переход можно описать как комбина- цию трансляции и поворота. Аффинное преобразование включает только трансляцию, поворот и отражение, сохраняет углы и длины, а также параллельные линии. При лю- бом из трех указанных преобразований длины отрезков и угол между любыми двумя линиями сохраняются. 5.17. ФУНКЦИИ ГЕОМЕТРИЧЕСКИХ ПРЕОБРАЗОВАНИЙ В OpenGL Корневая библиотека OpenGL имеет отдельную функцию для каждого из базовых геометрических преобразований, также все преобразования задаются в трех измере- ниях. Чтобы выполнить трансляцию, вызывается процедура трансляции и задаются компоненты трехмерного вектора трансляции. В функции поворота задается угол и ориентация оси вращения, которая пересекает начало координат. Наконец, функция масштабирования используется для задания трех параметров масштабирования по координатам относительно начала координат. В каждом случае процедура преобразо- вания задает матрицу 4 на 4, которая будет действовать на координаты объектов.
420 Глава 5. Геометрические преобразования БАЗОВЫЕ ГЕОМЕТРИЧЕСКИЕ ПРЕОБРАЗОВАНИЯ OpenGL Матрица преобразования 4 на 4 строится с помощью следующей процедуры: glTranslate* (tx, ty, tz); Параметры трансляции tx, ty и tz могут принимать любое действительное значе- ние, и к этой функции может присоединяться единственный код-суффикс: f (float) или d (double). В двухмерных приложениях полагается tz — 0.0. Кроме того, двух- мерная точка представляется четырехэлементным вектором-столбцом, компонент z которого равен 0.0. Матрица трансляции, генерируемая этой функцией, используется для преобразования положений объектов, определенных после вызова этой функции. Например, с помощью приведенной ниже команды определяемая далее точка транс- лируется на 25 единиц в направлении оси х и на —10 единиц в направлении оси у; glTranslatef (25.0, -10.0, 0.0); Аналогично матрица поворота 4 на 4 генерируется командой glRotate* (theta, vx, vy, vz); Здесь компоненты вектора v = (vx, vy, vz) могут иметь любые значения с пла- вающей запятой. Данный вектор определяет ориентацию оси вращения, проходящей через начало координат. Если v не задан как единичный, тогда он автоматически нормируется перед вычислением элементов матрицы поворота. Код-суффикс может иметь значение f или d, а параметру theta присваивается значение угла поворота в градусах, которое процедура переводит в радианы для тригонометрических расчетов. Данная функция генерирует матрицу поворота, которая используется в кватернион- ных расчетах (к точкам, определенным после вызова этой функции, применяется уравнение (5.108)). Например, команда glRotatef (90.0, 0.0, 0.0, 1.0); задает матрицу поворота на 90° вокруг оси z. Матрица масштабирования 4 на 4 относительно начала координат задается сле- дующей процедурой: glScale* (sx, sy, sz); Код-суффикс снова может иметь значение f или d, а в качестве параметров масштабирования используются любые действительные значения. Таким образом, данная функция также подходит для генерации отражений, для этого коэффициентам масштабирования присваиваются отрицательные значения. Например, приведенная ниже команда дает матрицу, которая масштабирует объект с коэффициентом 2 в направлении оси х, масштабирует с коэффициентом 3 в направлении у и отражает объект относительно оси х.
5.17. Функции геометрических преобразований в OpenGL 421 glScalef(2.0, -3.0, 1.0); Нулевое значение любого масштабного коэффициента может вызывать ошиб- ку обработки, поскольку в этом случае нельзя вычислить обратную матрицу. Также отметим, что матрица масштабирования-отражения действует на впоследствии опре- деленные объекты. ОПЕРАЦИИ С МАТРИЦАМИ В OpenGL В разделе 2.9 отмечалось, что процедура glMatrixMode применяется для установки режима проектирования, который определяет матрицу, используемую в преобразо- вании проектирования. Данное преобразование определяет, как сцена будет проек- тироваться на экран. Та же процедура используется, чтобы сформировать матрицу геометрических преобразований. Однако в этом случае матрица называется матри- цей проекции модели (modelview matrix) и используется для хранения и накопле- ния геометрических преобразований. Кроме того, она применяется для объединения геометрических преобразований с преобразованием перехода в систему координат наблюдения. Режим проекции модели задается следующей командой. glMatrixMode (GL_MODELVIEW); Она определяет матрицу проекции модели 4 на 4 как текущую матрицу. Про- цедуры преобразований OpenGL, рассмотренные в предыдущем разделе, использу- ются для модификации матрицы проекции модели, которая затем применяется для преобразования точек сцены. С помощью функции glMatrixMode можно задать еще два режима — текстурный и цветовой. Матрица текстуры используется для отображения текстурных узоров на поверхности, а матрица цветов — для перехода от одной модели цвета к другой. По умолчанию аргументом функции glMatrix- Mode является GL_MODELVIEW. Преобразования наблюдения, проектирования, на- ложения/изменения текстуры и цвета будут обсуждаться в следующих главах. Сейчас мы ограничим наше рассмотрение геометрическими преобразованиями. После того как задан режим, при вызове процедуры преобразования генерируется матрица, которая множится на текущую матрицу выбранного режима. Кроме того, можно присваивать значения элементам текущей матрицы. В библиотеке OpenGL есть две необходимые для этого функции. При вывозе следующей функции в качестве текущей матрицы задается единичная. glLoadldentity ( ); Кроме того, элементам текущей матрицы можно присвоить и другие значения, и для этого используется команда glLoadMatrix* (elementsl6);
422 Глава 5. Геометрические преобразования Параметр elements 16 задает 16-элементный массив с одним индексом, кото- рый содержит значения с плавающей запятой; для указания типа данных использу- ется код-суффикс f или d. Элементы этого массива должны задаваться по столбцам. Следовательно, вначале перечисляются четыре элемента первого столбца, затем че- тыре элемента второго столбца, третьего столбца и наконец четвертого. Чтобы про- иллюстрировать такое упорядочение, инициализируем матрицы проекции модели с помощью следующего кода. glMatrixMode (GL_MODELVIEW); GLfloat elems [16]; GLint k; for (k = 0; k < 16; k++) elems [k] = float (k); glLoadMatrixf (elems); В результате получается такая матрица: ГО.О 4.0 8.0 12.01 1.0 5.0 9.0 13.0 2.0 6.0 10.0 14.0 3.0 7.0 11.0 15.0 Кроме того, можно выполнить свертку заданной матрицы с текущей: glMultMatrix* (otherElementsl6) ; Как и выше, код-суффикс имеет значение f или d, а параметр otherElementsl6 задает 16-элементный массив с одним индексом, в котором по столбцам перечисле- ны элементы некоторой другой матрицы. Текущая матрица умножается справа на матрицу, заданную в процедуре glMultMatrix, и это произведение становится те- кущей матрицей. Следовательно, если предположить, что текущей является матрица проекции модели, которую мы обозначили через М, обновленная матрица проекции модели вычисляется следующим образом: м = м • м', где М' представляет матрицу, элементы которой задаются параметром otherEle- mentsl6 в предыдущем выражении glMultMatrix. Функцию glMultMatrix можно также использовать, чтобы задать последова- тельность преобразований при заданных матрицах отдельных преобразований. На- пример, набор команд
5.17. Функции геометрических преобразований в OpenGL 423 glMatrixMode (GL_MODELVIEW); glLoadldentity ( ); /* Задается текущая матрица - единичная. */ glMultMatrixf (elemsM2); /* На единичную матрицу множится справа матрица М2. */ glMultMatrixf (elemsMl); /* На матрицу М2 справа множится матрица Ml. */ дает следующую матрицу модельной проекции (она же становится текущей). М = М2 • Mi Первое применяемое преобразование в этой последовательности является по- следним, заданным в коде. Следовательно, если последовательность преобразований задается в программе OpenGL, можно считать, что отдельные преобразования загру- жаются в стек, так что последняя заданная операция является первой, которая будет применена. В действительности ситуация несколько иная, но аналогия со стеком помогает запомнить, что в программе OpenGL последовательность преобразований применяется в порядке, противоположном тому, как она задавалась. Важно также помнить, что в OpenGL матрицы записываются по столбцам. Кро- ме того, обращение к элементу матрицы т.^ в OpenGL является обращением к элементу в столбце j и строке к. Это отличается от стандартной математической договоренности, где сначала указывается строка. Впрочем, чтобы избежать ошибок, связанных со строками и столбцами, матрицы в OpenGL можно всегда задавать как 16-элементные массивы с одним индексом и помнить, что элементы матриц перечис- ляются по столбцам. СТЕКИ МАТРИЦ В OpenGL Для каждого из четырех режимов (проекции модели, проекции, текстуры и цвета), вы- бранных с помощью функции glMatrixMode, OpenGL поддерживает стек матриц. Изначально каждый стек содержит только единичную матрицу. В любой момент при обработке сцены верхняя матрица каждого стека называется текущей матрицей этого режима. После того как будут заданы преобразование наблюдения и геометрическое преобразование, сверху стека матриц модельной проекции располагается сложная матрица 4 на 4, объединяющая преобразования наблюдения и различные геометриче- ские преобразования, которые нужно применить к сцене. В некоторых случаях может потребоваться создать несколько последовательностей проекций и преобразований, а затем для каждой из них записать сложную матрицу. Таким образом, OpenGL под- держивает стек матриц модельных проекций глубиной не менее 32, а в некоторых
424 Глава 5. Гэометрические преобразования приложениях в стеке можно записывать более 32 матриц. Число позиций, доступных в стеке модельных проекций в конкретной реализации OpenGL, можно определить с помощью такого запроса. glGetlntegerv (GL_MAX_MODELVIEW_STACK_DEPTH, stacksize); В результате в массив stacksize возвращается искомое целочисленное зна- чение. Другие три режима имеют минимальную глубину стека 2, а максималь- ная глубина конкретной реализации определяется с помощью одной из сле- дующих символьных констант OpenGL: GL_MAX_PROJECTION_STACK_DEPTH, GL_MAX_TEXTURE_STACK_DEPTH или GL_MAX_COLOR_STACK_DEPTH. Кроме того, можно определить, сколько матриц в настоящий момент находится в стеке: glGetlntegerv (GL_MODELVIEW_STACK_DEPTH, numMats); Изначально стек модельных проекций содержит только единичную матрицу, так что если выдать указанный запрос до начала работы со стеком, будет возвращено значение “1”. Подобные символьные константы существуют и для определения числа матриц, находящихся в настоящий момент в трех других стеках. В OpenGL есть две функции работы с матрицами, находящимися в стеке. Исполь- зование данных функций обработки стеков эффективнее работы с матрицами стека по отдельности, особенно если стековые функции реализованы аппаратно. Например, аппаратная реализация может копировать несколько элементов матрицы одновремен- но. Кроме того, в стеке можно хранить единичную матрицу, чтобы инициализацию текущей матрицы можно было выполнить быстрее, чем с помощью повторяющихся вызовов функции glLoadldentity. Итак, используя приведенную ниже функцию, можно копировать текущую мат- рицу в верхнюю позицию активного стека и сохранить ее копию во второй позиции стека. glPushMatrix ( ); В результате получаются одинаковые матрицы в двух верхних позициях стека. Другой стековой функцией является glPopMatrix ( ); Эта команда уничтожает матрицу в верхней позиции стека, и текущей матрицей ста- новится вторая матрица стека. Чтобы “вытолкнуть” (pop) вершину стека, в нем долж- но находиться не менее двух матриц. В противном случае будет получена ошибка.
5.17. Функции геометрических преобразований в OpenGL 425 Рис. 5,55. Трансляция пря- моугольника с использо- ванием функции OpenGL glTranslatef (—200.0, -50.0, 0.0) Рис. 5.56. Поворот прямоугольни- ка вокруг оси z с использовани- ем функции OpenGL glRotatef (90.0, 0.0, 0.0, 1.0) ПРИМЕР ПРОГРАММИРОВАНИЯ ГЕОМЕТРИЧЕСКИХ ПРЕОБРАЗОВАНИЙ В OpenGL В приведенном ниже фрагменте кода к прямоугольнику последовательно применяют- ся базовые геометрические преобразования. Изначально матрица модельной проек- ции — единичная, и на экране изображен синий прямоугольник. Затем текущий цвет меняется на красный, задаются параметры двухмерной трансляции, и отображается красный транслированный прямоугольник (рис. 5.55). Поскольку мы не хотим объ- единять преобразования, далее текущая матрица устанавливается равной единичной. Затем строится матрица поворота, и выполняется ее свертка с текущей матрицей (еди- ничная). Потом мы обращаемся к исходному прямоугольнику, и он поворачивается вокруг оси z и отображается красным цветом (рис. 5.56). Данный процесс повторяется еще раз для получения масштабированного и отраженного красного прямоугольника, показанного на рис. 5.57.
426 Глава 5. Геометрические преобразования 200 Результат отражения с масштабированием 50 Исходное положение Рис. 5.57. Масштабирование и отражение прямоугольни- ка с использованием функции OpenGL glScalef (-0.5, 1.0, 1.0) —I-------1-----н 2150 2100 250 -I---------I---------I--------H 50 100 150 200 glMatrixMode (GL_MODELVIEW); glColor3f (0.0, 0.0, 1.0); glRecti (50, 100, 200, 150); /* Отображается синий прямоугольник. */ glColor3f (1.0, 0.0, 0.0); glTranslatef (-200.0, -50.0, 0.0); /* Задаются параметры трансляции. */ glRecti (50, 100, 200, 150); /* Отображается красный транслированный прямоугольник. */ glLoadldentity ( ); /* Текущая матрица устанавливается равной единичной. */ glRotatef (90.0, 0.0, 0.0, 1.0); /* Задается поворот на 90 градусов вокруг оси z. */ glRecti (50, 100, 200, 150); /* Отображается красный повернутый прямоугольник. */ glLoadldentity ( ); /* Текущая матрица устанавливается равной единичной. */ glScalef (-0.5, 1.0, 1.0); /* Задаются параметры масштабирования-отражения. */ glRecti (50, 100, 200, 150); /* Отображается красный преобразованный прямоугольник. */ Обычно функции стековой обработки эффективнее функций работы с матрицами. Это особенно справедливо для ситуации, когда требуется внести несколько изменений в преобразования наблюдения или геометрические преобразования. В приведенном ниже коде повторяются преобразования прямоугольника из предыдущего примера, только в этот раз вместо функции glLoadldentity используются процедуры ра- боты со стеком.
5.17. Функции геометрических преобразований в OpenGL 427 glMatrixMode (GL_MODELVIEW); glColor3f (0.0, 0.0, 1.0); /* Текущий цвет устанавливается синим. */ glRecti (50, 100, 200, 150); /* Отображается синий прямоугольник. */ glPushMatrix ( ); // Копируется единичная матрица (верхняя). glColor3f (1.0, 0.0, 0.0); /* Текущий цвет устанавливается красным. */ glTranslatef (-200.0, -50.0, 0.0); /* Задаются параметры трансляции. */ glRecti (50, 100, 200, 150); /* Отображается красный транслированный прямоугольник. */ glPopMatrix ( ); // Матрица трансляции выбрасывается. glPushMatrix ( ); // Копируется единичная матрица (верхняя). glRotatef (90.0, 0.0, 0.0, 1.0); /* Задается поворот на 90 градусов вокруг оси z. */ glRecti (50, 100, 200, 150); /* Отображается красный повернутый прямоугольник. */ glPopMatrix ( ); /* Матрица поворота отбрасывается. */ glScalef (-0.5, 1.0, 1.0); /* Задаются параметры масштабирования-отражения. */ •glRecti (50, 100, 200, 150); /* Отображается красный преобразованный прямоугольник. */ В последнем примере программирования геометрических преобразований приве- дем код OpenGL для трехмерного сложного преобразования, рассмотренного в разде- ле 5.13. Поскольку OpenGL умножает матрицы справа по мере их вызова, преобразо- вания нужно активизировать в обратном порядке по сравнению с тем, как они долж- ны применяться. Следовательно, каждое последующее преобразование добавляется справа от сложной матрицы. Поскольку мы еще не изучали трехмерные процедуры наблюдения OpenGL (глава 7), данную программу можно написать с помощью двух- мерных операций наблюдения OpenGL, применяя геометрические преобразования к объектам на плоскости ху.
428 Глава 5. Гэометрические преобразования class wcPt3D { public: GLfloat x, у, z; }; /* Процедура генерации матрицы поворота вокруг * оси, определенной точками pl и р2. */ void rotate3D (wcPt3D pl, wcPt3D p2, GLfloat thetaDegrees) { /* Задаются компоненты вектора оси вращения. */ float vx = (р2.х - pl.x); float vy = (p2.y - pl.y); float vz = (p2.z - pl.z); /* В обратном порядке задается последовательность * трансляции-поворота-трансляции: */ glTranslatef (pl.x, pl.y, pl.z); /* Точка pl возвращается в исходное положение. */ /* Поворот вокруг оси, проходящей через начало * координат: * / glRotatef (thetaDegrees, vx, vy, vz); glTranslatef (-pl.x, -pl.y, -pl.z); /* Точка pl транслируется в начало координат. */ } /* Процедура генерации матрицы преобразования * масштабирования относительно произвольной * неподвижной точки. */ void scale3D (GLfloat sx, GLfloat sy, GLfloat sz, wcPt3D fixedPt) { /* В обратном порядке задается последовательность * трансляции-масштабирования-трансляции: */ /* (3) Неподвижная точка возвращается * в исходное положение: */ glTranslatef (fixedPt.x, fixedPt.у, fixedPt.z); glScalef (sx, sy, sz); / * (2) Масштабирование относительно начала координат. */ /* (1) Неподвижная точка транслируется в начало * координат: */ glTranslatef (-fixedPt.x, -fixedPt.у, -fixedPt.z); } void displayFcn (void) { /* Вводится описание объекта. */ /* Задаются процедуры трехмерного преобразования * наблюдения. */ /* Отображается объект. */
5.18. Резюме 429 glMatrixMode (GL_MODELVIEW); /* Вводятся параметры трансляции tx, ty, tz. */ /* Определяются точки оси вращения pl и р2. */ /* Вводится угол поворота в градусах. */ /* Вводятся параметры масштабирования: sx, sy, sz * и fixedPt. */ /* В обратном порядке вызываются геометрические * преобразования: */ glTranslatef (tx, ty, tz); /* Последнее преобразование: трансляция. */ scale3D (sx, sy, sz, fixedPt); /* Второе преобразование: масштабирование. */ rotate3D (pl, p2, thetaDegrees); /* Первое преобразование: поворот. */ /* Вызываются процедуры отображения преобразованных * объектов. */ ) 5.18. РЕЗЮМЕ Базовыми геометрическими преобразованиями являются трансляция, поворот и мас- штабирование. Трансляция перемещает объект по прямолинейной траектории из од- ного положения в другое. Поворот переводит объект из одного положения в дру- гое вдоль круговой траектории вокруг заданной оси вращения. В двухмерных при- ложениях траектория поворота лежит в плоскости ху вокруг оси, параллельной оси z. Преобразования масштабирования меняют размеры объекта относительно неподвижной точки. Двухмерные преобразования можно выразить матричными операторами 3 на 3, а трехмерные — как матричные операторы 4 на 4, так что последовательность преоб- разований можно свернуть в одну сложную матрицу. Или, в общем случае, и двух-, и трехмерные преобразования можно представлять матрицами 4 на 4. Матричное представление операций геометрических преобразований эффективно, поскольку оно позволяет сократить вычисления, подействовав сложной матрицей на описание объ- екта, и получить его преобразованное положение. Чтобы это сделать, координаты выражаются как векторы-столбцы. Такое представление является стандартным в ма- тематике, поэтому оно принято в большинстве графических пакетов. Вектор-столбец,
430 Глава 5. Геометрические преобразования содержащий три или четыре элемента, представляет однородные координаты. В гео- метрических преобразованиях однородному коэффициенту присвоено значение 1. Сложные преобразования формируются умножением матриц трансляции, поворо- та, масштабирования и других преобразований. Комбинацию трансляции и поворота можно использовать в приложениях анимации, а комбинации поворотов и масштаби- рованная применяются для масштабирования объектов в любом заданном направле- нии. Вообще, умножение матриц не коммутативно. Например, если изменить порядок в последовательности трансляция-поворот, будет получен совершенно иной результат. Последовательность преобразований, включающая только трансляции и повороты, является жестким преобразованием (без деформации), поскольку углы и расстояния при ней не меняются. Кроме того, левая верхняя подматрица жесткого преобразования является ортогональной. Следовательно, матрицы поворота можно сформировать, по- местив в левую верхнюю подматрицу 3 на 3 элементы двух ортогональных единичных векторов. Если угол мал, расчет поворота можно сократить, используя приближенные значения функций синуса и косинуса. Однако следует помнить, что за большое число поворотов ошибка аппроксимации может накопиться и дать существенное значение. В число других геометрических преобразований входят отражения и сдвиги. От- ражения — это преобразования, которые поворачивают объект на 180° вокруг оси отражения. В результате получается зеркальное изображение объекта относительно данной оси. Если ось отражения перпендикулярна плоскости ху, отражение полу- чается как поворот в плоскости ху. Если ось отражения лежит в плоскости ху, отражение получается как поворот в плоскости, перпендикулярной плоскости ху. Преобразования сдвига искажают форму объекта, смещая одну или несколько коор- динат на величину, пропорциональную расстоянию от опорной линии сдвига. Переходы между декартовыми системами координат выполняются с помощью по- следовательности преобразований трансляций-поворотов, согласовывающих две си- стемы. Начало координат и векторы осей одной системы координат задаются относи- тельно исходной системы координат В двухмерных системах один вектор полностью определяет направления координатных осей. Однако в трехмерных системах нуж- но задать два из трех направлений осей. Перенос описаний объектов из исходной системы координат во вторую систему рассчитывается как матричное произведение трансляции, переводящей новое начало координат в старое, и поворота, совмещаю- щего два набора осей. Чтобы найти поворот, выравнивающий две системы координат, можно использовать ортонормированный набор векторов осей новой системы. Геометрические преобразования относятся к классу аффинных. Следовательно, их можно выразить как линейные функции координат. Трансляция, поворот, масшта- бирование, отражение и сдвиг являются аффинными преобразованиями. Они перево- дят параллельные линии в параллельные линии и конечные точки в конечные точки. Геометрические преобразования, не содержащие масштабирования и сдвига, также сохраняют углы и длины.
Литература 431 Для выполнения некоторых простых геометрических преобразований массивом пикселей можно использовать растровые операции. В двухмерных приложениях это позволяет получать быструю трансляцию, отражение и поворот на угол, кратный 90°. Произвольные растровые повороты и изменения масштаба выполняются с незначи- тельным уменьшением обработки. Стандартная библиотека OpenGL содержит три функции трансляции, поворота и масштабирования точек. Каждая функция генерирует матрицу, которая множится слева на матрицу модельной проекции. Таким образом, последовательность функций геометрических преобразований нужно задавать в обратном порядке: последнее вы- званное преобразование является первым, которым воздействуют на точки. Матрицы преобразования воздействуют на позднее определенные объекты. Матрица модель- ной проекции формируется не только с помощью накопления последовательности преобразований, ее можно положить равной единичной или любой другой матрице. Кроме того, можно получить произведения матрицы модельной проекции и любой заданной матрицы. Все матрицы записываются в стеки, и в OpenGL поддерживается четыре стека, соотнесенных с различными типами преобразований, используемыми в графических приложениях. Чтобы определить текущий размер стека или макси- мальную глубину стека, можно использовать функцию запроса OpenGL. Существуют также процедуры обработки стеков: одна для копирования верхней матрицы стека во вторую позицию, другая — для удаления верхней матрицы. В OpenGL также есть несколько операций выполнения растровых преобразований. С помощью этих опера- ций блок пикселей можно транслировать, повернуть, масштабировать или отразить. В табл. 5.1 собраны функции геометрических преобразований и процедуры ра- боты с матрицами OpenGL, рассмотренные в данной главе. Кроме того, в таблице приведено несколько функций, связанных с обсуждавшимися темами. ЛИТЕРАТУРА Дополнительные технологии работы с матрицами и геометрическими преобразованиями рассмот- рены в сборниках [8, 122, 151, 176, 244]. Однородные координаты в компьютерной графике обсуж- даются в статьях [29, 33-35]. Примеры программирования с использованием функций геометрических преобразований OpenGL разбираются в книге [400]. Примеры программирования функций геометрических пре- образований под OpenGL также можно найти на Web-сайте Нейта Робинса (Nate Robins): http://www.cs.utah.edu/narobins/opengl.html. Наконец, полный перечень функций геометрических преобразований OpenGL приводится в справочнике [320].
432 Глава 5. Гэометрические преобразования ТАБЛИЦА 5.1.Резюме по функциям геометрических преобразований в OpenGL Функция Описание glTranslate* Задает параметры трансляции glRotate* Определяет параметры поворота вокруг любой оси, проходящей через нача- ло координат glScale* Задает параметры масштабирования относительно начала координат glMatrixMode Формирует текущую матрицу преобразований геометрического наблюдения, проектирования, наложения текста или изменения цвета glLoadldentity Текущая матрица становится единичной glLoadMatrix* Задает элементы текущей матрицы glMultMatrix* Множит справа текущую матрицу на заданную матрицу glGetlntegerv Возвращает максимальную глубину стека или текущее число матриц в стеке для заданного режима glPushMatrix Копирует верхнюю матрицу стека и записывает копию во второй позиции стека glPopMatrix Удаляет верхнюю матрицу стека и помещает вторую матрицу в верх стека glPixelZoom Задает двухмерные параметры масштабирования для растровых операций УПРАЖНЕНИЯ 5.1. Напишите программу анимации, в которой реализована процедура двухмерного поворота из раздела 5.1. Входной многоугольник нужно последовательно поворачивать на небольшие углы вокруг оси вращения в плоскости ху. Для ускорения расчетов следует использовать аппроксимированные значения синуса и косинуса. Чтобы избежать чрезмерного накопле- ния ошибок округления, в начале каждого нового оборота обновляйте исходные координаты объекта. 5.2. Покажите, что объединение двух поворотов аддитивно, найдя свертку матричных представ- лений R(0i) и R(02) и доказав, что R(01) -R(02) = R(<?1 +<?2). 5.3. Модифицируйте двухмерную матрицу преобразования (5.39) для масштабирования в произ- вольном направлении, чтобы она включала координаты заданной неподвижной точки мас- штабирования (Xf, yf). 5.4. Докажите, что умножение матриц указанных последовательностей преобразования комму- тативно. А. Два последовательных поворота. Б. Две последовательные трансляции. В. Два последовательных масштабирования. 5.5. Докажите, что равномерное масштабирование и поворот образуют коммутирующую пару операций, но в общем случае масштабирование и поворот некоммутативны.
Упражнения 433 5.6. Перемножьте отдельные матрицы масштабирования, поворота и трансляции в уравне- нии (5.42) и проверьте правильность полученных элементов сложной матрицы преобра- зования. 5.7. Модифицируйте программу из раздела 5.4, чтобы параметры преобразования мог вводить пользователь. 5.8. Модифицируйте программу из предыдущего упражнения, чтобы последовательность пре- образований можно было применить к любому многоугольнику, вершины которого введены пользователем. 5.9. Модифицируйте программу из раздела 5.4, чтобы порядок последовательности геометриче- ских преобразований мог вводить пользователь. 5.10. Покажите, что матрица преобразования (5.55) для отражения относительно линии у = х эквивалентна отражению относительно оси х с последующим поворотом против часовой стрелки на 90°. 5.11. Покажите, что матрица преобразования (5.56) для отражения относительно у = —х экви- валентна отражению относительно оси у с последующим поворотом против часовой стрел- ки на 90°. 5.12. Покажите, что два последовательных отражения относительно либо оси х, либо оси у эк- вивалентны простому повороту в плоскости ху вокруг начала координат. 5.13. Определите форму матрицы двухмерного преобразования для отражения относительно лю- бой прямой: у = тх + Ъ. 5.14. Покажите, что два последовательных отражения относительно любой прямой в плоскости ху, проходящей через начало координат, эквивалентны повороту в плоскости ху вокруг начала координат. 5.15. Определите последовательность базовых преобразований, эквивалентных сдвигу по оси х, определяемому матрицей (5.57). 5.16. Определите последовательность базовых преобразований, эквивалентных сдвигу по оси у, определяемому матрицей (5.61). 5.17. Задайте процедуру сдвига, отображающую двухмерные курсивные символы для данного векторного определения шрифта. Следовательно, все символы в этом шрифте определены прямыми отрезками, а курсивные символы формируются преобразованиями сдвига. Опре- делите подходящее значение параметра сдвига, сравнивая курсивный и обычный текст лю- бого доступного шрифта. Определите простой векторный шрифт для ввода в написанную процедуру. 5.18. Выведите следующие уравнения для преобразования точки Р = (ж, у) в одной двухмер- ной декартовой системе координат в точку (х', у') в другой двухмерной декартовой системе координат, повернутой против часовой стрелки на угол 0 относительно первой системы. Уравнения преобразования можно получить, спроектировав точку Р на каждую из четырех осей и проанализировав полученные прямоугольные треугольники. х' = х cos 0 + у sin 0 у'=-х sin0 + у cos0 5.19. Напишите процедуру расчета элементов матрицы преобразования описаний объектов из од- ной двухмерной декартовой системы координат в другую. Вторая система координат опре- деляется началом координат Рц и вектором V, задающим положительное направление оси у' этой системы. 5.20. Напишите процедуры реализации блочного переноса прямоугольной области буфера кадров, используя одну функцию для считывания области в массив и другую — для копирования массива в заданную целевую область.
434 Глава 5. Гэометрические преобразования 5.21. Определите, что получится после двух последовательных блочных переносов в одну и ту же область буфера кадров с использованием различных булевых операций. 5.22. Что получится после двух последовательных блочных переносов в одну и ту же область буфера кадров, если использовать операции двоичной арифметики? 5.23. Реализуйте процедуру блочного переноса в буфере кадров с использованием любой заданной булевой операции или операции замещения (копирования). 5.24. Напишите процедуру реализации последовательных поворотов на 90° для блочного пере- носа в буфере кадров. 5.25. Напишите процедуру реализации поворотов на любой заданный угол в блочном переносе в буфере кадров. 5.26. Напишите процедуру реализации масштабирования как растрового преобразования блока пикселей. 5.27. Покажите, что матрица поворота (5.102) равна сложной матрице Ry(/3) Rr(a). 5.28. Вычислив члены уравнения (5.106), найдите элементы общей матрицы поворота, представ- ленной в уравнении (5.107). 5.29. Докажите, что матрица поворота с использованием кватернионов (5.107) сводится к матрич- ному представлению в уравнении (5.74), если ось вращения является координатной осью z. 5.30. Докажите, что уравнение (5.109) эквивалентно общему преобразованию поворота, представ- ленному в формуле (5.97). 5.31. Используя тригонометрические тождества, найдите из уравнения (5.107) элементы матрицы поворота с использованием кватернионов (5.108). 5.32. Разработайте процедуру анимации трехмерного объекта путем его пошагового вращения во- круг заданной оси. Используйте подходящую аппроксимацию тригонометрических функций для ускорения расчетов и возвращайте объект в исходное положение после каждого полного поворота вокруг оси. 5.33. Выведите матрицу трехмерного преобразования для масштабирования объекта с коэффици- ентом s в направлении, которые задается направляющими косинусами а, (3 и 7. 5.34. Разработайте процедуру отражения трехмерного объекта относительно произвольно выбран- ной плоскости. 5.35. Напишите процедуру сдвига трехмерного объекта относительно любой из трех координат- ных осей, используя введенные параметры сдвига. 5.36. Разработайте процедуру преобразования описания объекта в одной трехмерной системе ко- ординат в другую систему, определенную относительно первой. 5.37. Реализуйте программу из раздела 5.17, чтобы трехмерные процедуры геометрических пре- образований OpenGL применялись к двухмерному треугольнику, показанному на рис. 5.15, а, и в результате получался объект, показанный на рис. 5.15, б. 5.38. Так модифицируйте программу из предыдущего примера, чтобы последовательность пре- образований можно было применить к любому двухмерному многоугольнику, координаты вершин которого вводятся пользователем. 5.39. Так модифицируйте программу из предыдущего упражнения, чтобы порядок последователь- ности геометрических преобразований мог задавать пользователь. 5.40. Так модифицируйте программу из предыдущего упражнения, чтобы параметры геометри- ческого преобразования мог задавать пользователь.
BA 6 Двухмерное наблюдение Сад колибри, нарисованный Джоном Дерри (John Derry) из Time Arts, Inc., с использованием графического планшета и беспроводного самопишущего пера (перепечатано с разрешения Wacom Technology Corporation)
6.1. Двухмерный конвейер наблюдения 6.2. Отсекающее окно 6.3. Нормировка и преобразование поля просмотра 6.4. Функции двухмерного наблюдения OpenGL 6.5. Алгоритмы отсечения 6.6. Двухмерное отсечение точки 6.7. Двухмерное отсечение линии 6.8. Отсечение многоугольной закрашенной области 6.9. Отсечение кривых 6.10. Отсечение текста 6.11. Резюме В главе 2 кратко рассматривались концепции и функции двухмерного на- блюдения. В данной главе мы более подробно опишем процедуры вывода на экран проекции двухмерного изображения. Обычно графический па- кет позволяет пользователю задавать, какую часть определенной картины нужно отобразить на экран, и где эта часть должна располагаться на дисплее. Чтобы определить изображение, можно использовать любую удобную декартову систему ко- ординат, называемую внешней. Для двухмерного изображения проекция выбирается следующим образом: задается область плоскости ху, которая содержит все изображе- ние или его часть. Пользователь может выбирать одну область для вывода на экран, кроме того, может одновременно изображаться несколько областей или анимирован- ные панорамы сцены. Затем части изображения в выбранных областях отображаются в области, заданные в координатах устройства. Если выбрано несколько областей на- блюдения, их можно поместить в различных местах дисплея либо ввести фрагменты в большие участки. Двухмерное преобразование наблюдения из внешних коорди- нат в координаты устройства включает трансляцию, вращение и масштабирование, а также удаление тех частей изображения, которые лежат вне границ выбранной области сцены. 6.1. ДВУХМЕРНЫЙ КОНВЕЙЕР НАБЛЮДЕНИЯ Участок двухмерной сцены, выбранный для отображения на экране, называется от- секающим окном, поскольку все части сцены вне выбранного участка, “отсекаются”, и на экран выводится только часть сцены, которая находится внутри отсекающего окна. Иногда отсекающее окно называется окном наблюдения или смотровым окном.
438 Глава 6. Двухмерное наблюдение Рис. 6.1. Экран с несколькими окнами (пере- печатано с разрешения Sun Microsystems) Одно время в графических системах отсекающее окно называлось просто “окном”, но сейчас в мире компьютеров столько различных окон, что нужно как-то их разли- чать. Например, система управления окнами может для вывода на экран графики и текста создавать несколько областей на дисплее, каждая из которых называется “ок- ном” (рис. 6.1). Поэтому далее мы всегда будем использовать термин отсекающее окно для обозначения участка сцены, который в конечном итоге будет преобразован в пиксельную структуру в ©кне изображения на экране дисплея. Отметим, что гра- фические пакеты также позволяют контролировать расположение окна изображения на экране дисплея с помощью другого “окна”, называемого полем просмотра (view- port). Сначала объекты сцены, находящиеся внутри отсекающего окна, отображаются в поле просмотра, которое затем размещается в окне на экране дисплея. Отсекаю- щее окно задает, что мы хотим увидеть, а поле просмотра указывает, где это будет располагаться на устройстве вывода. Меняя положение поля просмотра, можно представлять объект в различных ме- стах экрана устройства вывода. Для отображения различных участков сцены в раз- личных точках экрана можно использовать несколько полей просмотра. Кроме того, меняя размер полей просмотра, можно менять размер и пропорции отображенных объектов. Для достижения эффектов масштабирования отсекающие окна разного размера последовательно отображаются в поле просмотра фиксированной величи- ны. При уменьшении отсекающего окна мы увеличиваем некоторую часть сцены, и становятся видны детали, незаметные при больших отсекающих окнах. Таким об- разом, больший обзор достигается за счет уменьшения масштаба участка сцены с помощью последовательно увеличивающихся отсекающих окон. Наконец, чтобы по- лучить панорамный эффект, нужно перемещать отсекающее окно фиксированного размера вдоль различных объектов сцены.
6.1. Двухмерный конвейер наблюдения 439 Рис. 6.2. Отсекающее окно и соответствующее поле просмотра, заданные в виде треугольников, ориентированных по координатным осям Построить сцену во внешних координатах, используя преобразования модельных координат Перейти от внешних координат к координатам наблюдения Преобразовать координаты наблюдения в нормированные координаты Отобразить нормированные > координаты в координаты устройства Рис. 6.3. Двухмерный конвейер преобразований наблюдения Обычно отсекающие окна и поля просмотра — это прямоугольники стандартной ориентации, в которых стороны параллельны координатным осям. В некоторых при- ложениях используются иные геометрии окон или полей, например, многоугольные формы и окружности, но обработка таких форм занимает больше времени. Рассмот- рим вначале только прямоугольные поля просмотра и отсекающие окна, подобные показанным на рис. 6.2. Отображение двухмерного описания сцены во внешних координатах в координа- ты устройства называется двухмерным преобразованием точки наблюдения. Иногда это преобразование называется просто преобразованием окна в поле просмотра или преобразованием окна. Однако, в общем случае, наблюдение — это не только преобра- зование из координат отсекающего окна в координаты поля просмотра. По аналогии с трехмерным наблюдением этапы двухмерного наблюдения можно описать так, как показано на рис. 6.3. После построения сцены во внешних координатах можно за- дать отдельную двухмерную систему отсчета в координатах наблюдения (систему наблюдения), в которой определяется отсекающее окно. Впрочем, отсекающее окно часто определяется просто во внешних координатах, так что координаты наблюдения в двухмерных приложениях не отличаются от внешних координат. (Для трехмерной сцены, впрочем, нужна дополнительная система наблюдения, в которой указываются параметры положения и ориентации наблюдателя и направление наблюдения.)
440 Глава 6. Двухмерное наблюдение Чтобы процесс наблюдения был независимым от требований устройств вывода, в графических системах описания объектов переводятся в нормированные координаты, и применяются процедуры отсечения. В одних системах используются нормирован- ные координаты с диапазоном от 0 до 1, в других — с диапазоном от —1 до 1. В зависимости от используемой графической библиотеки поле просмотра определяется либо в нормированных, либо в экранных координатах после нормировки. На по- следнем этапе преобразования наблюдения содержимое поля просмотра передается в точки окна на экране дисплея. Отсечение обычно выполняется в нормированных координатах. Это позволяет сократить вычисления, объединив вначале различные матрицы преобразования. От- метим, что процедуры отсечения имеют первостепенную важность в компьютерной графике. Они используются не только в преобразованиях наблюдения, но и в систе- мах управления окнами, пакетах рисования для стирания участков картины, а также во множестве других приложений. 6.2. ОТСЕКАЮЩЕЕ ОКНО Чтобы добиться определенного эффекта наблюдения в программе-приложении, мож- но разработать свое отсекающее окно с произвольными выбранными формой, разме- ром и ориентацией. Например, в качестве отсекающего окна можно выбрать звездооб- разную форму или эллипс, а также фигуру со сплайновыми границами. В то же время, чтобы обрезать сцену с использованием вогнутого многоугольника или отсекающего окна с нелинейными границами, необходимо больше обработки, чем для обрезки с использованием прямоугольника. Чтобы определить, где объект пересекает окруж- ность, нужно больше вычислений, чем при определении точки пересечения с прямой линией. Отметим также, что в простейшем случае края окна отсечения параллельны координатным осям. Поэтому графические пакеты в общем случае разрешают исполь- зовать только прямоугольное отсекающее окно, стороны которого идут по осям х ну. Если требуется, чтобы отсекающее окно имело какую-то другую форму, мож- но реализовать свои алгоритмы отсечения и преобразования координат. Кроме того, можно просто отредактировать изображение и получить определенную форму кадра изображения, вмещающего сцену. Например, можно обрезать края картины с помо- щью любого удобного шаблона, наложив многоугольники, закрашенные цветом фона. Таким образом можно генерировать любые граничные эффекты или даже создавать на изображении внутренние дыры. Прямоугольные отсекающие окна стандартной ориентации легко определяются координатами двух противоположных углов. Если требуется получить повернутое изображение сцены, можно либо определить прямоугольное отсекающее окно в по- вернутой системе координат изображения, либо (что равнозначно) повернуть сцену во внешних координатах. Некоторые системы позволяют поворачивать двухмерный кадр наблюдения, но обычно отсекающее окно задается во внешних координатах.
6.2. Отсекающее окно 441 у (внешняя СК) <р\.- .л.-' ' Отс екаю шее окно / Ч- 'ч / Ч;- ' _________________ х (внешняя СК) Внешняя система координат Рис. 6.4. Повернутое отсекающее окно, определенное в коорди- натах наблюдения ОТСЕКАЮЩЕЕ ОКНО В КООРДИНАТАХ НАБЛЮДЕНИЯ Обычно при двухмерном преобразовании наблюдения во внешней системе коорди- нат задается система наблюдения. Данная система отсчета позволяет задавать пря- моугольное отсекающее окно с любой выбранной ориентацией и положением, как показано на рис. 6.4. Чтобы получить проекцию сцены во внешних координатах, определяемую отсекающим окном, изображенным на рис. 6.4, нужно просто пере- вести описание сцены в координаты наблюдения. Хотя многие графические пакеты не имеют функций задания отсекающего окна в двухмерной системе координат на- блюдения, при определении отсекаемой области трехмерной сцены данный подход является стандартным. Начало двухмерной системы координат наблюдения выбирается в некоторой точ- ке внешней системы координат Ро = (а?о,уо), а ориентацию можно задать, исполь- зуя внешний вектор V, который определяет направление у view- Вектор V называется двухмерным вектором верха (view up vector). Альтернативный метод задания ориен- тации системы координат наблюдения — указать угол поворота относительно оси х или у во внешней системе координат. По этому углу затем можно получить вектор верха. После установки параметров, определяющих систему координат наблюдения, описание сцены переводится в систему наблюдения с использованием процедуры, описанной в разделе 5.8. Это включает ряд преобразований и эквивалентно наложе- нию системы координат наблюдения на внешнюю систему координат. Первый этап в последовательности преобразований — транслировать начало коор- динат системы наблюдения в начало внешней системы координат. Затем нужно повер- нуть систему наблюдения, чтобы совместить ее со внешней системой координат. Для данного вектора ориентации V можно вычислить компоненты единичных векторов v = (vx,vy) и u = (ux,Uj,) для осей yVjew и zVjew соответственно. Данные еди- ничные векторы используются для формирования первой и второй строки матрицы вращения R, переводящей оси системы наблюдения zviewyview во внешние оси xwyw.
442 Глава 6. Двухмерное наблюдение у (внешняя СК) Рис. 6.5. Система наблюдения совмещается с глобальной систе- мой координат за два этапа: а) для перемещения начала систе- мы наблюдения в начало внеш- ней системы координат применя- ется матрица трансляции Т; б) для последующего совмещения осей двух систем используется матрица вращения R х() х (внешняя СК) %, , % у (внеш- у (СК наблю- няя СК) дения) х (СК наблюдения) х (внешняя СК) Затем положения объектов во внешних координатах переводятся в координаты наблюдения с помощью сложной матрицы двухмерного преобразования Miyc.VC = R Т, (6.1) где Т — матрица трансляции, переносящая начало координат системы наблюдения Ро в начало внешней системы координат, a R — матрица вращения, которая повора- чивает систему наблюдения до ее совмещения с внешней системой координат. Этапы описанного преобразования координат иллюстрируются на рис. 6.5. ОТСЕКАЮЩЕЕ ОКНО ВО ВНЕШНИХ КООРДИНАТАХ Процедура определения стандартного прямоугольного отсекающего окна во внеш- них координатах обычно предлагается в библиотеке графического программирования. Пользователь просто указывает две точки во внешних координатах — противополож- ные углы стандартного прямоугольника. После того как отсекающее окно задано, описание сцены обрабатывается с помощью процедур наблюдения и подается на устройство вывода. Если требуется получить повернутое изображение двухмерной сцены, как об- суждалось в предыдущем разделе, выполняются те же самые действия, но без пре- образований, связанных с системой наблюдения. Таким образом, объект простым вращением (и, возможно, трансляцией) переводится в заданное положение, после че- го задается отсекающее окно — все это во внешних координатах. В качестве примера рассмотрим повернутое изображение треугольника, изображенное на рис. 6.6, а и полученное вращением треугольника в искомое положение и заданием стандартного отсекающего прямоугольника. По аналогии с преобразованием координат, описанным в предыдущем разделе, также можно транслировать треугольник в начало внешней системы координат и определить отсекающее окно вокруг треугольника. В этом слу-
6.3. Нормировка и преобразование поля просмотра 443 Рис. 6.6. Треугольник (панель а) с выбранным началом отсчета и вектором ориентации трансляцией и вращением переводится в отсекающее окно (панель б) чае нужно определить вектор ориентации и выбрать опорную точку, например, центр масс треугольника (приложение А). Затем эта опорная точка транслируется в на- чало внешней системы координат, и вектор ориентации поворачивается вокруг оси J/world с помощью матрицы преобразования (6.1). Имея треугольник искомой ориен- тации, можно использовать стандартное отсекающее окно во внешних координатах и получить изображение повернутого треугольника. Преобразованное положение тре- угольника и выбранного отсекающего окна показано на рис. 6.6, б. 6.3. НОРМИРОВКА И ПРЕОБРАЗОВАНИЕ ПОЛЯ ПРОСМОТРА В некоторых графических пакетах нормировка и преобразование окна в поле про- смотра объединяются в одну операцию. В этом случае координаты поля просмотра часто задаются в диапазоне от 0 до 1, так что поле просмотра располагается в еди- ничном квадрате. После отсечения единичный квадрат, содержащий поле просмотра, отображается на выходном дисплее. В других системах нормировка и отсечение при- меняются перед преобразованием поля просмотра. В таких системах границы поля просмотра задаются в экранных координатах относительно точки на дисплее.
444 Глава 6. Двухмерное наблюдение Рис. 6.7. Точка (a?w, yw) в отсекающем окне (внешние коорди- наты) отображается в точку (xv, yv) (коорди- наты поля просмотра) в единичном квадрате, так что относительные положения двух точек в соответствующих прямоугольниках не меняются 1-- J^max - - - - Нормированное поле просмотра р- -е । I (xv, yv) J I ' XV 1 A*max 1 )------( ОТОБРАЖЕНИЕ ОКНА ОТСЕЧЕНИЯ В НОРМИРОВАННОЕ ПОЛЕ ПРОСМОТРА Чтобы проиллюстрировать общие процедуры нормировки и преобразования поля просмотра, рассмотрим вначале поле просмотра, определенное нормированными ко- ординатами между 0 и 1. Описания объектов переводятся в данное нормированное пространство с помощью преобразования, которое сохраняет то же относительное расположение точек в окне просмотра, которое было в отсекающем окне. Например, если точка находилась в центре отсекающего окна, она отобразится в центр поля просмотра. Данное отображение окна в поле просмотра иллюстрируется на рис. 6.7. Точка (xw, yw) в отсекающем окне переходит в точку (xv, yv) соответствующего поля просмотра. Чтобы преобразовать точку, заданную во внешних координатах, в соответствую- щее положение в поле просмотра, нужно положить следующее: XV — XVmin xw — xwm-m •£^max 2?^min (6.2) yv - 7/Hmin _ yw - ywmm УТ’тах — J/T’min У^тах ~ Решая эти уравнения относительно точки в поле просмотра (xv, yv), получаем XV = sTxw + tx, + (6.3) yv — syyw + ty, где масштабные коэффициенты равны: ЗЛ-’тах — S% — ч ^'тах — ЗЖ'тт д) УТ’тах — У,;тт Sy — ? ywmax ~ ywm'm
6.3. Нормировка и преобразование поля просмотра 445 а коэффициенты трансляции — 2?WminXUmax 2-Штах 2-Wmjn ywmax.yvmin У^ттУ^тах ywmax ~ У-пип (6.5) Поскольку мы просто отображаем точки с внешними координатами в поле просмотра, которое расположено возле начала внешней системы координат, уравнения (6.3) мож- но также вывести, используя любую последовательность преобразований, переводя- щих прямоугольник отсекающего окна в прямоугольник поля просмотра. Например, можно получить преобразование внешних координат в координаты поля просмотра, используя следующую последовательность действий. 1. Масштабировать отсекающее окно до размера поля просмотра, используя фикси- рованную точку (xwmin, ywmin). 2. Транслировать (iwmin, ywmin) в (xwmin, 2/umin). Преобразование масштабирования на этапе 1 можно представить двухмерной матрицей S = Sx о о О sy О 2-Шт]П(1 У^тт (1 $у) , 1 (6-6) где sx и sy — те же, что и в уравнениях (6.4). Матричное представление трансля- ции левого нижнего угла отсекающего окна в левый нижний угол поля просмотра выглядит так: '1 0 ^min т = 0 1 0 0 1 (6.7) Матричное представление суммарного преобразования в нормированное поле про- смотра имеет такой вид МОкно, норм. п. пр. — Т • S — Sx о о О tx" sy ty О 1 (6.8) что дает такой же результат, что и уравнения (6.3). Любую другую опорную точку от- секающего окна, например, правый верхний угол или центр окна, можно использовать в операциях масштабирования (трансляции). Кроме того, можно вначале транслиро- вать точку в отсекающем окне в соответствующую точку поля просмотра, а затем масштабировать ее положение относительно положения поля просмотра.
446 Глава 6. Двухмерное наблюдение >wmax T^min Отсекающее окно г--------------------1 I I | (w, yw) । I____________________I Нормированный ___ квадрат Л'тах l^min —I— ™max Поле просмотра экрана _! (XV, yv) 1----------------1- > XV min Лггпах —I— ™min Рис. 6.8. Точка (xw, yw) в отсекающем окне переходит в точку с нормированными координатами (^norm, г/norm), а затем — в точку с экранными координатами (xv, yv) в поле просмотра. Перед преобразованием в координаты поля просмотра объекты отсекаются единичным квадратом Преобразование окна в поле просмотра сохраняет относительное расположение описаний объектов. Объект внутри отсекающего окна переводится в соответствую- щую точку внутри поля просмотра. Аналогично объект, внешний по отношению к отсекающему окну, будет внешним относительно поля просмотра. С другой стороны, относительные пропорции объектов сохраняются, только если равны характеристические отношения поля просмотра и отсекающего окна. Другими словами, пропорции сохраняются, если масштабные коэффициенты sx и sy одина- ковы. В противном случае внешние объекты будут растягиваться или сжиматься в направлении х или у (или обоих) при отображении на устройстве вывода. Процедуры отсечения можно применить, используя либо границы отсекающего окна, либо границы поля просмотра. После отсечения нормированные координаты переводятся в координаты устройства. Кроме того, единичный квадрат может отоб- ражаться на устройство вывода с использованием таких же процедур, что и при преобразовании окна в поле просмотра, причем область внутри единичного квадрата переводится в полную область экрана устройства вывода. ОТОБРАЖЕНИЕ ОТСЕКАЮЩЕГО ОКНА В НОРМИРОВАННЫЙ КВАДРАТ Существует и другой подход к двухмерному наблюдению: вначале отсекающее ок- но преобразуется в нормированный квадрат, проводится отсечение в нормированных координатах, а затем описание сцены переводится в поле просмотра, заданное в экранных координатах. Данное преобразование иллюстрируется на рис. 6.8, где нор- мированные координаты меняются в диапазоне от —1 до 1. Алгоритм отсечения в данной последовательности преобразований теперь стандартизован, поэтому объекты вне границ х = ±1 и у = ±1 обнаруживаются и удаляются из описания сцены. На конечном этапе преобразования наблюдения объекты в поле просмотра размещаются в окне на экране дисплея. Содержимое отсекающего окна переносится в единичный квадрат с использова- нием таких же процедур, что и при преобразовании окна в поле просмотра. Чтобы получить матрицу нормировки, нужно в уравнение (6.8) подставить —1 вместо
6.3. Нормировка и преобразование поля просмотра 447 и J/i’min и +1 вместо хитах и yvmax. Затем вычисляются значения tx, ty, sx и sy, и получаем Г 2 0 Я^тах “Ь ^’min ^^max Мокно, норм, квадрат — 0 2 ywmax "Ь y^min ywmax ~~ ywmin yWmax ~ ywmia 0 0 1 (6-9) Таким образом, после применения алгоритмов отсечения нормированный квадрат со стороной 2 переходит в заданное поле просмотра. На этот раз матрица преобразования получается из уравнения (6.8) подстановкой —1 вместо xwmjn и ywmin и +1 вместо З-^тах и ywmax.'- Мокно, норм, квадрат ^^тах a^min n ^!max H- #^min 2 2 yvmax yVmin yVmax УТ’тт 2 2 0 0 1 (6.10) Последний этап процесса наблюдения — разместить область поля просмотра в окне на экране дисплея. Обычно левый нижний угол поля просмотра располагается в точке, заданной относительно левого нижнего угла окна на экране. На рис. 6.9 демонстри- руется размещение поля просмотра в окне на экране дисплея. Рис. 6.9. Поле просмотра начинается в точ- ке с координатами (ж3, у3) окна на экране дисплея
448 Глава 6. Двухмерное наблюдение Как и ранее, для сохранения исходных пропорций объектов характеристические отношения поля просмотра и отсекающего окна выбираются равными. В противном случае объекты будут растягиваться или сжиматься в направлении х или у. Кроме того, характеристическое отношение окна на экране дисплея может влиять на про- порции объектов. Если поле просмотра отображается на все окно на экране дисплея, и размер окна на экране дисплея меняется, объекты могут искажаться, если соответ- ствующим образом не изменить характеристическое отношение поля просмотра. ИЗОБРАЖЕНИЕ СТРОК СИМВОЛОВ Существует два способа обработки строк символов, когда они “проходят по кон- вейеру наблюдения” к полю просмотра. Простейший метод сохраняет постоянный размер символов. Этот метод можно реализовать с растровыми символами. В то же время, наравне с другими примитивами можно преобразовывать и эскизные шриф- ты; достаточно преобразовать определенные положения отрезков в формах эскизных символов. Затем при обработке других примитивов сцены применяются алгоритмы определения точечных изображений преобразованных символов. РАСЩЕПЛЕНИЕ ЭКРАНА И НЕСКОЛЬКО УСТРОЙСТВ ВЫВОДА Выбирая на сцене различные отсекающие окна и соответствующие поля просмотра, можно одновременно отображать несколько объектов, несколько частей изображения или различные проекции одной сцены. Кроме того, эти проекции можно располагать в различных частях одного окна на экране дисплея или в нескольких окнах на экране. В конструкторских приложениях, например, можно отображать каркасную проекцию объекта в одном поле просмотра, при этом выводя на экран в другом поле просмот- ра полностью визуализированное изображение объекта. Кроме того, в третьем поле просмотра можно указывать другую информацию или выводить меню. Помимо этого, можно параллельно использовать несколько устройств вывода в одной системе, и для каждого устройства можно задать пару “отсекающее окно- поле просмотра”. Отображение на выбранное устройство вывода иногда называется преобразованием рабочей станции. В этом случае поля просмотра могут задаваться в координатах конкретного устройства вывода, или же каждое поле просмотра можно задавать в единичном квадрате, который затем отображается на выбранное устройство вывода. В некоторых графических системах для этого применяется пара функций рабочей станции. Одна функция используется для задания отсекающего окна для выбранного устройства вывода, определяемого числом рабочей станции, а другая — для задания поля просмотра, соответствующего этому устройству.
6.4. Функции двухмерного наблюдения OpenGL 449 6.4. ФУНКЦИИ ДВУХМЕРНОГО НАБЛЮДЕНИЯ OpenGL В действительности стандартная библиотека OpenGL не имеет функций, специаль- но предназначенных для двухмерного наблюдения, поскольку данный пакет разра- ботан преимущественно для трехмерных приложений. Однако основная библиотека OpenGL содержит функцию поля просмотра, а существующие процедуры трехмерно- го наблюдения можно использовать на двухмерной сцене. Кроме того, OpenGL Utility (GLU) содержит двухмерную функцию для задания отсекающего окна, a GLUT — функции, предназначенные для обработки окон на экране дисплея. Следовательно, данные двухмерные процедуры и функцию OpenGL поля просмотра можно исполь- зовать во всех необходимых операциях наблюдения. РЕЖИМ ПРОЕКТИРОВАНИЯ OpenGL Прежде чем выбирать отсекающее окно и поле просмотра в OpenGL, нужно устано- вить подходящий режим построения матрицы преобразования из внешних координат в экранные. С помощью OpenGL нельзя задать отдельную двухмерную систему на- блюдения, как показано на рис. 6.4, и как часть проективного преобразования нужно указать параметры отсекающего окна. Следовательно, вначале нужно выбрать режим проектирования. Для этого используется та же функция, которая применялась для установки режима проекции модели для геометрических преобразований. Затем к проекционной матрице применяются следующие команды, определяющие отсекаю- щее окно и поле просмотра. glMatrixMode (GL_PROJECTION); Указанная команда присваивает проекционной матрице статус текущей (изначально текущей является единичная матрица). Впрочем, если предполагается отменить дан- ную команду, например, чтобы получить другую проекцию сцены, инициализацию можно также проводить с помощью команды glLoadldentity ( ); Это гарантирует, что при каждом переходе в режим проектирования матрица становится единичной, так что новые параметры наблюдения не будут объединяться с предыдущими. ФУНКЦИЯ ОТСЕКАЮЩЕГО ОКНА GLU Чтобы определить двухмерное отсекающее окно, можно использовать функцию OpenGL Utility: gluOrtho2D (xwmin, xwmax, ywmin, ywmax);
450 Глава 6. Двухмерное наблюдение Координаты границ отсекающего окна указываются как числа с двойной точно- стью. Данная функция задает ортогональную проекцию для отображения сцены на экран. Для трехмерной сцены это означает, что объекты будут проектироваться вдоль параллельных линий, которые перпендикулярны двухмерному экрану ху. Однако в двухмерных приложениях объекты уже определены на плоскости ху. Следовательно, ортогональная проекция не влияет на нашу двухмерную сцену иным образом, кроме преобразования точек объекта в нормированные координаты. Тем не менее ортого- нальную проекцию нужно задать, поскольку наша двухмерная сцена обрабатывается по полному трехмерному конвейеру наблюдения OpenGL. Фактически отсекающее окно можно задать с использованием трехмерной версии функции gluOrtho2D из корневой библиотеки OpenGL (раздел 7.10). В процедурах отсечения OpenGL используются нормированные координаты в диапазоне от —1 до 1. Функция gluOrtho2D задает трехмерную версию матрицы преобразования (6.9) для отображения объектов в отсекающем окне в нормирован- ные координаты. Объекты вне нормированного квадрата (и вне отсекающего окна) удаляются с отображаемой сцены. Если в программе-приложении не задать отсекающее окно, будут использоваться координаты по умолчанию (xwmin, ywmin) = (-1,0;-1,0) и (xwmax, ywmax) = (1,0; 1,0). Следовательно, по умолчанию отсекающее окно — это нормированный квадрат с центром в начале координат и стороной 2. ФУНКЦИЯ ПОЛЯ ПРОСМОТРА OpenGL Параметры поля просмотра задаются с помощью следующей функции OpenGL. glViewport (xvmin, yvmin, vpWidth, vpHeight); Все значения параметров даются в целочисленных экранных координатах отно- сительно окна на экране дисплея. Параметры xvmin и yvmin задают положение левого нижнего угла поля просмотра относительного левого нижнего угла окна на экране дисплея. Ширина и высота пикселя поля просмотра задаются параметрами vpWidth и vpHeight. Если в программе не вызывать функцию glViewport, по умолчанию размер и положение поля просмотра будут такими же, как у окна на экране дисплея. После применения процедур отсечения, точки в нормированном квадрате перево- дятся в прямоугольник поля просмотра с использованием матрицы (6.10). Требуемые в данной матрице координаты правого верхнего угла поля просмотра вычисляются через ширину и высоту поля просмотра: ж«тах = OTmin + vpWidth, yvmax = yz>min + vpHeight. (6.11) Для окончательного преобразования в буфер регенерации в заданные положения за- гружаются цвета пикселей примитивов поля просмотра.
6.4. Функции двухмерного наблюдения OpenGL 451 В OpenGL можно создавать несколько полей просмотра (раздел 6.3). Парамет- ры текущего активного поля просмотра можно узнать, используя такую функцию запроса. glGetlntegerv (GL_VIEWPORT, vpArray); Здесь vpArray — четырехэлементный массив с одним индексом. Данная функция Get возвращает параметры текущего поля просмотра в vpArray в порядке xvmin, yvmin, vpWidth и vpHeight. В интерактивных приложениях, например, данную функцию можно использовать для получения параметров поля просмотра, которое содержит курсор экрана. СОЗДАНИЕ ОКНА НА ЭКРАНЕ ДИСПЛЕЯ GLUT В разделе 2.9 кратко представлялись некоторые функции библиотеки GLUT. Посколь- ку эта библиотека сопрягается с любой системой управления окнами, процедуры GLUT используются для создания окон на экране дисплея и работы с ними, кроме того, приводимые примеры программ будут независимы от конкретной машины. Что- бы получить доступ к этим процедурам, вначале нужно инициализировать GLUT с помощью следующей функции. glutlnit (&argc, argv); Параметры этой функции инициализации те же, что и у процедуры main, и glutlnit можно использовать для обработки аргументов командной строки. В GLUT есть три функции для определения окна на экране дисплея и выбора его размерности и положения: glutlnitWindowPosition (xTopLeft, yTopLeft); glutlnitWindowSize (dwWidth, dwHeight); glutCreateWindow ("Title of Display Window"); Первая из этих функций дает целое число — положение в экранных коорди- натах левого верхнего угла окна на экране дисплея относительно левого нижнего угла экрана. Если какая-то из координат отрицательна, точка окна на экране дисплея определяется системой управления окнами. С помощью второй функции выбирается ширина и высота окна на экране дисплея в пикселях (положительное целое число). Если данные функции задания размера и положения не используются, по умолчанию размер равен 300 на 300, а положение — (—1, —1), и окно на экране дисплея раз- мещает система управления окнами. В любом случае размер и положение окна на экране, заданное с помощью процедур GLUT, можно проигнорировать в зависимости от состояния или других требований, активных в данное время в системе управления окнами. Следовательно, система окон может выбирать место и устанавливать размер окна по-разному. Третья из приведенных функций создает окно на экране дисплея с
452 Глава 6. Двухмерное наблюдение заданным размером и положением и присваивает название, хотя использование за- головка также зависит от системы окон. В момент обработки данной команды окно определяется, но не выводится на экран, пока не будут завершены все операции настройки GLUT. УСТАНОВКА РЕЖИМА И ЦВЕТА ОКНА (GLUT) С помощью приведенной ниже функции GLUT выбираются различные параметры окна на экране дисплея. glutlnitDisplayMode (mode); Данная функция используется для выбора цветового режима (RGB или индексация) и различных комбинаций буферов. Выбранные параметры объединяются логической операцией ИЛИ. Режим по умолчанию — простая буферизация (один буфер) и цвето- вой режим RGB (или RGBA), и этот режим можно задать следующим объявлением: glutlnitDisplayMode (GLUT_SINGLE | GLUT_RGB); Спецификация цветового режима GLUT_RGB эквивалентна GLUT_RGBA. Цвет фона для окна на экране дисплея выбирается в режиме RGB с помощью процедуры OpenGL glClearColor (red, green, blue, alpha); В режиме цветового индекса цвет окна на экране дисплея задается командой glClearlndex (index); Здесь параметру index присваивается значение, соответствующее положению в таблице цветов. ИДЕНТИФИКАТОР GLUT ОКНА ИЗОБРАЖЕНИЯ При необходимости в приложении можно создать несколько окон на экране дис- плея, каждому из которых присваивается положительный целый идентификатор ок- на изображения, начиная со значения 1 для первого созданного окна. В момент ини- циации окна изображения его идентификатор можно записать с помощью выражения windowID = glutCreateWindow ("A Display Window"); После того как целый идентификатор окна изображения записан в имени перемен- ной windowID, это число можно использовать для изменения параметров дисплея или удаления окна с дисплея.
6.4. Функции двухмерного наблюдения OpenGL 453 УДАЛЕНИЕ ОКНА GLUT С ЭКРАНА ДИСПЛЕЯ Библиотека GLUT также включает функцию для удаления созданного окна с экрана. Если известен идентификатор окна, оно может удаляться с помощью такой команды. glutDestroyWindow (windowID); ТЕКУЩЕЕ ОКНО НА ЭКРАНЕ GLUT Если задана операция с окном на экране, она применяется к текущему окну, которым является либо последнее созданное окно на экране, либо окно, выбранное с помощью следующей команды. glutSetWindow (windowID); Кроме того, в любой момент можно запросить систему и определить, какое окно является текущим: currentWindowID = glutGetWindow ( ); Значение 0 возвращается этой функцией, если не существует окон на экране или если текущее окно на экране было удалено. ЗАМЕЩЕНИЕ И ИЗМЕНЕНИЕ РАЗМЕРА ОКНА НА ЭКРАНЕ (GLUT) Изменить положение текущего окна на экране можно с помощью команды glutPositionWindow (xNewTopLeft, yNewTopLeft); Здесь координаты задают новое положение левого верхнего угла окна изобра- жения относительно левого верхнего угла экрана. Подобным образом следующая функция обновляет размер текущего окна на экране. glutReshapeWindow (dwNewWidth, dwNewHeight); Наконец, с помощью следующей команды можно расширить текущее окно на весь экран. glutFullScreen ( ); Точный размер окна на экране после выполнения данной процедуры зависит от системы управления окнами. Кроме того, последующий вызов функции glutPo- sitionWindow или glutReshapeWindow аннулирует запрос на расширение до полноэкранного размера.
454 Глава 6. Двухмерное наблюдение При любом изменении размера окна может поменяться его характеристическое отношение, и объекты будут искажены по сравнению с первоначальными формами. Как отмечалось в разделе 3.24, изменение размеров окна на экране можно компенси- ровать с помощью следующего выражения. glutReshapeFunc (winReshapeFcn); Данная процедура GLUT активизируется при изменении размера окна на экране, и новая ширина и высота передаются аргументу этой процедуры — в данном приме- ре это функция winReshapeFcn. Следовательно, winReshapeFcn можно назвать “функцией обратного вызова” для “события изменения формы”. Затем данную функ- цию можно применить для обратного вызова, так изменив параметры поля просмот- ра, чтобы сохранялось исходное характеристическое отношение сцены. Кроме того, можно изменить границы отсекающего окна, цвет окна на экране, согласовать другие параметры наблюдения и выполнить другие задачи. УПРАВЛЕНИЕ НЕСКОЛЬКИМИ ОКНАМИ НА ЭКРАНЕ (GLUT) Библиотека GLUT также содержит несколько процедур для различных манипуляций с окнами на экране. Данные процедуры особенно полезны, когда на экране есть несколько окон, и их нужно переупорядочить или расположить в нужном месте экрана определенное окно. Для преобразования текущего окна на экране в пиктограмму (небольшое изобра- жение или символ, представляющий окно) используется следующая процедура. glutlconifyWindow ( ); Данная пиктограмма помечается тем же именем, что присвоено окну, но имя пиктограммы можно изменить, используя такую команду. glutSetlconTitle ("Icon Name"); Кроме того, можно изменить имя окна на экране, используя похожую команду: glutSetWindowTitle ("New Window Name"); Когда на экране открыто несколько окон, часть из них может перекрываться или полностью закрывать другие окна экрана. Любое окно можно вывести перед всеми остальными, вначале сделав его текущим, а затем выполнив команду “всплывания”. glutSetWindow (windowID); glutPopWindow ( ); Подобным образом можно “запихнуть” текущее окно назад, чтобы оно располага- лось позади всех окон экрана. В этом случае используется такая последовательность операций. glutSetWindow (windowID); glutPushWindow ( );
6.4. Функции двухмерного наблюдения OpenGL 455 Кроме того, текущее окно можно убрать с экрана, использовав команду glutHideWindow ( ); Также можно вернуть “скрытое” окно экрана или окно, превращенное в пикто- грамму, сделав его текущим, а затем вызвав следующую функцию. glutShowWindow ( ); СУБОКНА GLUT В выбранном окне экрана можно задать любое количество окон второго уровня, называемых субокнами. Это позволяет разбивать окна на различные участки. Субокно создается следующей функцией. glutCreateSubWindow (windowID, xBottomLeft, yBottomLeft, width, height); Параметр windowID идентифицирует окно на экране, в котором требуется задать субокно. Остальные параметры задают размер субокна и расположение его левого нижнего угла относительно левого нижнего угла окна. Субокнам присваивается положительный целый идентификатор так же, как ну- меруются окна первого уровня. Кроме того, субокно можно расположить внутри другого субокна. К тому же, с каждым субокном можно соотнести отдельный режим отображения и другие параметры. Можно даже менять форму, положение субокон, помещать на передний или задний план, скрывать и показывать точно так же, как окна первого уровня. Однако субокно GLUT нельзя превратить в пиктограмму. ВЫБОР ФОРМЫ КУРСОРА ОКНА НА ЭКРАНЕ Чтобы придать форму экранному курсору, используемому в текущем окне, можно использовать следующую процедуру GLUT. glutSetCursor (shape); Возможны такие формы курсоров: стрелка, показывающая в выбранном направ- лении, двунаправленная стрелка, вращающаяся стрелка, перекрестье, наручные часы, вопросительный знак и даже череп и скрещенные кости. Например, можно присвоить параметру shape значение (символьная константа) GLUT_CURSOR_UP_DOWN и по- лучить двунаправленную (вверх и вниз) стрелку. Вращающаяся стрелка выбирается с помощью константы GLUT_CURSOR_CYCLE, форма наручных часов выбирается с помощью GLUT_CURSOR_WAIT, а череп и скрещенные кости — это константа GLUT_CURSOR_DESTROY. Форму курсора можно соотнести с окном экрана, чтобы указать определенный тип приложения, например, анимацию. Однако точные формы, которые можно использовать, зависят от системы.
456 Глава 6. Двухмерное наблюдение НАБЛЮДЕНИЕ ГРАФИЧЕСКИХ ОБЪЕКТОВ В ОКНЕ ЭКРАНА GLUT После создания окна на экране и выбора его положения, размера, цвета и других характеристик указывается, что будет показано в этом окне. Если на экране было создано несколько окон, требуемое окно вначале обозначается как текущее. Затем, чтобы присвоить что-то этому окну, вызывается следующая функция. glutDisplayFunc (pictureDescrip); Аргумент — это процедура, описывающая, что будет изображено в текущем окне. Данная процедура (в приведенном примере — с именем pictureDescrip) называ- ется функцией обратного вызова, поскольку она будет выполняться, когда GLUT ре- шит, что содержимое окна на экране нужно обновить. Процедура pictureDescrip обычно содержит примитивы и параметры OpenGL, определяющие изображение, хо- тя она может задавать другие конструкции, такие как изображение меню. Если на экране задано несколько окон, описанный процесс повторяется для каж- дого окна или субокна. Кроме того, может потребоваться вызвать glutDisplay- Func после команды glutPopWindow, если окно на экране было повреждено при повторном изображении окон. В этом случае используется следующая функция, что- бы указать, что содержимое текущего окна на экране нужно обновить. glutPostRedisplay ( ); Данная процедура также используется, когда в окне на экране нужно показать такой дополнительный объект, как всплывающее меню. ВЫПОЛНЕНИЕ ПРИКЛАДНОЙ ПРОГРАММЫ Когда настройка программы завершена, и окна на экране созданы и инициализиро- ваны, нужно выполнить конечную команду GLUT, которая сообщает о выполнении программы. glutMainLoop ( ); В этот момент окна экрана и их графическое содержимое посылаются на экран. Программа также вводит цикл обработки GLUT, который постоянно проверяет на наличие новых “событий”, таких как интерактивный ввод мышью или ввод с графи- ческого планшета. ДРУГИЕ ФУНКЦИИ GLUT Библиотека GLUT предлагает множество разнообразных процедур обработки про- цессов, зависящих от системы, дополняя основную библиотеку OpenGL. Например, данная библиотека содержит функции для генерации растровых и эскизных символов (раздел 3.21), и она предоставляет функции загрузки значений в таблицу цветов (раз-
6.4. Функции двухмерного наблюдения OpenGL 457 дел 4.3). Кроме того, некоторые функции GLUT, рассмотренные в главе 8, позволяют отображать трехмерные объекты либо как объемные тела, либо в форме каркасного представления. Данные объекты включают сферу, тор, пять правильных многогран- ников (куб, тетраэдр, октаэдр, додекаэдр и икосаэдр). Иногда бывает удобно задать такую функцию, которая будет выполняться при отсутствии иных событий, которые обрабатывает система. Это делается так. glutldleFunc (function); Параметром этой процедуры GLUT может быть фоновая функция или процедура, обновляющая параметры анимации, когда нет других процессов. Кроме того, существуют функции GLUT, рассмотренные в главе 11, которые пред- назначены для получения и обработки интерактивного ввода, а также создания меню и управления ими. GLUT предлагает отдельные процедуры для разных устройств ввода, таких как мышь, клавиатура, графический планшет, пространственный мани- пулятор (spaceball). Наконец, можно использовать следующую функцию для запроса системы о неко- торых текущих параметрах состояния. glutGet (stateParam); Данная функция возвращает целое значение, соответствующее символьной кон- станте, выбранной в качестве аргумента. Например, можно получить координату х левого верхнего угла текущего окна на экране относительного левого верхнего уг- ла экрана, использовав константу GLUT_WINDOW_X. Можно также получить теку- щую ширину окна или экрана, использовав константу GLUT_WINDOW_WIDTH или GLUT_SCREEN_WIDTH. ПРИМЕР ПРОГРАММЫ ДВУХМЕРНОГО НАБЛЮДЕНИЯ OpenGL Продемонстрируем использование функции поля просмотра OpenGL, расщепив экран, чтобы показать две проекции треугольника в плоскости ху, центр масс ко- торого находится в начале внешней системы координат. Изначально поле просмотра определяется в левой половине окна на экране, здесь же синим цветом отображается исходный треугольник. Затем для того же самого отсекающего окна определяется другое поле просмотра для правой половины окна, а цвет заполнения меняется на красный. Затем треугольник вращается относительно центра масс и отображается во втором поле просмотра. Оба треугольника, выводимые на экран данной программой, показаны на рис. 6.10.
458 Глава 6. Двухмерное наблюдение Рис. 6.10. Расщеп- ление экрана в окне с помощью процедуры dis- playFcn ♦include <GL/glut.h> class wcPt2D { public: GLfloat x, y; ); void init (void) { /* Задается белый цвет окна на экране. */ glClearColor (1.0, 1.0, 1.0, 0.0); /* Задаются параметры отсекающего окна во внешних координатах. */ glMatrixMode (GL_PROJECTION); gluOrtho2D (-100.0, 100.0, -100.0, 100.0); /* Задается режим построения геометрической матрицы преобразования. */ glMatrixMode (GL_MODELVIEW); ) void triangle (wcPt2D *verts) { GLint k; glBegin (GLJTRIANGLES); for (k = 0; k < 3; k++) glVertex2f (verts [k].x, verts [k].y); glEnd ( ); } void displayFcn (void) { /* Определяется исходное положение треугольника. */ wcPt2D verts [3] = { {-50.0, -25.0), {50.0, -25.0), {0.0, 50.0) ); glClear (GL_COLOR_BUFFER_BIT); // Очищается окно. glColor3f (0.0, 0.0, 1.0); // Цвет заполнения - синий. glViewport (0, 0, 300, 300); /* Задается левое поле просмотра. */ triangle (verts); // Отображается треугольник. /* Треугольник поворачивается и отображается в правой * половине окна. */
6.5. Алгоритмы отсечения 459 glColor3f (1.0, 0.0, 0.0); // Цвет заполнения - красный. glViewport (300, 0, 300, 300); /* Задается правое поле просмотра. */ glRotatef (90.0, 0.0, 0.0, 1.0); // Поворот вокруг оси z. triangle (verts); /* Отображается красный повернутый треугольник. */ glFlush ( ); } void main (int argc, char ** argv) { glutlnit (&argc, argv); glutlnitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutlnitWindowPosition (50, 50); glutlnitWindowSize (600, 300); glutCreateWindow ("Пример расщепления экрана"); init ( ) ; glutDisplayFunc (displayFcn); glutMainLoop ( ); АЛГОРИТМЫ ОТСЕЧЕНИЯ В общем случае любая процедура, которая удаляет те участки изображения, которые находятся внутри или снаружи заданной области пространства, называется алгорит- мом отсечения или просто отсечением. Обычно отсекающая область — это прямо- угольник стандартной ориентации, хотя в алгоритме отсечения можно использовать любую форму. Чаще всего отсечение применяется в конвейере наблюдения, где служит для из- влечения обозначенного участка сцены (двух- или трехмерной) с целью отображения на устройстве вывода. Методы отсечения также используются для защиты от нало- жения границ объектов, построения объектов с использованием методов объемного моделирования, управления средой с несколькими окнами и перемещения, копирова- ния или стирания участков изображения в различных программах рисования. Алгоритмы отсечения применяются к двухмерным процедурам наблюдения, что- бы определить те части изображения, которые находятся внутри отсекающего окна. Затем все, что находится вне отсекающего окна, удаляется из описания сцены, пе- редаваемого на устройство вывода для отображения. Для эффективной реализации отсечения в конвейере наблюдения алгоритмы применяются к нормированным грани- цам отсекающего окна. Это сокращает расчеты, поскольку все матрицы геометриче- ских преобразований и преобразований наблюдения можно объединить и применить к описанию сцены перед отсечением. Обрезанную сцену можно затем перевести в экранные координаты для окончательной обработки.
460 Глава 6. Двухмерное наблюдение В следующих разделах исследуются такие двухмерные алгоритмы. • Отсечение точки. • Отсечение линии (прямых отрезков). • Отсечение закрашенной области (многоугольники). • Отсечение кривой. • Отсечение текста. Отсечения точки, линии и многоугольника являются стандартными компонентами графических пакетов. Однако схожие методы можно применить и к другим объек- там, в частности, коническим сечениям, эллипсам и сферам, а также сплайновым кривым и поверхностям. Обычно, однако, для сокращения вычислений объекты с нелинейными границами аппроксимируются прямыми отрезками или многоугольны- ми поверхностями. Если не оговорено иное, будем предполагать, что отсекающая область — это прямоугольное окно стандартной ориентации, углы которого находятся в точках с координатами xwmjn, zwmax, ywmin и ywmax. Данные углы обычно соответствуют нормированному квадрату, в котором значения х и у принадлежат диапазону от 0 до 1 или от — 1 до 1. 6.6. ДВУХМЕРНОЕ ОТСЕЧЕНИЕ ТОЧКИ Для двухмерного прямоугольника стандартной ориентации двухмерная точка Р = (ж, у) извлекается для отображения, если удовлетворяется следующее неравенство: a^min — а: < a;wmax, y^'min — У < У^'тах- (6-12) Если любое из этих неравенств не удовлетворяется, точка отсекается (не сохра- няется для отображения). Хотя отсечение точки применяется реже, чем отсечение линии или многоугольни- ка, в различных ситуациях оно полезно, особенно когда изображения смоделированы системой многих частиц. Например, отсечение точки можно применить к сценам, содержащим облака, морскую пену, дым или взрывы, которые моделируются “части- цами” (координатами центров маленьких окружностей или сфер). 6.7. ДВУХМЕРНОЕ ОТСЕЧЕНИЕ ЛИНИИ На рис. 6.11 иллюстрируются возможные положения прямых отрезков относительно стандартного отсекающего окна. Алгоритм отсечения линии обрабатывает каждую
6.7. Двухмерное отсечение линии 461 Рис. 6.11. Отсечение прямых отрезков с использованием стандартного прямоугольного отсекаю- щего окна линию на сцене с помощью последовательности проверок и расчетов точек пересече- ния, позволяющих определить, нужно ли записывать линию или ее часть. Ресурсоем- кой частью процедуры отсечения линии является расчет точек пересечения линии со сторонами окна. Следовательно, главная цель любого алгоритма отсечения линии — минимизировать расчет точек пересечения. Чтобы это сделать, можно вначале выпол- нить проверку и определить, не находится ли участок линии полностью внутри или полностью снаружи отсекающего окна. Определить, что линия полностью внутри отсекающего окна, легко, гораздо сложнее идентифицировать все линии, полностью лежащие за окном. Если мы не можем отнести линию к полностью внутренним или полностью внешним, нужно вычислить точки пересечения линии с периметром окна. Чтобы проверить, находится ли прямой отрезок полностью внутри или полностью снаружи выбранной стороны отсекающего окна, проверяется возможность отсечения точки (см. предыдущий раздел). Если все концы отрезка находятся внутри всех че- тырех сторон отсекающего прямоугольника, как для линии от Pi до Рз на рис. 6.11, линия полностью лежит внутри отсекающего окна, и она сохраняется. Если оба кон- ца отрезка находятся вне всех четырех сторон (линия Р3Р4 на рис. 6.11), данный отрезок находится полностью вне окна, и он удаляется из описания сцены. Однако, если ни одна проверка не дала положительного результата, отрезок пересекает по меньшей мере одну сторону отсекающего прямоугольника и может пересекать или не пересекать внутреннюю часть отсекающего окна. Чтобы сформулировать уравнение для прямого отрезка, используем следующее параметрическое представление, где точки с координатами (хо, Уо) и (хепа, Уепс1) обозначают два конца отрезка. х = ХО + u(xend - Хо), (6.13) 2/= 2/о + u<2/end - 2/о), 0 < u < 1.
462 Глава 6. Двухмерное наблюдение На основе приведенного параметрического представления можно определить, где отрезок проходит через стороны отсекающего окна, подставив вместо х или у коор- динаты и найти из уравнения параметр и. Например, левая граница окна проходит по xwmin, поэтому подставим это значение вместо х, найдем и и вычислим соответству- ющую координату у точки пересечения. Если это значение и не входит в диапазон от 0 до 1, отрезок не пересекает данную границу окна. Однако, если значение и принадлежит диапазону 0-1, часть линии находится внутри границ. Затем можно об- работать данную внутреннюю часть отрезка вместе с другими границами окна, пока не будет удалена вся линия, или пока не будет найден отрезок, полностью лежащий внутри окна. Обработка отрезков на сцене с использованием простого подхода отсечения, опи- санного в предыдущем абзаце, является прямолинейной, но не очень эффективной. Вообще, исходную проверку и расчет точек пересечения можно переформулировать так, чтобы сократить время обработки набора прямых отрезков, и в настоящее вре- мя разработано несколько более быстрых схем отсечения линий. Некоторые из этих алгоритмов явно разработаны для двухмерных изображений, некоторые легко адап- тируются для наборов трехмерных отрезков. ОТСЕЧЕНИЕ ЛИНИЙ КОЭНА-САЗЕРЛЕНДА Одним из первых алгоритмов, разработанных для быстрого отсечения линий, являет- ся схема Коэна-Сазерленда (Cohen-Sutherland), и разновидности этого метода очень широко используются. Время обработки в этом методе сокращено за счет больше- го числа проверок перед обработкой (нахождением точек пересечения). Изначально всем конечным точкам линий на изображении присваивается четырехзначное дво- ичное значение, называемое кодом области, и каждый двоичный разряд указывает, находится точка внутри или вне одной границы отсекающего окна. Границы окна можно пронумеровать в любом порядке, и на рис. 6.12 иллюстрируется одно воз- можное упорядочение, когда двоичные разряды нумеруются от 1 до 4 слева направо. Следовательно, при таком упорядочении крайний справа разряд (бит 1) соответству- ет левой границе отсекающего окна, а крайний слева разряд (бит 4) соответствует верхней границе окна. Значение 1 (или true) в любом разряде указывает, что конечная точка находится вне данной границы окна. Аналогично значение 0 (или false) в любом разряде указывает, что конечная точка не находится снаружи (внутри или на границе) соответствующей стороны окна. Иногда код области называется “командой на вы- ключение”, поскольку значение 1 в любом разряде указывает, что пространственная точка находится вне соответствующей границы отсечения. Каждая сторона отсекающего окна делит двухмерное пространство на внутрен- нюю половину пространства и внешнюю. Всего четыре границы окна формируют девять областей, а на рис. 6.13 перечислены значения двоичного кода во всех этих областях. Следовательно, конечной точке, которая находится ниже и слева от отсека-
6.7. Двухмерное отсечение линии 463 Рис. 6.12. Возможное упорядочение границ отсекающих окон, соот- ветствующих двоичным разрядам кода области Коэна-Сазерленда 1001 1000 1010 0001 0000 Отсекающее окно 0010 0101 । 0100 । оно Рис. 6.13. Девять двоичных кодов области, идентифицирующих поло- жение конечной точки относительно границ отсекающего окна ющего окна, присваивается код области 0101, а код области любой конечной точки, находящейся внутри отсекающего окна, — 0000. Двоичные значения кода области определяются сравнением координат (х, у) ко- нечной точки с границами отсекающего прямоугольника. Бит 1 устанавливается, если х < £wmjn, подобным образом определяются значения трех остальных битов. Вме- сто проверки с помощью неравенства, эффективнее применять операции обработки битов и следующие два этапа: 1) рассчитать разности между координатами конечных точек и границами окна отсечения; 2) использовать знак результата каждой разности для задания соответствующего значения кода области. Для упорядочения, показанно- го на рис. 6.12, бит 1 является битом знака выражения х — a?wmin; бит 2 — бит знака выражения штах — х; бит 3 — бит знака выражения у — ywmia; и бит 4 — это бит знака выражения ywmax — У- После того как коды областей для всех конечных точек будут определены, можно быстро выявить, какие линии полностью лежат внутри окна, а какие очевидно лежат снаружи. Конечные точки всех линий, которые целиком вмещаются в окно, имеют код области 0000, и эти отрезки записываются. Любая линия, конечные точки которой имеют 1 в одинаковых разрядах кода области, лежит полностью за пределами окна, и этот отрезок удаляется. Например, линия, одна конечная точка которой имеет код области 1001, а другая — 0101, целиком находится слева от отсекающего окна, что видно по значению 1 в первом разряде обоих кодов области.
464 Глава 6. Двухмерное наблюдение Рис. 6.14. Линии, проходящие из одной области отсекающего окна в другую, могут пересекать окно или пересекать одну или несколько границ отсечения, не входя в окно Проверки “внутри-снаружи” можно выполнять с использованием логических опе- раторов. Если значение операции ИЛИ, примененной к двум кодам конечных точек, — false (0000), отрезок находится внутри отсекающего окна. Следовательно, данная ли- ния записывается для отображения, и проверяется следующая линия в описании сцены. Если результат операции И, примененной к двум кодам конечных точек, — true (не 0000), линия полностью лежит вне отсекающего окна, и ее можно исключить из описания сцены. Линии, которые с помощью проверок кодов области нельзя однозначно отнести к полностью внешним или полностью внутренним, далее проверяются на предмет пересечения с границами окон. Как показано на рис. 6.14, отрезки могут пересекать границы отсечения, не попадая внутрь окна. Следовательно, для отсечения отрезка может потребоваться вычислить несколько точек пересечения в зависимости от по- рядка, в котором обрабатываются границы отсечения. При обработке каждой стороны отсекающего окна отсекается кусок линии, а оставшаяся часть линии проверяется на пересечение с другими границами окон. Удаление участков продолжается, пока линия не будет полностью обрезана, или пока оставшаяся часть линии не будет полностью располагаться внутри отсекающего окна. Далее будем предполагать, что стороны окна обрабатываются в таком порядке: левая, правая, нижняя, верхняя. Чтобы определить, пересекает ли линия выбранную границу отсечения, можно проверить соответству- ющие разряды кодов областей конечных точек. Если одно из этих значений равно 1, а второе — 0, отрезок пересекает данную границу. На рис. 6.14 показаны два отрезка, которые невозможно сразу отнести к пол- ностью внутренним или полностью внешним по отношению к отсекающему окну. Коды областей отрезка, соединяющего Pi с Р2, равны 0100 и 1001. Следовательно, Pi находится внутри левой границы отсечения, а Р2 — вне этой границы. Затем вычисляется точка пересечения Р2, и вырезается участок линии от Р2 до Р^. Остав- шаяся часть линии находится внутри правой граничной линии, поэтому переходим к
6.7. Двухмерное отсечение линии 465 (**end’ Tend) Рис. 6.15. Четыре точки пересечения (помечены цифрами от 1 до 4) отрезка, отсекаемого границами окна в таком порядке: левая, правая, нижняя, верхняя проверке нижней границы. Конечная точка Pi расположена ниже отсекающей сторо- ны, а ₽2 — выше, поэтому далее находится точка пересечения с этой границей (Р^). Затем удаляется участок линии между Pi и Р'1; и мы переходим к обработке верх- него края окна. Здесь определяется точка пересечения Р". Заключительный этап — вырезание участка над верхней границей и запись внутреннего сегмента от Р^ до Р2. Для второй линии находим, что точка Р3 находится вне левой границы, а Р4 — внутри. Следовательно, нужно найти точку пересечения Р3 и удалить отрезок между Р3 и Р3. Проверяя коды областей конечных точек Р3 и Р4, находим, что оставшаяся часть линии находится ниже отсекающего окна, и ее также можно удалить. При отсечении отрезка с использованием данного подхода, возможно, придется вычислить точки пересечения со всеми четырьмя границами отсечения в зависимости от того, как обрабатываются конечные точки линии и как упорядочены границы. На рис. 6.15 показаны четыре точки пересечения, которые можно вычислить для отрезка, который обрабатывается на предмет пересечения со сторонами отсекающего окна, идущими в следующем порядке: левая, правая, нижняя, верхняя. Поэтому были разработаны модификации данного алгоритма, направленные на сокращение расчетов точек пересечения. Чтобы определить точки пересечения с отрезком, можно использовать уравне- ние прямой с угловым коэффициентом. Для прямой с координатами конечных точек (жо, уо) и (send, У end) координата у точки пересечения с вертикальной отсекающей границей находится следующим образом: у = уо + т(х - ж0), (6.14)
466 Глава 6. Двухмерное наблюдение где значение х выбирается равным xwm\n или xwmax, а тангенс угла наклона прямой вычисляется как т = (yend — Уо)/(^end — ®о)- Подобным образом, если ищется точка пересечения с горизонтальной границей, координату х можно вычислить следующим образом: . У - Уо ,, . х = хо Н-------, (6.15) т где у равно ywmin или ywmax. Реализация двухмерного алгоритма отсечения прямых Коэна-Сазерленда пред- ставлена в следующих процедурах. Расширение этого алгоритма на трехмерную ситуацию очевидно, а более подробно трехмерное наблюдение рассматривается в следующей главе. class wcPt2D { public: GLfloat x, у; }; inline GLint round (const GLfloat a) { return GLint (a + 0.5); } /* * Для каждой внешней области прямоугольного отсекающего окна * определяется четырехбитовый код. */ const GLint winLeftBitCode = 0x1; const GLint winRightBitCode = 0x2; const GLint winBottomBitCode = 0x4; const GLint winTopBitCode = 0x8; /* Битовый код области также присваивается каждой конечной * точке входного отрезка согласно его расположению * относительно четырех краев входного прямоугольного * отсекающего окна. * Конечная точка с кодом области 0000 находится внутри * отсекающего окна, в противном случае она находится вне хотя * бы одной отсекающей границы. Если применение операции ИЛИ * к двум кодам конечных точек дает значение 'false', вся * линия, определенная этими двумя конечными точками * записывается (принимается). Если применение операции И к * двум кодам конечных точек дает значение 'true', линия лежит * полностью вне отсекающего окна, и она исключается из * дальнейшей обработки (отклоняется). */ inline GLint inside (GLint code) { return GLint (!code); } inline GLint reject (GLint codel, GLint code2) { return GLint (codel & code2); } inline GLint accept (GLint codel, GLint code2) { return GLint (1(codel I code2)); }
6.7. Двухмерное отсечение линии 467 GLubyte encode (wcPt2D pt, wcPt2D winMin, wcPt2D winMax) { GLubyte code = 0x00; if (pt.x < winMin.x) code = code | winLeftBitCode; if (pt.x > winMax.x) code = code | winRightBitCode; if (pt.у < winMin.у) code = code | winBottomBitCode; if (pt.у > winMax.у) code = code | winTopBitCode; return (code); } void swapPts (wcPt2D * pl, wcPt2D * p2) { wcPt2D tmp; tmp = *pl; *pl = *p2; *p2 = tmp; } void swapCodes (GLubyte * cl, GLubyte * c2) { GLubyte tmp; tmp = *cl; *cl = *c2; *c2 = tmp; } void lineClipCohSuth (wcPt2D winMin, wcPt2D winMax, wcPt2D pl, wcPt2D p2) { GLubyte codel, code2; GLint done = false, plotLine = false; GLfloat m; while (!done) { codel = encode (pl, winMin, winMax); code2 = encode (p2, winMin, winMax); if (accept (codel, code2)) { done = true; plotLine = true; } else if (reject (codel, code2)) done = true; else { /* Пометить конечную точку вне окна на экране как pl. */ if (inside (codel)) { swapPts (&pl, &p2); swapCodes (&codel, &code2); } /* Использовать тангенс угла наклона m */ /* для расчета пересечения линии со стороной. */ if (р2.х != pl.x) m = (р2.у - pl.y) / (р2.х - pl.x); if (codel & winLeftBitCode) {
468 Глава 6. Двухмерное наблюдение pl.y += (winMin.x - pl.x) * m; pl.x = winMin.x; } else if (codel & winRightBitCode) { pl.y += (winMax.x - pl.x) * m; pl.x = winMax.x; } else if (codel & winBottomBitCode) { /* Нужно обновить pl.x только для невертикальных линий. */ if (р2.х != pl.х) pl.x += (winMin.y - pl.y) / m; pl.y = winMin.y; } else if (codel & winTopBitCode) { if (p2.x != pl.x) pl.x += (winMax.y - pl.y) / m; pl.y = winMax.y; } } } if (plotLine) lineBres (round (pl.x), round (pl.y), round (p2.x), round (p2.y)); } ОТСЕЧЕНИЯ ЛИНИИ ЛИАНГА-БАРСКИ Были разработаны и более быстрые алгоритмы отсечения линий, в которых перед расчетом точек пересечения производится больше проверок. Одна из первых работ в этом направлении принадлежит Сайресу (Cyrus) и Бэку (Beck), и она основана на анализе параметрических уравнений прямой. Позднее Лианг (Liang) и Барский (Barsky) независимо разработали даже еще более быструю форму параметрического алгоритма отсечения линий. Для отрезка с конечными точками (xq, уо) и (^encj, yCnd) линию можно описать в параметрической форме: х = хо + иДх, У = Уо + г/Ду, О < и < 1, (6.16) где А.т = T'eud — хо и Ду = yenci — уд. В алгоритме Лианга-Барски параметрические уравнения прямой объединяются с условиями отсечения линии (6.12), в результате
6.7. Двухмерное отсечение линии 469 чего получаются неравенства 2-^’min < 2-0 + U&X < TWmax, Z/^’min < УО + иДу < yWmax, которые можно выразить следующим образом: и Рь < qie. А; = 1,2,3,4, (6.18) где параметры р и q определяются как Р1 = -Дж, 91 = То - TWmin, Р2 = Дт, 92 = TWmax - то, (6.19) Рз = -Лу, q3= уо- ywm-m, Pt = Ду, 94 = ywmax - у0. Любая линия, параллельная одной из сторон отсекающего окна, имеет рк = 0 при к, связанном с данной границей (к = 1, 2, 3 и 4 соотнесено с левой, правой, нижней и верхней границей соответственно). Если для этого значения к также будет qk < 0, то- гда линия полностью лежит вне границы, и ее можно исключить из дальнейшего рас- смотрения. Если 9fc > 0, линия находится внутри параллельной границы отсечения. Если рк < 0, бесконечное расширение линии идет снаружи внутрь бесконечного расширения определенной стороны отсекающего окна. Если рк > 0, линия идет изнутри наружу. При ненулевом значении рк можно вычислить величину и, которая соответствует точке, где бесконечно расширенная линия пересекает расширение края окна к’. 9fc и = —. (6.20) Рк Для каждой линии можно вычислить значения параметров щ и и2, которые определяют ту часть линии, которая лежит внутри отсекающего прямоугольника. Значение щ находится исследованием сторон прямоугольника, для которых линия идет снаружи внутрь (р < 0). Для этих сторон вычисляется г к = qk/Pk- Значение U1 выбирается равным максимуму набора из 0 и различных значений г. И наоборот, значение и2 определяется исследованием границ, для которых линия идет изнутри наружу (р > 0). Для каждой из этих границ вычисляется значение г к, а значение г/2 равно минимуму набора, состоящего из 1 и рассчитанных значений г. Если щ > и2, линия полностью находится снаружи отсекающего окна, и ее можно отбросить. В противном случае по двум значениям параметра и вычисляются конечные точки извлекаемой линии.
470 Глава 6. Двухмерное наблюдение Описанный алгоритм реализован в следующем фрагменте кода. Параметры то- чек пересечения линий специализируются со значениями щ = 0 и и? — 1. Для каждой границы отсечения вычисляются подходящие значения р и q, которые затем используются функцией clipTest для определения, следует ли отбросить линию, или нужно вычислить параметры пересечения. Если р < 0, параметр г применя- ется для обновления и^; при р > 0 параметр г используется для обновления и^- Если обновление щ или U2 приводит к щ. > и^, линия отбрасывается. В противном случае обновляется соответствующий параметр и, только если новое значение дает более короткую линию. Если р = 0 и q < 0, линию можно удалить, поскольку она параллельна границе и находится вне ее. Если линия не отброшена после проверки всех четырех значений р и q, по значениям ui и U2 определяются конечные точки обрезанной линии. class wcPt2D { private: GLfloat x, у; public: /* По умолчанию точка инициализируется как (0.0, 0.0). */ wcPt3D ( ) { х = у = 0.0; } setCoords (GLfloat xCoord, GLfloat yCoord) { x = xCoord; у = yCoord; } GLfloat getx ( ) const { return x; } GLfloat gety ( ) const { return y; } }; inline GLint round (const GLfloat a) { return GLint (a + 0.5); } GLint clipTest (GLfloat p, GLfloat q, GLfloat * ul, GLfloat * u2){ GLfloat r; GLint returnValue = true; if (p < 0.0) { r = q / p; if (r > *u2) returnValue = false; else if (r > *ul) *ul = r; }
6.7. Двухмерное отсечение линии 471 else if (р > 0.0) { г = q / р; if (г < *ul) returnvalue = false; else if (r < *u2) *u2 = r; } else /* В этом случае p = 0, и линия параллельна границе отсечения. */ if (q < 0.0) /* Линия вне границы отсечения. */ returnvalue = false; return (returnvalue); } void lineClipLiangBarsk (wcPt2D winMin, wcPt2D winMax, wcPt2D pl, wcPt2D p2) { GLfloat ul = 0.0, u2 = 1.0, dx = p2.getx ( ) - pl.getx ( ), dy; if (clipTest (-dx, pl.getx ( ) - winMin.getx ( ), &ul, &u2)) if (clipTest (dx, winMax.getx ( ) - pl.getx ( ), &ul, &u2)) { dy = p2.gety ( ) - pl.gety ( ); if (clipTest (-dy, pl.gety () - winMin.gety (), &ul, &u2)) if (clipTest (dy, winMax.gety () - pl.gety (), &ul, &u2)) { if (u2 < 1.0) { p2.setCoords (pl.getx ( ) + u2 * dx, pl.gety ( ) + u2 * dy); } if (ul > 0.0) { pl.setCoords (pl.getx ( ) + ul * dx, pl.gety ( ) + ul * dy); } lineBres (round (pl.getx ( )), round (pl.gety ( )), round (p2.getx ( )), round (p2.gety())); } } Вообще, алгоритм Лианга-Барски эффективнее алгоритма Коэна-Сазерленда. Кавдое обновление параметров и\ и требует только одного деления; точки пере- сечения линии с окном вычисляются только один раз, когда вычисляются конечные значения щ и и?. В то же время, алгоритм Коэна-Сазерленда может последователь-
472 Гпава 6. Двухмерное наблюдение Рис. 6.16. Три возможных положения конечной точки линии Ро в алгоритме НЛН но вычислять точки пересечения вдоль траектории прямой, даже если сам отрезок полностью находится за отсекающим окном. Наконец, каждый этап вычисления точ- ки пересечения по Кохену-Сазерленду требует деления и умножения. В завершение отметим, что алгоритм Лианга-Барски можно расширить на отсечение трехмерных линий (глава 7). ОТСЕЧЕНИЕ ЛИНИИ НИКОЛЛА-ЛИ-НИКОЛЛА В алгоритме Николла-Ли-Николла (Nicholl-Lee-Nicholl — NLN, НЛН) создается больше областей вокруг окна отсечения, и за счет этого не нужно несколько раз проводить расчет точек пересечения линии с окном. В методе Коэна-Сазерленда, например, можно вначале вычислить несколько точек пересечения вдоль прямой, со- держащей отрезок, перед тем, как будет найдена точка пересечения с собственно отсекающим прямоугольником, или пока линия не будет целиком отброшена. В ал- горитме НЛН подобных дополнительных расчетов нет, для чего перед вычислением точки пересечения выполняется больше проверок областей. По сравнению с алго- ритмами Коэна-Сазерленда и Лианга-Барски алгоритм НЛН имеет меньше операций сравнения и деления. За эти преимущества нужно платить тем, что алгоритм НЛН применим только к двухмерному отсечению, тогда как два других легко расширяются на трехмерные сцены. Изначальную проверку, выполняемую, чтобы определить, находится отрезок це- ликом внутри или целиком снаружи окна, можно провести с использованием кодов об- ластей, как в предыдущих двух алгоритмах. Если тривиальное принятие или отклоне- ние отрезка невозможно, алгоритм НЛН вводит дополнительные области отсечения. Для отрезка с концами Ро и Репа вначале определяется положение точки Ро в восьми возможных областях относительно отсекающего окна. Из показанных на рис. 6.16 областей нужно рассмотреть только три. Если точка Ро лежит в одной из шести остальных областей, ее можно переместить в одну из трех областей, пока- занных на рис. 6.16, используя преобразование симметрии. Например, область непо- средственно над отсекающим окном можно преобразовать в область слева от окна, используя отражение относительно линии у = — х, или же можно использовать по- ворот на 90° против часовой стрелки.
6.7. Двухмерное отсечение линии 473 Рис. 6.17. Четыре области, используемые в алгоритме НЛН, когда точка Ро находится внутри отсекающего окна, а Ропд — вне LT V. LR LB Рис. 6.18. Четыре отсекающие области, используемые в ал- горитме НЛН, когда точка Ро лежит непосредственно слева от отсекающего окна Предполагая, что Ро и Pend не лежат одновременного внутри отсекающего окна, определим положение Pend относительно Ро- Чтобы это сделать, создадим несколько новых областей на плоскости в зависимости от положения точки Pg. Границы новых областей — лучи, начинающиеся в точке Pg и проходящие через углы отсекающего окна. Если Pg находится внутри отсекающего окна, задаются четыре области, по- казанные на рис. 6.17. Затем в зависимости от того, какая область (L, Т, R или В) содержит точку Репа, точка пересечения с линией сравнивается с соответствующей границей окна. Если Ро лежит в области слева от окна, задаются четыре области, помеченные на рис. 6.18 L, LT, LR и LB. Данные четыре области определяют единственную сторону отсекающего окна относительно положения Pend- Например, если Pend находится в любой из трех областей, помеченных L, линия отсекается на левой границе окна, и записывается отрезок от этой точки пересечения до Pend- Если Pend лежит в области LT, записывается отрезок от левой до верхней границы окна. Подобная обработка выполняется для областей LR и LB. Однако, если Pend не принадлежит ни одной из областей L, LT, LR и LB, отсекается вся линия.
474 Гпава 6. Двухмерное наблюдение Ро*- Ро TR ' LB \ ТВ или TR LR LB б) а) Рис. 6.19. Два возможных набора отсекающих областей, используемых в алгоритме НЛН, когда точка Ро находится выше и слева от отсекающего окна В третьем случае, когда Pq лежит слева сверху отсекающего окна, используют- ся области, показанные на рис. 6.19. В этом случае возможны два показанных на рисунке варианта в зависимости от положения точки Ро в левом верхнем углу от- секающего окна. Если Pg ближе к левой границе отсечения, используются области, изображенные на рис. 6.19, а. В противном случае, когда Ро ближе к верхней грани- це отсечения, используются области, приведенные на рис. 6.19, б. Если точка Pend находится в одной из областей Т, L, TR, ТВ, LR или LB, это условие однозначно определяет границу отсекающего окна для расчета точки пересечения. В противном случае отбрасывается вся линия. Чтобы определить область, в которой расположена точка Pend, сравниваются тангенсы углов наклона отрезка с тангенсами углов наклона границ областей НЛН. Например, если Ро находится слева от отсекающего окна (рис. 6.18), тогда Реп<1 принадлежит области LT, если PqPtR < PoPend < РоРтГ или УТ - Уо Vend - Уо < УТ - Уо X R Xq -^end Tq Xr Xq (6.21) (6.22) Вся линия отсекается, если (УТ ~ yoX^end - Х0) < (xL - X0)(yend - уо). (6.23) Расчет разности координат и произведений, используемых в проверках тангенсов углов наклона, записывается, а затем применяется в расчете точек пересечения. Из
6.7. Двухмерное отсечение линии 475 параметрических уравнений х = Хо + (xend - Х0)н, У = УО + (?/end - Уо)и вычисляется координата х точки пересечения с левой границей окна х = х^, где и = (х/, - £o)/(xend — хо), так что координата у точки пересечения равна У = УоН--------(х/,-хо). (6.24) ^end ^0 Координата у точки пересечения с верхней границей равна у = ут, и и = (ут~Уо)/(Уепа - Уо), где х = .т0 + 3?end_ т°. (уг _ уоу (6.25) Уепа УО ОТСЕЧЕНИЕ ЛИНИЙ С ИСПОЛЬЗОВАНИЕМ НЕПРЯМОУГОЛЬНЫХ МНОГОУГОЛЬНЫХ окон В некоторых приложениях может требоваться отсечь линии многоугольниками про- извольной формы. Такие методы, основанные на параметрических уравнениях пря- мой, как алгоритмы Кируса-Бека или Лианга-Барски, можно легко расширить на отсечение линий выпуклыми многоугольниками. Для этого в алгоритм включаются параметрические уравнения границ отсекающих областей. Предварительный отсев участков линий можно выполнить, обработав линии с указанными координатными границами отсекающего многоугольника. Для отсекающих областей в форме вогнутых многоугольников данные парамет- рические процедуры отсечения также применимы, если вначале расщепить вогну- тый многоугольник на набор выпуклых, используя один из методов, описанных в разделе 3.15. Другой подход — просто добавить одну или несколько дополнитель- ных сторон к вогнутой отсекающей области, так что она превращается в выпуклую многоугольную форму. Затем, используя видоизмененные выпуклые многоугольные компоненты, можно применить ряд операций отсечения, как показано на рис. 6.20. Итак, нужно знать, как будет выглядеть отрезок Р1Р2 на рис. 6.20, а после отсечения вогнутым окном с вершинами У\, V2, V3, V4 и V5. В этом случае получается две вогнутые отсекающие области за счет добавления отрезка между V4 и Vi. Затем ли- ния отсекается в два этапа: 1) линия Р1Р2 отсекается выпуклым многоугольником с вершинами Vj, V2, V3 и V4, и получается обрезанный сегмент PjP^ (рис. 6.20, б); 2) внутренний отрезок Р^Р^ отсекается с использованием выпуклого многоуголь- ника с вершинами Vi, V5 и V4 (рис. 6.20, в), и получается конечный извлеченный ^отрезок Р'/Р'г-
476 Глава 6. Двухмерное наблюдение Р, Отсекающее окно в виде вогнутого многоугольника а) Рис. 6.20. Отсекающее окно в виде вогну- того многоугольника (панель а) с верши- нами (Vi, Vj, V3, V4, V5) преобразуется в выпуклый многоугольник (Vi, V2, V3, V4) (панель б). Внешние сегменты линии Р1Р2 затем отрезаются с использовани- ем данного выпуклого отсекающего окна. Получающийся в результате отрезок P^Pj затем обрабатывается треугольником (V1; V5, V4) (панель в), в результате чего отсе- кается внутренний участок прямой РдР'/. и получается окончательная линия Р"Р'2 V1 1 б) отсекаются внешние отрезки линии Р.' \ Z v в) отсекается внутренний отрезок линии ОТСЕЧЕНИЕ ЛИНИЙ С ИСПОЛЬЗОВАНИЕМ ОКОН С НЕЛИНЕЙНЫМИ ГРАНИЦАМИ Отметим, что также можно использовать окружности или другие отсекающие области с криволинейными границами, но это требует больше обработки, поскольку расчет точек пересечения включает решение нелинейных уравнений. На первом этапе ли- нии можно укоротить, используя граничный прямоугольник (координатные границы) криволинейной отсекающей области. Линии, расположенные вне координатных гра- ниц, удаляются. Чтобы определить линии, которые находятся внутри окружности, например, можно вычислить расстояние конечных точек линии от центра окружно- сти. Если квадрат этого расстояния для конечных точек линии меньше или равен квадрату радиуса, можно извлечь всю линию. Затем нужно обработать оставшиеся линии, и для этого вычисляются точки пересечения, что иногда требует решения систем нелинейных уравнений.
6.8. Отсечение многоугольной закрашенной области 477 а) до отсечения б) после отсечения Рис. 6.21. Применение алгоритма отсечения ли- нии к отрезку границы многоугольника (па- нель а) дает несвязанный набор линий (панель б) б) после отсечения Рис. 6.22. Изображение правильно извлеченной многоугольной закрашенной области 6.8. ОТСЕЧЕНИЕ МНОГОУГОЛЬНОЙ ЗАКРАШЕННОЙ ОБЛАСТИ Графические пакеты обычно поддерживают только закрашенные области, являющи- еся многоугольниками, причем часто — только выпуклыми. Чтобы обрезать много- угольную закрашенную область, нельзя прямо применить метод отсечения линии к отдельным сторонам многоугольника, поскольку данный подход в общем случае не даст замкнутой ломаной линии. Вместо этого алгоритм отсечения линии часто дает непересекающийся набор линий, причем без указания полной информации о том, как можно сформировать замкнутую границу вокруг извлеченной закрашенной области. На рис. 6.21 иллюстрируется возможный выход процедуры отсечения линий, приме- ненной к сторонам многоугольной закрашенной области. Итак, все, что требуется, — процедура, которая выдаст одну или несколько замкнутых ломаных линий-границ из- влеченной закрашенной области, чтобы многоугольники можно было преобразовать в стандарт развертки и заполнить внутренние части заданным цветом или узором, как показано на рис. 6.22.
478 Глава 6. Двухмерное наблюдение Л* А Исходный Отсечение Отсечение многоугольник слева справа Отсечение Отсечение снизу сверху Рис. 6.23. Этапы обработки многоугольной закрашенной области при отсечении прямоугольной областью Отсекающее окно Координатные границы закрашенной многоугольной области Рис. 6.24. Много- угольная закрашен- ная область, коор- динатные границы которой находятся за правой границей отсечения Многоугольную закрашенную область можно извлечь из отсекающего окна, ис- пользуя тот же общий подход, что и в отсечении линий. Отрезок определяется двумя его концами, и эти точки обрабатываются процедурой отсечения линий, для чего стро- ится новый набор конечных точек, обрезанных на всех границах отсекающего окна. Таким образом, требуется следить, чтобы закрашенная область была единым объек- том при обработке на этапах отсечения. Следовательно, для многоугольной закрашен- ной области можно определять новую форму при обработке каждой стороной отсека- ющего окна, как показано на рис. 6.23. Разумеется, внутренняя часть многоугольника не будет закрашена, пока не определится окончательная отсеченная граница. В приведенных выше схемах первая проверка отрезка определяла, можно ли его полностью извлечь или полностью отбросить. Ту же процедуру можно выполнить и для многоугольной закрашенной области, проверив ее координатные границы. Если минимальная и максимальная координаты закрашенной области находятся внутри всех четырех линий отсечения, закрашенная область извлекается для дальнейшей обработки. Если все данные координатные границы находятся вне какой-то границы отсекающего окна, многоугольник исключается из описания сцены (рис. 6.24).
6.8. Отсечение многоугольной закрашенной области 479 Рис. 6.25. Выпуклая многоугольная закрашенная область (панель а), определенная списком вершин {1, 2, 3}, отсекается до получения закрашенной области (панель б), определяемой выходным списком вершин {!', 2', 2", 3', 3", 1") ...... Отсечение Г б) Если закрашенную область нельзя однозначно отнести к полностью внутренним или полностью внешним по отношению к отсекающему окну, необходимо определить точки пересечения с линиями отсечения. Один метод реализации отрезания заключа- ется в создании нового списка вершин на каждой линии отсечения, а затем передаче этого нового списка вершин следующей процедуре отсечения по линии. Выход конеч- ного этапа отсечения — список вершин извлеченного многоугольника (рис. 6.25). При отсечении вогнутым многоугольником данный базовый подход потребуется несколько модифицировать, так что генерироваться будет несколько списков вершин. ОТСЕЧЕНИЕ МНОГОУГОЛЬНИКАМИ САЗЕРЛЕНДА-ХОДГМАНА Эффективный метод извлечения закрашенного выпуклого многоугольника, разрабо- танный Сазерлендом и Ходгманом (Hodgman), заключается в следующем: так про- пускать вершины многоугольника по всем этапам отсечения, чтобы отдельную отсе- ченную вершину можно было сразу передавать на следующий этап. Это позволяет не создавать на каждом этапе отсечения выходной набор вершин, а также реализовать процедуры отсечения по границам параллельно. Окончательный выход — это список вершин, описывающих стороны извлеченной многоугольной закрашенной области. Поскольку алгоритм Сазерленда-Ходгмана дает только один список выходных вершин, он не может корректно сгенерировать два выходных многоугольника, по- казанных на рис. 6.22, б, полученных при отсечении вогнутого многоугольника, приведенного на рис. 6.22, а. В то же время, алгоритм можно изменить, чтобы он давал несколько выходных списков вершин и позволял обрабатывать вогнутые многоугольники общей формы. Стандартный алгоритм Сазерленда-Ходгмана может обрабатывать вогнутые многоугольники, если получающуюся в результате область можно описать одним списком вершин.
480 Глава 6. Двухмерное наблюдение снаружи—► внутри Выход: V/, V2 внутри —►- внутри Выход: V2 внутри —► снаружи Выход: V|' снаружи —снаружи Выход: отсутствует Рис. 6.26. Четыре возможных выхода процедуры отсечения левой границей в зависимости от поло- жения пары конечных точек относительно левой границы отсекающего окна Общая схема этого алгоритма состоит в следующем: последовательно проводить пары концов соседних сторон многоугольника по ряду процедур отсечения (отсече- ние слева, справа, снизу, сверху). Когда процедура отсечения завершает обработку пары вершин, выходные координаты оставшихся вершин (если они есть) передаются следующей процедуре отсечения. Затем первая процедура отсечения обрабатывает следующую пару конечных точек. При подобной схеме отдельные процедуры отсе- чения по границе могут работать параллельно. При обработке стороны многоугольника процедурой отсечения по границе нуж- но рассмотреть четыре возможные ситуации. Первая возможность — первый конец отрезка находится снаружи отсекающий границы, а второй — внутри. Вторая — оба конца находятся внутри. Третья ситуация — первая конечная точка находится внутри, а вторая снаружи границы. Наконец, обе точки могут находиться снаружи границы. Чтобы облегчить передачу вершин с одного этапа отсечения на другой, выход каждой процедуры отсечения можно сформулировать так, как показано на рис. 6.26. При передаче последовательных пар конечных точек одной из четырех процедур отсечения выход генерируется согласно результатам следующих проверок. 1. Если первая входная вершина находится вне данной границы отсекающего окна, а вторая расположена внутри, две точки — пересечения стороны многоуголь- ника с границей окна и вторая вершина — передаются следующей процедуре отсечения. 2. Если обе входные вершины находятся внутри данной границы отсекающего ок- на, следующей процедуре передается только вторая вершина. 3. Если первая вершина находится внутри данной границы отсекающего окна, а вторая — снаружи, следующей процедуре передается только точка пересечения стороны многоугольников с границей отсекающего окна. 4. Если обе входные вершины находятся вне данной границы отсекающего окна, ни одна из них не передается следующей процедуре.
6.8. Отсечение многоугольной закрашенной области 481 Ц.2): (2.3): (3.1): (внутри - внутри) -М2} (внутри - снаружи) —Х2} {2, 2'): (внутри - внутри)-» (2') (снаружи- внутри) —»(3', 1)[2', З').-(внутри-внутри) —»{3') (3‘, 1}: (внутри - внутри) -»{1) (I, 2): (внутри - внутри)-»(2} {23 ’): (внутри - снаружи)-» {2") [3*, 1}: (снаружи - снаружи)—» {} (1, 2): (снаружи - внутри)—» (Г, 2} (2, 2‘): (внутри - внутри)-» (2'} {2". 1}: (внутри - внутри) —ХГ) {1; 2}: (внутри - внутри) -»(2} (2, 2}: (внутри- внутри) -»(2’) (2‘, 2"): (внутри - внутри)-» (2") Рис. 6.27. Обработка набора вершин многоугольника {1, 2, 3} процедурами отсечения по границам с использованием алгоритма Сазерленда-Ходгмана. Набор вершин после отсечения — {1',2, 2',2"} Последняя в цикле процедура отсечения генерирует список вершин, который описы- вает окончательную обрезанную закрашенную область. На рис. 6.27 изображен пример алгоритма Сазерленда-Ходгмана для закрашен- ной области, определенный списком вершин {1,2,3}. Пока процедура отсечения получает пару конечных точек, она определяет соответствующий выход, используя проверки, иллюстрируемые на рис. 6.26. Данные выходы последовательно переда- ются от процедуры отсечения по левой границе процедурам отсечения по правой, нижней и верхней границам. Выход процедуры отсечения по верхней границе пред- ставляет собой набор вершин, определяющих окончательную закрашенную область. В приведенном примере выходной список вершин выглядит как {Iх, 2,2/, 2"}. Последовательная реализация алгоритма отсечения многоугольников Сазерленда- Ходгмана демонстрируется в следующем наборе процедур. Входной набор вершин преобразуется в выходной путем применения процедур отсечения слева, справа, сни- зу и сверху.
482 Глава 6. Двухмерное наблюдение typedef enum { Left, Right, Bottom, Top } Boundary; const GLint nClip = 4; GLint inside (wcPt2D p, Boundary b, wcPt2D wMin, wcPt2D wMax) { switch (b) { case Left: if (p.x < c wMin.x) return (false); break; case Right: if (p.x : > wMax.x) return (false); break; case Bottom: if (Р-У < c wMin.y) return (false); break; case Top: if (Р-У ' > wMax.y) return (false); break; } return (true); } GLint cross (wcPt2D pl, wcPt2D p2, Boundary winEdge, wcPt2D wMin, wcPt2D wMax) { if (inside (pl, winEdge, wMin, wMax) == inside (p2, winEdge, wMin, wMax)) return (false); else return (true); } wcPt2D intersect (wcPt2D pl, wcPt2D p2, Boundary winEdge, wcPt2D wMin, wcPt2D wMax) ( wcPt2D iPt; GLfloat m; if (pl.x != p2.x) m = (pl.y - p2.y) I (pl.x - p2.x); switch (winEdge) { case Left: iPt.x = wMin.x; iPt.y = p2.y + (wMin.x - p2.x) * m; break; case Right: iPt.x = wMax.x; iPt.y = p2.y + (wMax.x - p2.x) * m; break; case Bottom: iPt.y = wMin.y; if (pl.x != p2.x) iPt.x = p2.x + (wMin.y - p2.y) / m; else iPt.x = p2.x; break; case Top: iPt.y = wMax.y; if (pl.x != p2.x) iPt.x = p2.x + (wMax.y - p2.y) I m; else iPt.x = p2.x; break; } return (iPt) ; }
6.8. Отсечение многоугольной закрашенной области 483 void clipPoint (wcPt2D р, Boundary winEdge, wcPt2D wMin, wcPt2D wMax, wcPt2D * pOut, int * ent, wcPt2D * first[], wcPt2D * s) { wcPt2D iPt; /* Если для данной границы отсечения не существует * предыдущей точки, записывается текущая точка. */ if (!first[winEdge]) first[winEdge] = &p; else /* Предыдущая точка существует. Если отрезок, соединяющий р * и предыдущую точку, пересекает данную границу отсечения, * находится точка пересечения. Если еще есть границы, * отсечение по которым не выполнялось, провести отсечение * по ним. Если границ отсечения больше нет, точки пересечения * добавляются в выходной список. */ if (cross (р, s[winEdge], winEdge, wMin, wMax)) { iPt = intersect (p, s[winEdge], winEdge, wMin, wMax); if (winEdge < Top) clipPoint (iPt, b+1, wMin, wMax, pOut, ent, first, s); else { pOut[*cnt] = iPt; (*cnt)++; } } /* Для данной границы отсечения записать р как новую * точку. */ s[winEdge] = р; /* Если точка внутренняя, перейти к следующей необработанной * границе (если такие остались). */ if (inside (р, winEdge, wMin, wMax)) if (winEdge < Top) clipPoint (p, winEdge + 1, wMin, wMax, pOut, ent, first, s); else { pOut[*cnt] = p; (*cnt)++; } }
484 Глава 6. Двухмерное наблюдение void closeclip (wcPt2D wMin, wcPt2D wMax, wcPt2D * pOut, GLint * ent, wcPt2D * first [ ], wcPt2D * s) { wcPt2D pt; Boundary winEdge; for (winEdge = Left; winEdge <= Top; winEdge++) { if (cross (s[winEdge], *first[winEdge], winEdge, wMin, wMax)) { pt = intersect (s[winEdge], *first[winEdge], winEdge, wMin, wMax); if (winEdge < Top) clipPoint (pt, winEdge + 1, wMin, wMax, pOut, ent, first, s); else { pOut[*cnt] = pt; (*cnt)++; } } } } GLint polygonClipSuthHodg (wcPt2D wMin, wcPt2D wMax, GLint n, wcPt2D * pin, wcPt2D * pOut) { /* Параметр "first" содержит указатель на первую точку, * обработанную для границы; "s" содержит последнюю * точку, обработанную с данной границей. * / wcPt2D * first[nClip] = 0, 0, 0, 0 , s[nClip]; GLint k, ent = 0; for (k = 0; k < n; k++) clipPoint (pln[k], Left, wMin, wMax, pOut, &cnt, first, s); closeClip (wMin, wMax, pOut, &cnt, first, s); return (ent); } Если с помощью алгоритма Сазерленда-Ходгмана обрабатывается вогнутый мно- гоугольник, на экран могут выводиться посторонние линии. Пример такой ситуации приведен на рис. 6.28. Это происходит, когда обработанный многоугольник должен иметь несколько отдельных участков, но, поскольку существует только один выход- ной список вершин, последняя вершина списка всегда соединяется с первой. Для корректного отсечения вогнутых многоугольников можно предпринять неко- торые действия. Во-первых, вогнутый многоугольник можно расщепить на несколько выпуклых (раздел 3.15) и обработать каждый полученный многоугольник отдельно с использованием алгоритма Сазерленда-Ходгмана. Во-вторых, можно модифициро- вать этот алгоритм, чтобы конечный набор вершин проверялся на наличие нескольких точек пересечения вдоль границы отсекающего окна. Если обнаружено более двух
6.8. Отсечение многоугольной закрашенной области 485 Рис. 6.28. Отсечение вогнутого многоугольника (па- нель а) с использованием алгоритма Сазерленда- 6) Ходгмана дает две связанные области (панель б) вершин вдоль границы отсечения, данный список можно разделить на несколько списков, верно идентифицирующих участки обрезанной закрашенной области. Это может требовать досконального анализа, выявляющего, точки вдоль границы отсече- ния образуют пары или являются отдельными вершинами конечного многоугольника. В-третьих, можно использовать более общую процедуру отсечения многоугольников, разработанную для корректной обработки вогнутых многоугольников. АЛГОРИТМ ОТСЕЧЕНИЯ МНОГОУГОЛЬНИКОВ УЭЙЛЕРА-АЗЕРТОНА (WEILER-ATHERTON) Данный алгоритм — это общий подход к отсечению многоугольников, который можно использовать для отсечения закрашенной области выпуклого или вогнутого много- угольника. Более того, этот метод разрабатывался как средство идентификации види- мых поверхностей трехмерной сцены. Следовательно, его также можно использовать для отсечения любой многоугольной области с помощью окна произвольной много- угольной формы. Вместо того чтобы просто отсечь стороны закрашенной области, как в мето- де Сазерленда-Ходгмана, алгоритм Уэйлера-Азертона обрабатывает периметр закра- шенной области и находит границы, замыкающие отсеченную закрашенную область. Таким образом, несколько закрашенных областей (см. рис. 6.28, б) можно иденти- фицировать и отобразить как отдельные, несвязанные многоугольники. Чтобы найти стороны отсеченной многоугольной области, проходится путь (по часовой стрелке или против нее) вокруг закрашенной области, который обходит границу отсекающего окна там, где сторона многоугольника выходит из данного периметра. Направле- ние обхода границы отсекающего окна совпадает с направлением обработки сторон многоугольника. Обычно можно определить, каким является направление обработки — по часовой стрелке или против нее — упорядоченного списка вершин, определяющего много- угольную закрашенную область. В большинстве случаев список вершин задается про- тив часовой стрелки, как в правиле определения передней грани многоугольника. Сле-
486 Глава 6. Двухмерное наблюдение довательно, векторное произведение векторов двух последовательных сторон, фор- мирующих выпуклый угол, определяет направление вектора нормали — направление от задней грани многоугольника к передней. Если упорядочение вершин неизвестно, вектор нормали можно либо вычислить, либо воспользоваться любым методом, рас- смотренным в разделе 3.15 для определения внутренней части закрашенной области. Затем, если последовательно обрабатывать края так, чтобы внутренняя часть много- угольника всегда находилась слева, получим обход против часовой стрелки. В против- ном случае, оставляя внутреннюю часть справа, получим обход по часовой стрелке. При обходе вершин многоугольника против часовой стрелки применяются сле- дующие процедуры Уэйлера-Азертона. 1. Обрабатывать стороны многоугольной закрашенной области в направлении про- тив часовой стрелки, пока для одной из границ отсечения не встретится пара “внутренняя-внешняя вершина”; т.е. первая вершина стороны многоугольника находится внутри обрабатываемой области, а вторая — вне ее. 2. Проходить границы окна в направлении против часовой стрелки от выходной точки пересечения до другой точки пересечения с многоугольником. Если это — ранее обработанная точка, следует перейти к следующему этапу. Если это — новая точка пересечения, обработка сторон многоугольника продолжается в по- рядке против часовой стрелки, пока не встретится ранее обработанная вершина. 3. Для данного участка обрабатываемой закрашенной области сформировать спи- сок вершин. 4. Вернуться к точке пересечения-выхода и продолжать обработку сторон много- угольника против часовой стрелки. На рис. 6.29 иллюстрируется отсечение вогнутого многоугольника по Уэйлеру- Азертону с помощью стандартного окна отсечения для обхода сторон многоугольника против часовой стрелки. При обходе сторон по часовой стрелке обход окна отсечения удобно выполнять аналогично. Если начать с вершины 1 на рис. 6.29, а, то против часовой стрелки следу- ющей обрабатываемой вершиной будет вершина 2. Следовательно, данная сторона существует на верхней границе отсекающего окна. Эта точка 1/ вычисляется, а за- тем выполняется левый поворот для обработки границ окна против часовой стрелки. Обрабатывая верхнюю границу отсекающего окна, мы не пересекаем сторону мно- гоугольника, пока не дойдем до левой границы окна. Таким образом, эта вершина помечается 1", и мы следуем по левой границе до точки пересечения lw. Затем мы следуем по этой стороне против часовой стрелки, возвращаясь к вершине 1. Этим мы завершаем обход границ окна, и список вершин {1,1/, 1", 1"') определяет обработан- ную область исходной закрашенной области. Обработка сторон многоугольника затем возобновляется в точке 1'. Сторона, определенная точками 2 и 3, выходит из левой границы, но точки 2 и 2' находятся над верхней стороной отсекающего окна, а точки
6.8. Отсечение многоугольной закрашенной области 487 Рис. 6.29. Вогнутый многоугольник (панель а), определенный списком вершин {1,2,3,4,5, 6}, при вырезании с использованием алгоритма Уэйлера-Азертона дает два списка {1,1', 1", 1"'} и {4', 5,5'}, представляющих два отдельных закрашенных много- угольника (панель б) 2' и 3 — слева от отсекаемой области. Кроме того, сторона с конечными точками 3 и 4 расположена снаружи левой границы отсечения. Однако следующая сторона (от точки 4 до точки 5) снова входит в извлекаемую область, и нужно обработать точку пересечения 4'. Кроме того, сторона с концами 5 и 6 выходит из окна в точке 5', поэтому мы обходим снизу левую границу отсечения и получаем замкнутый список вершин {4', 5, 5'}- Мы продолжаем обработку сторон многоугольника в точке 5', что возвращает нас к ранее обработанной точке 1"'. В этой точке все вершины и стороны многоугольника обработаны, так что вся закрашенная область полностью извлечена. ОБРАБОТКА МНОГОУГОЛЬНИКОВ С ИСПОЛЬЗОВАНИЕМ НЕПРЯМОУГОЛЬНЫХ ОТСЕКАЮЩИХ ОКОН Алгоритм Лианга-Барски и другие параметрические методы отсечения линий особен- но хорошо подходят для обработки многоугольных закрашенных областей с помощью отсекающих окон в форме выпуклых многоугольников. В этом подходе используется параметрическое представление сторон закрашенной области и отсекающего окна, и оба многоугольника представляются списком вершин. Вначале сравниваются поло- жения прямоугольников, ограничивающих закрашенную область и отсекающий мно- гоугольник. Если закрашенную область невозможно назвать полностью внешней по отношению к отсекающему многоугольнику, можно использовать проверки “внутри- снаружи” для обработки параметрических уравнений сторон. После проверки всех областей решаются системы параметрических уравнений линий, и определяются точ- ки пересечения с окном.
488 Глава 6. Двухмерное наблюдение Рис. 6.30. Обработка многоугольной закрашен- ной области отсекающим окном в форме вогну- того многоугольника с использованием алгоритма У эйлера-Азерто на Любую многоугольную область можно также обработать любым отсекающим ок- ном в форме многоугольника (выпуклого или вогнутого), как показано на рис. 6.30, используя схему обхода сторон (алгоритм Уэйлера-Азертона). В этом случае необхо- димо поддерживать для отсекающего окна и многоугольной области списки вершин, упорядоченные против часовой стрелки или по ней. Кроме того, нужно применить проверки “внутри-снаружи”, чтобы определить, находится вершина закрашенной об- ласти внутри или снаружи определенной границы отсекающего окна. Как и в преды- дущем примере, границы окна прослеживаются, и определяется, где сторона закра- шенной области выходит из отсекающей границы. Данный метод отсечения можно также использовать, если закрашенная область или отсекающее окно содержит от- верстия, определенные многоугольными границами. Кроме того, данный базовый подход в конструктивной блочной геометрии используется для определения объеди- нения, пересечения или разности двух многоугольников. Фактически вычисление от- резанной области закрашенной фигуры равнозначно определению пересечения двух плоских областей. ОБРАБОТКА МНОГОУГОЛЬНИКА С ИСПОЛЬЗОВАНИЕМ ОТСЕКАЮЩИХ ОКОН С НЕЛИНЕЙНЫМИ ГРАНИЦАМИ Один метод обработки с помощью отсекающего окна с криволинейными границами заключается в аппроксимации границ прямыми отрезками и использовании одного из алгоритмов отсечения с помощью многоугольного окна. В качестве альтернати- вы можно использовать те же общие процедуры, что обсуждались для отрезков. Во-первых, можно сравнить координатные границы закрашенной области с коорди- натными границами отсекающего окна. В зависимости от формы отсекающего окна также возможны другие проверки областей, основанные на соображениях симметрии. Для закрашенных областей, которые нельзя однозначно отнести к внутренним или внешним, в конечном итоге потребуется вычислить точки пересечения закрашенной области с окном.
6.9. Отсечение кривых 489 Отсекающее окно Рис. 6.31. Круговая закрашенная область, демонстрирующая квадрант и октант, находящиеся вне границ отсекающего окна До отсечения После отсечения Рис. 6.32. Отсечение круговой закрашенной области 6.9. ОТСЕЧЕНИЕ КРИВЫХ Области с криволинейными границами можно подвергать отсечению, используя ме- тоды, подобные рассмотренным в предыдущих разделах. Если объекты аппрокси- мируются прямыми отрезками, используются методы отсечения многоугольников. В противном случае процедуры отсечения включают нелинейные уравнения, а следо- вательно, требуют больше обработки для объектов с нелинейными границами. Итак, вначале можно сравнить координатные границы объекта с границами от- сечения, определив, можно ли тривиально принять или отклонить объект целиком. Если нет, проверяется симметрия объекта, которую, возможно, удастся использовать в первоначальных проверках принятия-отклонения. Например, окружности имеют симметричные квадранты и октанты, так что можно проверять координатные гра- ницы этих отдельных секторов окружности. Всю круговую область, показанную на рис. 6.31, нельзя отклонить полностью, просто проверив ее общие координатные гра- ницы. Однако половина окружности находится вне правой границы отсечения (или вне верхней границы), левый верхний квадрант расположен над верхней границей отсечения, подобным образом можно устранить оставшиеся два октанта.
490 Глава 6. Двухмерное наблюдение Расчет точек пересечения включает подстановку точки на границе отсечения (a?wmin, xwmax, ywmin или ywmax) в нелинейное уравнение границы объекта и вы- числение значения другой координаты. После того как все точки пересечения будут вычислены, положение определяющих точек объекта можно записать для дальней- шего использования в процедурах закрашивания по строкам развертки. На рис. 6.32 иллюстрируется окружность, обрезаемая прямоугольным окном. В данном примере радиус окружности и конечные точки отсекаемой дуги можно применить для закра- шивания вырезанной области. Подобные процедуры можно применить при обработке криволинейного объекта отсекающим многоугольником. При первом проходе алгоритма можно сравнить гра- ничный прямоугольник объекта с граничным прямоугольником отсекающей области. Если это не позволит полностью записать или удалить объект, далее решается си- стема уравнений кривых, из которой определяются точки пересечения с отсекающей фигурой. 6.10. ОТСЕЧЕНИЕ ТЕКСТА Существует несколько методов, которые можно использовать для отсечения текста в графическом пакете. В определенном приложении выбор метода отсечения зависит от того, как генерируются символы, и какие требования наложены на отображение строк символов на экране. Простейший метод обработки строк символов отсекающим окном заключается в использовании стратегии все или ничего, показанной на рис. 6.33. Если все строки находятся внутри отсекающего окна, отображается вся строка. В противном случае все строка удаляется. Данная процедура реализуется путем изучения координатных границ строки текста. Если координатные границы ограничивающего прямоугольника не входят полностью в отсекающее окно, строка отклоняется. Альтернативой является использование стратегии отсечения символов по прин- ципу “все или ничего ”. Здесь удаляются только те символы, которые не входят полно- стью в отсекающее окно (рис. 6.34). В этом случае координатные границы отдельных символов сравниваются с границами окна. Любой символ, не входящий полностью в отсекающее окно, удаляется. Третий подход к отсечению текста состоит в отсечении компонентов отдельных символов. Это позволяет наиболее точно отразить строки символов после отсечения, но требует больше всего обработки. Символы — это не совсем то же, что линии или многоугольники. Если отдельный символ накладывается на отсекающее окно, отсе- каются только части символа, находящиеся вне окна (рис. 6.35). Символы эскизных шрифтов, определенные отрезками, обрабатываются подобным способом с исполь- зованием алгоритмов отсечения многоугольников. Обработка растровых символов заключается в сравнении относительных положений отдельных пикселей в точечных изображениях символов с границами отсекающей области.
6.11. Резюме 491 После отсечения После отсечения После отсечения Рис. 6.33. Отсечение тек- Рис. 6.34. Отсечение тек- ста с использованием ко- ординатных границ строки ста с использованием прямо- угольников, ограничивающих Рис. 6.35. Отсечение текста, выполненное для компонентов целиком отдельные символы строки отдельных символов 6.11. РЕЗЮМЕ Двухмерный конвейер преобразования наблюдения — это набор операций, приво- дящих к выводу на экран изображения во внешних координатах, определенного на плоскости ху. Построенную сцену можно отобразить в систему координат наблюде- ния, а затем — в нормированную систему координат, где можно применять процедуры отсечения. Наконец, сцена преобразовывается в координаты устройства для вывода на экран. Нормированные координаты можно задать в диапазоне от 0 до 1 или в диапа- зоне от —1 до 1, и они нужны для того, чтобы графические пакеты были независимы от требований устройств вывода. Часть сцены для отображения на устройстве вывода выбирается с использо- ванием отсекающего окна, которое можно описать во внешней системе координат или в системе координат наблюдения, определенной относительно внешних коорди- нат. Содержимое отсекающего окна передается полю просмотра для отображения на устройства вывода. В некоторых системах поле просмотра задается в нормирован- ных координатах. Другие системы задают поле просмотра в координатах устройства. Обычно отсекающее окно и поле просмотра — это прямоугольники, стороны которых параллельны координатным осям. Объект отображается в поле просмотра так, что он имеет то же относительное положение в поле просмотра, которое у него было в отсе- кающем окне. Чтобы сохранить относительные пропорции объекта, поле просмотра должно иметь то же самое характеристическое отношение, что и соответствующее
492 Глава 6. Двухмерное наблюдение отсекающее окно. Кроме того, для сцены можно задавать любое число отсекающих окон и полей просмотра. Алгоритмы отсечения обычно реализуются в нормированных координатах, так что все геометрические преобразования и операции наблюдения, независимые от координат устройства, можно объединить в одну матрицу преобразования. Когда поле просмотра задается в координатах устройства, двухмерную сцену можно обрезать с помощью симметричного квадрата, нормированные координаты которого меняются от — 1 до 1, а затем передать содержимое нормированного симметричного квадрата в поле просмотра. Все графические пакеты имеют процедуры для отсечения прямых отрезков и прямоугольных закрашенных областей. Пакеты, содержащие функции задания от- дельных точек или текстовых строк, также содержат процедуры отсечения этих гра- фических примитивов. Поскольку расчет точек пересечения является ресурсоемким процессом, разработка улучшенных алгоритмов отсечения является важной областью в сфере компьютерной графики. Кохен и Сазерленд разработали алгоритм отсечения линий, который использует код области для определения положения конечной точки линии относительно границ отсекающего окна. Коды областей конечных точек поз- воляют быстро определить те линии, которые полностью лежат внутри отсекающего окна, и некоторые линии, которые полностью находятся снаружи. Для оставшихся линий нужно вычислить точки пересечения с границами окна. Лианг и Барский раз- работали более быстрый алгоритм отсечения линий, в котором отрезки представлены параметрическими уравнениями, подобными алгоритму Кируса-Бека. Данный под- ход позволяет выполнить больше проверок перед обработкой с целью расчета точек пересечения. Наконец, алгоритм Николла-Ли-Николла еще больше сокращает расче- ты точек пересечения за счет использованиия более интенсивной проверки областей на плоскости ху. Параметрические методы отсечения линий легко расширяются на вогнутые отсекающие окна и трехмерные сцены. В то же время, алгоритм Николла- Ли-Николла применим только к двухмерным отрезкам. Существуют также алгоритмы отсечения прямых отрезков с помощью вогнутых многоугольных окон. Один подход к этой задаче заключается в расщеплении во- гнутого многоугольного отсекающего окна на набор выпуклых многоугольников и применении методов параметрического отсечения линий. Другой подход — добавить стороны к вогнутому окну и преобразовать его в выпуклую форму. Затем можно вы- полнить ряд внутренних и внешних операций отсечения, в ходе которых находится извлекаемый отрезок. Хотя отсекающие окна с криволинейными границами используются редко, можно разработать соответствующие методы отсечения линий, однако теперь вычисление точек пересечения будет включать решение нелинейных уравнений.
6.11. Резюме 493 Закрашенная многоугольная область определяется списком вершин, а процеду- ры отсечения многоугольников должны содержать информацию о том, как извле- ченные стороны соединяются при передаче многоугольника по различным этапам обработки. В алгоритме Сазерленда-Ходгмана пары вершин закрашенной области последовательно обрабатываются всеми процедурами отрезания по границе обработ- ки, и информация по данной стороне немедленно передается следующей процедуре отсечения, что позволяет параллельно выполнять четыре процедуры обработки (от- сечение слева, справа, снизу и сверху). Данный алгоритм является эффективным методом отсечения закрашенных областей в виде вогнутых многоугольников. Од- нако, если обрезаемый вогнутый многоугольник содержит несвязанные области, ал- горитм Сазерленда-Ходгмана дает посторонние соединяющие отрезки. Расширения процедур параметрического отсечения, таких как метод Лианга-Барски, также могут использоваться для отсечения выпуклых закрашенных областей. Алгоритм Уэйлера- Азертона, в котором применяется обход границы, позволяет корректно обрабатывать как выпуклые, так и вогнутые закрашенные области. Закрашенные области можно обрабатывать отсекающими выпуклыми окнами, ис- пользуя расширение схемы параметрического представления прямых. Кроме того, ме- тод Уэйлера-Азертона позволяет обрабатывать любую многоугольную закрашенную область, используя любое отсекающее окно в форме многоугольника. Закрашенные области можно вырезать и окнами с нелинейными границами, используя аппроксима- цию многоугольниками или обрабатывая закрашенные области отсекающими окнами с криволинейными границами. Самым быстрым методом отсечения текста является стратегия “все или ничего”, которая полностью отсекает строку текста, если любая часть строки находится вне границы отсекающего окна. Строку текста можно также обработать, удалив только те символы строки, которые не находятся полностью в отсекающем окне. Наконец, са- мым точным методом отсечения текста является применение схемы отсечения точек, линий, многоугольников или кривых к отдельным символам строки в зависимости от того, определены символы как точечные изображения или эскизные шрифты. Хотя OpenGL предназначен для трехмерных приложений, существует двухмер- ная функция GLU, задающая стандартное прямоугольное отсекающее окно во внеш- них координатах. В OpenGL координаты отсекающего окна являются параметрами проективного преобразования. Следовательно, вначале необходимо вызвать режим матрицы проектирования. Затем можно задать поле просмотра, используя функции стандартной библиотеки OpenGL, и окно на экране, используя функции GLUT. Суще- ствует множество функций GLUT, позволяющих настраивать различные параметры окна на экране. В табл. 6.1 приведено резюме по функциям двухмерного наблюде- ния OpenGL. Кроме того, в таблице перечислены некоторые функции, связанные с наблюдением.
494 Глава 6. Двухмерное наблюдение ТАБЛИЦА 6.1. Резюме по функциям OpenGL двухмерного наблюдения Функция Описание glu0rtho2D Задает координаты отсекающего окна как параметры двухмерной ортогональной проекции glViewport Задает параметры поля просмотра в экранных координатах glGetlntegerv Использует аргументы GL_VIEWPORT и vpArray для получения параметров текущего активного поля просмотра glutlnit Инициализирует библиотеку GLUT glutlnitWindowPosition Задает координаты левого верхнего угла окна на экране glutlnitWindowSize glutCreateWindow Задает ширину и высоту окна на экране Создает окно на экране (которому присваивается це- лочисленный идентификатор) и задает название окна на экране glutInitDisplayMode Выбирает параметры, такие как режим буферизации и цвета для окна на экране glClearColor Задает RGB-цвет фона окна на экране glClearlndex Задает фоновый цвет окна на экране с использовани- ем режима индексации glutDestroyWindow Задает число — идентификатор удаляемого окна glutSetWindow Задает число — идентификатор текущего окна glutPositionWindow Обновляет положение на экране текущего окна glutReshapeWindow Обновляет ширину и высоту текущего окна на экране glutFullScreen Устанавливает размер текущего окна равным размеру экрана glutReshapeFunc Задает функцию, вызываемую при изменении разме- ра окна glutlconifyWindow Превращает текущее окно в пиктограмму glutSetlconTitle Задает метку для пиктограммы окна glutSetWindowTitle Задает новое название текущего окна
Упражнения 495 Окончание табл. 6.1 Функция Описание glutPopWindow Перемещает текущее окно “наверх”; т.е. ставит его перед всеми остальными окнами glutPushWindow Перемещает текущее окно “вниз”; т.е. располагает его по- зади всех остальных окон glutShowWindow Возвращает текущее окно на экран glutCreateSubWindow Создает окно второго уровня в данном окне glutSetCursor Определяет форму курсора экрана glutDisplayFunc Вызывает функцию создания изображения в текущем окне glutPostRedisplay Обновляет содержимое текущего окна glutMainLoop Выполняет программу компьютерной графики glutldleFunc Задает функцию, выполняемую, когда система не выпол- няет никаких действий glutGet Запрашивает систему о заданном параметре состояния I ЛИТЕРАТУРА Алгоритмы отсечения линий обсуждаются в работах [73, 191, 231, 335]. Методы повышения ско- рости алгоритма отсечения линий Коэна-Сазерленда представлены в статье [86]. Стандартные методы отсечения многоугольниками описаны в публикациях [190, 343]. Общие мето- ды отсечения многоугольников произвольной формы многоугольными окнами произвольной формы представлены в работах [380, 381]. Операции наблюдения OpenGL обсуждаются в руководстве [400]. Процедуры окон GLUT рас- смотрены в книге [174], а дополнительную информацию по GLUT можно найти на Web-сайте http: //reality. sgi . com/opengl/glut3/glut3 . html. УПРАЖНЕНИЯ 6.1. Напишите процедуру расчета элементов матрицы (6.1) для преобразования двухмерных внешних координат в координаты наблюдения для данного начала системы координат на- блюдения Рц и вектора верха V. 6.2. Выведите матрицу (6.8) перевода содержимого отсекающего окна в поле просмотра через масштабирование окна до размера поля с последующей трансляцией масштабированного окна в положение поля. В качестве опорной точки при масштабировании и трансляции используйте центр отсекающего окна.
496 Глава 6. Двухмерное наблюдение 6.3. Напишите процедуру расчета элементов матрицы (6.9), переводящей отсекающее окно в симметричный нормированный квадрат. 6.4. Напишите ряд процедур для реализации двухмерного конвейера наблюдения без операций отсечения. Программа должна разрешать построение сцены с помощью преобразований в модельных координатах, задание системы наблюдения и преобразование в симметричный нормированный квадрат. Можно дополнительно реализовать таблицу наблюдения для хра- нения различных наборов параметров преобразования наблюдения. 6.5. Напишите полную программу с реализацией алгоритма отсечения линий Коэна-Сазерленда. 6.6. Подробно обсудите связь различных проверок и методов расчета параметров пересечения UI и «2 в алгоритме отсечения линий Лианга-Барски. 6.7. Сравните число арифметических операций в алгоритмах Коэна-Сазерленда и Лианга- Барски для нескольких различных ориентаций линии относительно отсекающего окна. 6.8. Напишите полную программу реализации алгоритма отсечения линий Лианга-Барски. 6.9. Выведите преобразования симметрии, с помощью которых расчет точки пересечения в трех областях, показанных на рис. 6.16, можно перевести в другие шесть областей плоскости ху. 6.10. Разработайте схему алгоритма Николла-Ли-Николла для любой входной пары конечных точек. 6.11. Сравните число арифметических операций в алгоритме НЛН с вычислительной сложностью алгоритмов Коэна-Сазерленда и Лианга-Барски для нескольких различных ориентаций ли- нии относительно отсекающего окна. 6.12. Примените алгоритм Лианга-Барски к отсечению многоугольников. 6.13. Задайте подробную схему отсечения многоугольников по Уэйлеру-Азертону, предполагая, что отсекающее окно — прямоугольник стандартной ориентации. 6.14. Разработайте алгоритм обработки многоугольников по Уэйлеру-Азертону, где отсекающее окно может быть любым выпуклым многоугольником. 6.15. Разработайте алгоритм обработки многоугольников по Уэйлеру-Азертону, где отсекающее окно может быть любым заданным многоугольником (выпуклым или вогнутым). 6.16. Напишите процедуру отсечения эллипса стандартной ориентации прямоугольным окном. 6.17. Предполагая, что все символы строки текста имеют одинаковую ширину, разработайте ал- горитм отсечения текста согласно стратегии отсечения символов по принципу “все или ничего”. 6.18. Придумайте алгоритм обработки текста, отсекающий отдельные символы, предполагая, что символы определены пиксельной сеткой заданного размера.
ГЛАВА Трехмерное наблюдение Храм Луксора. Кадр из фильма производства Е & S Digital Theater, в котором использованы методы трехмерного наблюдения и компьютерной анимации в реальном времени (перепечатано с разрешения Evans & Sutherland)
Обзор концепций трехмерного наблюдения 7.2. 7.3. Трехмерный конвейер наблюдения Параметры трехмерной системы наблюдения Преобразование из внешних координат в 7.5. 7.6. 7.7. координаты наблюдения Преобразования проектирования Ортогональные проекции Косоугольные параллельные проекции 7.8. Перспективные проекции 7.9. Преобразование поля просмотра и трехмерные экранные координаты 7.10. Функции трехмерного наблюдения OpenGL 7.11. Трехмерные алгоритмы отсечения 7.12. Дополнительные плоскости отсечения в OpenGL 7.13. Резюме В двухмерных графических приложениях операции наблюдения переводят точку в глобальной системе координат в пиксель на плоскости устрой- ства вывода. Используя прямоугольные границы окна отсечения и окна просмотра, пакеты двухмерной графики усекают сцену и отображают координаты устройства. Трехмерные операции наблюдения, однако, сложнее, поскольку теперь есть несколько альтернатив построения сцены и получения ее про- екции на устройства вывода. 7.1. ОБЗОР КОНЦЕПЦИЙ ТРЕХМЕРНОГО НАБЛЮДЕНИЯ При моделировании трехмерной сцены каждый объект обычно определяется набо- ром поверхностей, формирующих замкнутый контур вокруг внутренней части объ- екта. Кроме того, в некоторых приложениях может потребоваться задать информа- цию о внутренней структуре объекта. Помимо процедур, генерирующих проекции поверхностных деталей объекта, в графических пакетах иногда есть процедуры вы- вода на экран внутренних компонентов или поперечных сечений объемного объекта. Функции наблюдения обрабатывают описания объекта с помощью набора процедур, которые в конечном счете проецируют объекты на заданную поверхность дисплея. Множество таких процессов в трехмерном наблюдении, как процедуры отсечения, подобны аналогам в двухмерном “конвейере наблюдения”. Однако трехмерное на-
500 Глава 7. Трехмерное наблюдение _______Плоскость "проекции Рис. 7.1. Система координат, в которой формируется выбранная ЕЦЖру проекция трехмерной сцены блюдение включает несколько задач, которые отсутствуют в двухмерном. Например, дополнительно требуются процедуры проектирования, переводящие сцены в проек- цию на плоской поверхности; нужно определять видимые части сцены; кроме того, чтобы изображение было реалистичным, нужно учитывать эффекты освещения и характеристики поверхностей. НАБЛЮДЕНИЕ ТРЕХМЕРНОЙ СЦЕНЫ Чтобы получить изображение трехмерной сцены, определенной во внешних коор- динатах, вначале задается система наблюдения, или параметры “камеры”. Данная система координат определяет положение и ориентацию плоскости наблюдения (или плоскости проекции), соответствующей плоскости пленки камеры (рис. 7.1). Затем описания объектов переводятся в координаты системы наблюдения и проецируются на плоскость наблюдения. Проекцию объекта на устройстве вывода можно сгенери- ровать в каркасной (контурной) форме, как показано на рис. 7.2, или можно приме- нить методы создания эффектов освещения и визуализации поверхностей и получить реалистичное затенение видимых поверхностей. ПРОЕКЦИИ В отличие от изображения, даваемого камерой, проекцию сцены на плоскость наблю- дения можно выполнять разными способами. Один метод получения описания тела на плоскости наблюдения заключается в проектировании точек поверхности объек- та вдоль параллельных линий. Данная схема, называемая параллельной проекцией, используется в инженерных и архитектурных чертежах для представления объекта набором проекций, на которых показаны точные размеры объекта (рис. 7.3). Другой метод получения проекции трехмерной сцены — это спроектировать точ- ки на плоскость наблюдения по сходящимся траекториям. При данном процессе, именуемом перспективной проекцией, объекты, расположенные дальше от точки на- блюдения, получаются меньшими, чем объекты такого же размера, но расположенные ближе. Сцена, генерируемая с использованием перспективной проекции, выглядит бо- лее реалистично, поскольку именно так формируют изображение наши глаза и линзы
7.1. Обзор концепций трехмерного наблюдения 501 Рис. 7.2. Каркасное изображение трех объ- ектов, задние линии которых удалены. Изображение взято из коммерческой базы форм объектов, где каждый объект опре- делен как трехмерная сетка координатных точек, и его можно отобразить либо как каркасную форму, либо как тело с визуали- зированной поверхностью (перепечатано с разрешения Viewpoint DataLabs) Вид сверху Вид сбоку Вид спереди Рис. 7.3. Три параллельные проекции объекта, из которых видны относительные пропор- ции с различных точек наб- людения камер. На перспективной проекции, показанной на рис. 7.4, параллельные линии, идущие вдоль направления наблюдения, кажутся сходящимися в отдаленную точку фона, а самолеты на заднем плане кажутся меньше взлетающего самолета, располо- женного на переднем плане. УПОРЯДОЧЕНИЕ ПО ГЛУБИНЕ Исключая некоторые ситуации, информация о глубине на трехмерной сцене важна, поэтому для конкретного направления наблюдения можно легко определить, что яв- ляется передней, а что — задней частью любого изображенного объекта. На рис. 7.5 иллюстрируется неоднозначность, которая может возникнуть, если объект изображен без учета информации о глубине. Существует несколько способов, с помощью кото- рых информация о глубине включается в двухмерное представление объемных тел. Предоставить информацию о глубине на каркасных изображениях просто — нуж- но проварьировать яркость отрезков согласно их расстоянию от точки наблюдения. На рис. 7.6 показан каркасный объект с упорядочением по глубине (depth cueing). Линии, ближайшие к точке наблюдения, отображаются более ярко, а линии, удален-
502 Глава 7. Трехмерное наблюдение Рис. 7.4. Перспектив- ная проекция аэропорта (перепечатано с разре- шения Evans & Suther- land) ные от точки наблюдения, — более тускло. В данной схеме упорядочения по глубине выбираются максимальная и минимальная интенсивности и диапазон расстояний, в котором меняется интенсивность. Упорядочение по глубине используется также в моделировании влияния атмо- сферы на наблюдаемую интенсивность объектов. Более удаленные объекты кажутся тусклыми по сравнению с ближними из-за рассеяния света частичками пыли, тума- ном и дымом. Некоторые атмосферные эффекты могут даже изменить наблюдаемый цвет объекта, и все эти эффекты можно смоделировать с помощью упорядочения по глубине. ОПРЕДЕЛЕНИЕ ВИДИМЫХ ЛИНИЙ И ПОВЕРХНОСТЕЙ Уточнить связи по глубине на каркасном изображении можно и с помощью других методов. Один способ — просто подсветить видимые линии или изобразить их другим цветом. Другой метод, широко используемый в инженерных чертежах, заключается в изображении невидимых линий пунктиром. Кроме того, невидимые линии можно просто удалить с изображения, как показано на рис. 7.5, бив. Однако при удалении скрытых линий также исчезает информация о форме задних поверхностей объекта, поэтому для того, чтобы показать общий вид объекта (задние и передние грани), обычно используются каркасные представления. Если требуется получить реалистичное изображение сцены, задние части объ- ектов полностью удаляются, и отображаются только видимые поверхности. В этом случае применяются процедуры визуализации поверхностей, и в результате пиксели экрана определяются только цветом передних поверхностей.
7.1. Обзор концепций трехмерного наблюдения 503 6) Рис. 7.5. Каркасное представление пирамиды (панель а) не содержит информации о глубине, с помощью которой можно было бы понять, как наблюдается объект: сверху от вершины (панель б) или снизу от основания (панель в) Рис. 7.6. Каркасный объект изображен с упорядочением по глубине, где яркость линий уменьшается при переходе от передних граней объекта к задним I ВИЗУАЛИЗАЦИЯ ПОВЕРХНОСТЕЙ t Чтобы повысить реалистичность изображений, поверхности объектов визуализиру- | ются с использованием условий освещения сцены и заданных характеристик поверх- । кости. Условия освещенности задаются через цвет и положение источников света, I также можно задать эффекты фонового освещения. Поверхностные свойства объ- |ектов включают степень прозрачности объекта и то, гладкая она или шероховатая. | Задавая параметры, можно моделировать такие поверхности, как стекло, пластик, во- I локно древесины и шероховатая поверхность апельсина. На рис. 7.7 для получения I реалистичной сцены использованы методы визуализации поверхности, перспектив- ное проектирование и определение видимых поверхностей.
504 Глава 7. Трехмерное наблюдение Рис. 7.7. Реалистичное изображение комнаты, полученное с помощью перспективной про- екции, наложения эффектов освещения и вы- бора свойств поверхности (перепечатано с разрешения Джона Снайдера (John Snyder), Джеда Ленгила (Jed Lengyel), Девендры Кал- ры (Devendra Kalra) и Аль Барра (Al Barr), Калифорнийский технологический институт. © 1992, Caltech) РАЗОБРАННЫЙ ВИД И ВИД В РАЗРЕЗЕ Многие графические объекты позволяют определять объекты как иерархические структуры и хранить информацию о внутренних деталях объектов. Изображение таких объектов в разрезе или разобранном состоянии можно использовать для де- монстрации внутренней структуры и связей между частями объектов. На рис. 7.8 показано несколько типов изображений в разобранном виде. Альтернативой разбор- ке объекта на компоненты является вид в разрезе (рис. 7.9), когда часть видимых поверхностей удаляется, чтобы показать внутреннюю структуру предмета. ТРЕХМЕРНОЕ И СТЕРЕОСКОПИЧЕСКОЕ НАБЛЮДЕНИЕ Другие методы повышения реалистичности компьютерной сцены включают исполь- зование трехмерных изображений и стереоскопических проекций. Как отмечалось в главе 2, трехмерные проекции можно получить, отражая растровое изображение от вибрирующего гибкого зеркала. Вибрации зеркала синхронизированы с изображени- ем сцены на ЭЛТ. При вибрации фокусное расстояние меняется так, что каждая точка сцены отражается в пространственное положение, соответствующее ее глубине. Стереоскопические устройства предоставляют две проекции сцены: одну для левого глаза, а другую для правого. Точки наблюдения соответствуют положению глаз наблюдателя. Эти две проекции обычно поочередно отображаются на растровом мониторе. Если смотреть на монитор через специальные очки, которые по очереди затеняют обе линзы синхронно с циклами обновления монитора, можно наблюдать сцену, отображенную с трехмерным эффектом.
7.2. Трехмерный конвейер наблюдения 505 7.2. Рис. 7.8. Полностью визуализированную и собранную турбину (панель а) можно пред- ставить как каркасное изображение в разобранном виде (панель б), изображение в разо- бранном виде с визуализацией поверхностей (панель в) или изображение в разобранном виде с визуализацией поверхностей и цветовым кодированием (панель г) (перепечатано с разрешения Autodesk, Inc.) ТРЕХМЕРНЫЙ КОНВЕЙЕР НАБЛЮДЕНИЯ Процедуры генерации компьютерных проекций трехмерной сцены чем-то похожи на действия фотографа. Прежде всего нужно выбрать точку наблюдения, соответствую- щую месту, где мы расположим камеру. Точка наблюдения выбирается согласно тому, какая проекция сцены требуется: фронтальная, задняя, верхняя или нижняя. Место наблюдения можно также выбрать внутри группы объектов или даже внутри такого Объекта, как здание или молекула. Затем нужно определиться с ориентацией камеры ис. 7.10) — как нам хочется, чтобы камера “смотрела” с точки съемки, и как повер- ть ее вокруг линии наблюдения, чтобы задать “верхнее” положение изображения? (конец, когда мы нажимаем на кнопку, сцена обрезается до размера выбранного секающего окна, которое соответствует апертуре или типу линз камеры, и свет от димых поверхностей проецируется на пленку. Однако следует помнить, что аналогия с камерой справедлива только до опреде- нного момента, поскольку при генерации проекций сцены посредством программы мпьютерной графики нам доступна большая гибкость и выбор из гораздо большего ела альтернатив, чем при использовании реальной камеры. Можно выбирать парал-
506 Гпава 7. Трехмерное наблюдение Рис. 7.9. Изображе- ние двигателя газо- нокосилки в разрезе с цветовым кодирова- нием, на котором вид- на структура и свя- зи внутренних компо- нентов (перепечата- но с разрешения Au- todesk, Inc.) Рис. 7.10. Фотографирование сцены включает выбор поло- жения и ориентации камеры лельную или перспективную проекцию, выборочно удалять часть сцены вдоль линии наблюдения, плоскость проекции можно удалить от положения “камеры”, можно да- же получить изображение объектов, находящихся за нашей “камерой”. Некоторые операции наблюдения трехмерной сцены аналогичны или подобны используемым в двухмерном конвейере наблюдения (раздел 6.1). Для размещения проекции трехмерной сцены на устройстве вывода используется двухмерное поле просмотра, а с помощью двухмерного отсекающего окна выбирается фрагмент, кото- рый будет отображен в поле просмотра. Окно на экране дисплея задается в экранных координатах так же, как в двухмерных приложениях. Отсекающие окна, поля про- смотра и окна на дисплее обычно задаются как прямоугольники, стороны которых параллельны координатным осям. При трехмерном наблюдении, однако, отсекающее окно размещается на выбранной плоскости наблюдения, и сцены отсекаются замыка- ющим объемом пространства, который определяется набором плоскостей отсечения. Точка наблюдения, плоскость наблюдения, отсекающее окно и плоскости отсечения задаются в системе наблюдения.
72. Трехмерный конвейер наблюдения 507 МК t Преобразование I Преобразование I моделирования I наблюдения I —► Преобразование I кп _ НК — Преобразование । ку проектирования I атгаирииа поля просмотра I В О1ССчСпИС I Рис. 7.11. Конвейер общего трехмерного преобразования — из модельных координат во внешние, затем в координаты наблюдения, координаты проекции, нормированные координаты и наконец в координаты устройства На рис. 7.11 представлены общие этапы обработки при создании и преобразова- нии трехмерной сцены в координаты устройства. После того как сцена смоделиро- вана во внешних координатах, выбирается система наблюдения, и описание сцены переводится в координаты наблюдения. Система наблюдения определяет его парамет- ры, включая положение и ориентацию плоскости проекции (плоскости наблюдения), которая аналогична плоскости фотопленки. На плоскости проекции определяется двухмерное отсекающее окно, соответствующее выбранным линзам камер, и уста- навливается трехмерная отсекающая область. Данная область называется объемом наблюдения или отображаемым объемом (view volume), и ее форма и размер зависят от размеров отсекающего окна, выбранного типа проекции и мест ограничения вдоль направления наблюдения. Чтобы преобразовать описание сцены в координатах на- блюдения на плоскость проекции, выполняются операции проектирования. Объекты отображаются в нормированные координаты, и все части сцены вне отображаемого объема отсекаются. Операции отсечения можно применить после всех аппаратно- независимых преобразований координат (из внешних координат в нормированные). Преобразования координат можно сворачивать для максимальной эффективности. Как и в двухмерном наблюдении, границы поля просмотра можно задать в нор- мированных координатах или координатах устройства. При разработке алгоритмов наблюдения предполагалось, что поле просмотра задается в координатах устройства, и что нормированные координаты переводятся в координаты поля просмотра, а за- тем выполняются операции отсечения. Существует еще несколько действий, которые Может потребоваться выполнить, например, идентифицировать видимые поверхно- ги и применить процедуры визуализации поверхностей. Конечным этапом является тображение координат поля просмотра в координаты устройства в выбранном окне а экране дисплея. Описания сцены в координатах устройства иногда выражаются в евосторонней системе координат, и тогда для измерения глубин точек сцены можно спользовать положительные расстояния от экрана.
508 Глава 7. Трехмерное наблюдение Po = <Wo’ *о) Рис. 7.12. Правосторонняя система наблюдения с осями tviow, yvlew и Zvicw, определенными в правосторонней внешней системе координат Рис. 7.13. Ориентация плоскости наблюде- ния и вектора нормали к плоскости наблюде- ния N 7.3. ПАРАМЕТРЫ ТРЕХМЕРНОГО НАБЛЮДЕНИЯ Формирование трехмерной системы наблюдения подобно формированию двухмер- ной, обсуждавшемуся в разделе 6.2. Вначале в качестве начала координат выбирается точка с внешними координатами Ро = (а?о, У о-, zq), которая называется точкой на- блюдения или положением наблюдения. (Иногда точка наблюдения также называется положением глаза или положением камеры.) Затем задается вектор верха изображе- ния V, который определяет направление у view- В трехмерном пространстве также нужно выделить направление одной из двух оставшихся координатных осей. Обычно для этого указывается второй вектор, определяющий ось .zView, причем вдоль этой оси идет направление наблюдения. Расположение трехмерной системы наблюдения во внешней системе координат иллюстрируется на рис. 7.12. ВЕКТОР НОРМАЛИ К ПЛОСКОСТИ НАБЛЮДЕНИЯ Поскольку направление наблюдения обычно выбирается вдоль оси 2-vjew, плоскость наблюдения, также именуемая плоскостью проекции, обычно предполагается пер- пендикулярной этой оси. Следовательно, ориентация плоскости наблюдения, а также положительное направление оси zview можно определить вектором нормали к плос- кости наблюдения N, как показано на рис. 7.13. Дополнительный скалярный параметр используется для установки положения плоскости наблюдения при некотором значении координаты zvp вдоль оси zvjew, как показано на рис. 7.14. Это значение обычно задается как расстояние от начала ко- ординат системы наблюдения по направлению наблюдения (часто это отрицательное
7.3. Параметры трехмерного наблюдения 509 Рис. 7.14. Три возможных положения плоскости на- блюдения ВДОЛЬ ОСИ Zvicw Рис. 7.15. Вектор нормали к плоскости наблюде- ния N задается в направлении от выбранной опор- ной точки Prcf к началу координат системы на- блюдения Ро направление оси zvjew). Таким образом, плоскость наблюдения всегда параллельна плоскости Tview^view, и проекция объектов на плоскость наблюдения соответствует проекции сцены, какой она будет на устройстве вывода. Вектор N можно задавать по-разному. В некоторых графических системах на- правление N определяется вдоль прямой, проходящей через начало внешней системы координат и выбранную точку. В других системах N выбирается в направлении от опорной точки Pref к началу координат Ро, как показано на рис. 7.15. В этом случае опорная точка часто называется точкой взгляда (look-at point), а наблюдение ведется противоположно направлению N. Вектор нормали к плоскости наблюдения, а также направления других векторов можно задать, используя направляющие углы. Существует три угла а, (3 и 7, которые пространственная линия формирует с осями х, у и z соответственно. Однако обычно гораздо проще задать направление вектора двумя точками на сцене, чем направляю- щими углами. ВЕКТОР ВЕРХА Выбрав вектор нормали к плоскости наблюдения N, можно задать направление векто- ра верха (view-up vector) V. Данный вектор используется для задания положительного направления оси у view.
510 Глава 7. Трехмерное наблюдение Рис. 7.16. Входное направление вектора верха V подстраивается к ориентации перпендикулярно вектору нормали к плоскости наблю- дения N Входное Обычно V определяется выбором такой точки относительно начала внешней си- стемы координат, чтобы вектор верха был направлен от начала внешней системы коор- динат к данной выбранной точке. Поскольку вектор нормали к плоскости наблюдения N определяет направление оси zvjew, вектор V должен быть перпендикулярным N. Однако в общем случае может быть сложно определить направление вектора V, точ- но перпендикулярное N. Следовательно, процедуры наблюдения (проектирования) обычно подгоняют заданную пользователем ориентацию вектора V, как показано на рис. 7.16, чтобы вектор V проектировался на плоскость, перпендикулярную вектору нормали к плоскости наблюдения. В качестве вектора верха V можно выбирать любое направление при условии, что оно не параллельно N. Удобным является выбор направления параллельно оси yw внешней системы координат; те. можно положить V = (0,1,0). ЭТАЛОННАЯ СИСТЕМА НАБЛЮДЕНИЯ UVR В графических пакетах иногда используются левосторонние координаты наблюдения, и наблюдение ведется по положительному направлению оси zv\e4/. В левосторонних системах увеличение значений 2view считается удалением от точки наблюдения вдоль линии обзора. Впрочем, правосторонние системы наблюдения более распространены, поскольку они имеют ту же ориентацию, что и внешняя эталонная система коорди- нат. Это позволяет графическому пакету использовать одну ориентацию координат- ных осей при работе со внешней системой координат и системой наблюдения. Хотя в некоторых ранних графических пакетах координаты наблюдения определялись в левосторонней системе координат, современным стандартом компьютерной графи- ки являются правосторонние системы. В то же время левосторонние системы часто используются для представления экранных координат и преобразований нормировки. Поскольку нормаль к плоскости наблюдения N определяет направление оси 2view, а вектор верха V используется для получения направления оси у view, нужно опре- делить только направление оси Sview- Используя входные значения N и V, можно вычислить третий вектор U, перпендикулярный N и V. После этого вектор U опреде- ляет положительное направление оси sview- Правильное направление U выбирается по направлению векторного произведения V и N, чтобы в итоге получалась право- сторонняя система наблюдения. Векторное произведение векторов N и U также дает
7.3. Параметры трехмерного наблюдения 511 Ли» *view Рис. 7.17. Правосторонняя система наблюдения, определенная единич- ными векторами u, v и п значение вектора V, перпендикулярного N и U и идущего по положительному на- правлению оси у view С помощью описанных процедур получаем следующий набор единичных осевых векторов правосторонней системы наблюдения: П = = (Пх, Пу, Пг), _ V X П _ Z X u — |v| — 'Ux’Uy' Uz'J (7-1) V = n X U = (vx, Vy, vz). Система координат, сформированная данными единичными векторами, часто назы- вается эталонной системой наблюдения uvn (рис. 7.17). ГЕНЕРАЦИЯ ЭФФЕКТОВ ТРЕХМЕРНОГО НАБЛЮДЕНИЯ Меняя параметры наблюдения, можно получать различные проекции объектов на сцене. Например, при фиксированной точке наблюдения можно изменить направле- ние вектора N, чтобы отобразить объекты в точках, расположенных вокруг начала системы наблюдения. Кроме того, можно варьировать N и создавать сложное изоб- ражение, состоящее из нескольких проекций, полученных с фиксированной точки расположения камеры. На рис. 7.18 показано широкоугольное изображение, создан- ное для среды виртуальной реальности. Большой угол обзора получен за счет семи проекций сцены при фиксированном положении (но не ориентации!) камеры при ; слегка смещенных направлениях наблюдения; потом эти проекции объединялись в сложное изображение. Подобным образом генерируются стереоскопические проек- ции - с помощью смещения направления наблюдения. В этом случае, однако, также Нужно сместить точку наблюдения, чтобы сымитировать положение двух глаз. В интерактивных приложениях вектор нормали N является параметром наблю- ; Дения, который меняется наиболее часто. Разумеется, при изменении направления N ►также нужно изменить другие векторы осей, чтобы сберечь правостороннюю систему [координат.
512 Глава 7. Трехмерное наблюдение Рис. 7.18. Широкоугольная проекция, создан- ная для дисплея виртуальной реальности с помощью семи участков, каждый из которых получен при несколько измененном направ- лении наблюдения (перепечатано с разреше- ния Национального центра суперкомпьютер- ных приложений, Иллинойский университет в Урбана-Шампейн} Рис. 7.19. Панорамное изображение сцены — положение наблюдения меняется при фикси- рованном направлении N Если требуется сымитировать панорамный эффект при анимации, например, ко- гда камера движется по сцене или следует за объектом, проходящим по сцене, можно зафиксировать направление N и двигать точку наблюдения, как показано на рис. 7.19. Чтобы отобразить различные проекции объекта, например, боковую и фронтальную, можно перемещать точку наблюдения вокруг объекта, как показано на рис. 7.20. Есть и другой способ получения различных проекций объекта или группы объектов — использовать геометрические преобразования, не меняя параметры наблюдения. На рис. 7.21 показан интерфейс, разработанный для интерактивного выбора зна- чений параметров наблюдения. Данный программный пакет включает редактор на- блюдения, возможность выбора нескольких окон на экране дисплея, меню и другие составляющие.
7.3. Параметры трехмерного наблюдения 513 Рис. 7.20. Наблюдение объекта с различных направлений с использованием фиксиро- ванной опорной точки Рис. 7.21. Интерактивный интерфейс для управ- ления параметрами наблюдения, разработанный в Манчестерском университете с использовани- ем PHIGS Toolkit (перепечатано с разрешения Т. Л. Дж. Говарда (Т. L. J. Howard), Дж. Г. Уи- льямса (J. G. Williams) и У. Т. Хьюитта (W. Т. Hewitt), факультет информатики, Манчестер- ский университет, Великобритания)
514 Глава 7. Трехмерное наблюдение 7.4. ПРЕОБРАЗОВАНИЕ ИЗ ВНЕШНИХ КООРДИНАТ В КООРДИНАТЫ НАБЛЮДЕНИЯ В трехмерном конвейере наблюдения первым действием после построения сцены является перенос описаний объектов в систему наблюдения. Это преобразование описаний объектов эквивалентно последовательности преобразований, совмещаю- щих систему наблюдения со внешней системой координат. Данный переход можно выполнить, используя метод преобразований, описанный в разделе 5.15. 1. Транслировать начало системы наблюдения в начало внешней системы координат. 2. С ПОМОЩЬЮ поворотов совместить ОСИ .Tvjew, Uview И Zvjew С ОСЯМИ Xw, yw И Zw внешней системы координат соответственно. Начало системы наблюдения находится в точке с внешними координатами Р = (ж0, Уо, 2о)- Следовательно, матрица трансляции начала системы наблюдения в начало внешней системы координат выглядит так: 10 0 —хо 0 1 0 -уо 0 0 1 — zq ООО 1 (7.2) В преобразовании поворота можно с помощью единичных векторов u, v и п сфор- мировать сложную матрицу поворота, совмещающую оси наблюдения с осями внеш- ней системы координат. Данная матрица преобразования записывается следующим образом: Ux Uy Uz O’ R = vx Vy Vz 0 , (7-3) Пх Пу nz 0 _ 0 0 0 1 где элементы матрицы R — это компоненты осевых векторов uvn. Матрица преобразования координат получается умножением приведенных выше матриц трансляции и поворота: Mire, vc = R • Т = V>x Vy Vz Ч • Ро = Vx Vy VZ -V • P0 Пу nz -n • Ро ООО 1
7.5. Преобразования проектирования 515 Параметры трансляции в этой матрице вычисляются как скалярное произведение еди- ничных векторов u, v и п с Ро, представляющим вектор, идущий из начала внешней системы координат в начало координат системы наблюдения. Другими словами, па- раметры трансляции — это отрицательные проекции вектора Ро на все координатные оси системы наблюдения (отрицательные компоненты вектора Ро в координатах на- блюдения). Данные элементы матрицы вычисляются следующим образом: U • Р0 — XqUx УО^у -V • Ро = -Sofa: - УоУу ~ ZQVz, -П • Ро = ~Х0Пх - уопу - zQnz. (7-5) Матрица (7.4) переводит описания объектов во внешней системе координат в систему наблюдения. ПРЕОБРАЗОВАНИЯ ПРОЕКТИРОВАНИЯ На следующем этапе трехмерного конвейера наблюдения (после преобразования в координаты наблюдения) описания объектов проектируются на плоскость наблюде- ния. Отметим, что, как правило, графические пакеты поддерживают и параллельную, и перспективную проекцию. При параллельной проекции точки переводятся на плоскость наблюдения вдоль параллельных линий. На рис. 7.22 иллюстрируется параллельная проекция отрезка прямой с конечными точками Pi и Р2. Параллельная проекция сохраняет относитель- ные пропорции объектов, и этот метод используется в автоматизированном черчении и проектировании для получения чертежей трехмерных объектов в масштабе. Все параллельные линии сцены остаются такими же на параллельной проекции. Суще- ствует два общих метода получения параллельной проекции объекта: можно проек- тировать вдоль линий, перпендикулярных плоскости наблюдения, или точки можно спроектировать под косым углом к плоскости наблюдения. При перспективной проекции положения объектов преобразуются в координа- ты проекции вдоль линий, сходящихся к точке за плоскостью наблюдения. Пример перспективной проекции отрезка прямой с конечными точками Pi и Р2 приведен на рис. 7.23. В отличие от параллельной, при перспективной проекции не сохраня- ются относительные пропорции объектов. Однако перспективные проекции сцены более реалистичны, поскольку удаленные объекты после проектирования выглядят меньшими.
516 Глава 7. Трехмерное наблюдение Плоскость проекции Рис. 7.22. Параллельная проекция отрезка на плос- кость наблюдения Плоскость проекции Точка конвергенции Рис. 7.23. Перспективная проекция отрезка на плос- кость наблюдения 7.6. ОРТОГОНАЛЬНЫЕ ПРОЕКЦИИ Преобразование описаний объектов на плоскость наблюдения вдоль линий, парал- лельных вектору нормали к плоскости наблюдения N, называется ортогональной проекцией (или ортографической проекцией). В результате получается параллельная проекция, в которой линии проекции перпендикулярны плоскости наблюдения. Орто- гональные проекции чаще всего используются для получения видов объекта спереди, сверху и сбоку, как показано на рис. 7.24. Фронтальная, боковая и задняя ортогональ- ные проекции объекта называются вертикальными, верхняя ортогональная проекция именуется горизонтальной. В инженерных и архитектурных чертежах данные орто- графические проекции широко используются, поскольку точно изображаются длины и углы, которые можно измерить по чертежу. АКСОНОМЕТРИЧЕСКИЕ И ИЗОМЕТРИЧЕСКИЕ ОРТОГОНАЛЬНЫЕ ПРОЕКЦИИ Существуют и другие ортогональные проекции, на которых отображается несколь- ко граней объекта. Такие проекции называются аксонометрическими ортогональны- ми проекциями. Наиболее распространенной аксонометрической проекцией является изометрическая, которая получается таким согласованием плоскости проекции (или объекта), при котором эта плоскость пересечет все координатные оси, по которым определен объект (называются главными осями), на одинаковом расстоянии от нача-
7.6. Ортогональные проекции 517 ла координат. На рис. 7.25 показана изометрическая проекция куба. Чтобы получить эту проекцию, вектор нормали к плоскости наблюдения выравнивается вдоль диаго- нали куба. Всего существует восемь точек (по одной в каждом октанте), в которых можно получить изометрическую проекцию. На изометрической проекции все три главные оси сокращены одинаково, поэтому сохраняются относительные пропорции. Для общей аксонометрической проекции подобное утверждение неверно, здесь мас- штабные коэффициенты могут быть разными в трех главных направлениях. Вид спереди Рис. 7.24. Ортогональное проектирование объекта с изображением вертикальной и горизонтальной проекций Рис. 7.25. Изометриче- ская проекция куба
518 Глава 7. Трехмерное наблюдение Плоскость проекции Рис. 7.26. Ортого- нальная проекция точки пространства на плоскость наблю- дения КООРДИНАТЫ ОРТОГОНАЛЬНОЙ ПРОЕКЦИИ Когда направление проектирования параллельно оси zv;ew, уравнения преобразова- ния ортогональной проекции тривиальны. Для любой точки (ж, у, г) в координатах наблюдения, как показано на рис. 7.26, координаты проекции выражаются так: Лр = X, Ур = у. (1.6) Напомним, что при любом преобразовании проектирования значение координа- ты z записывается для использования в процедурах определения видимости. Кро- ме того, каждая трехмерная точка сцены преобразуется в точку в нормирован- ном пространстве. ОТСЕКАЮЩЕЕ ОКНО И ОБЪЕМ НАБЛЮДЕНИЯ ОРТОГОНАЛЬНОЙ ПРОЕКЦИИ Если вспомнить аналогию с камерой, то одним фактором, определяющим, какая часть сцены переносится на пленку, будет тип линз. Широкоугольная линза захватыва- ет большую часть сцены, чем обычная. В приложениях компьютерной графики с этой же целью используется прямоугольное отсекающее окно. Как и при двухмер- ном наблюдении, графические пакеты обычно позволяют использовать отсекающие прямоугольники стандартной ориентации. Поэтому для трехмерного наблюдения от- секающее окно задается так же, как для двухмерного, — выбираются двухмерные точки, соответствующие левому нижнему и правому верхнему углам. В трехмерном наблюдении отсекающее окно размещается на плоскости наблюдения, а его стороны параллельны осям ®view и у view, как показано на рис. 7.27. Если нужно использовать какую-то другую форму или ориентацию отсекающего окна, приходится разрабаты- вать собственные процедуры наблюдения.
7.6. Ортогональные проекции 519 Плоскость проекции Aiew ОКНО ywmin) *view Рис. 7.27. Отсекающее окно на плоскости наблюдения, мини- мальные и максимальные коорди- наты даны в системе наблюдения а) вид сбоку Отсекающее окно б) вид сверху ^view Рис. 7.28. Бесконеч- ный объем наблюде- ния ортогональной проекции (XWmax-yWmax) Стороны отсекающего окна задают пределы изменения х и у в той части сцены, которую требуется отобразить на экране. С помощью данных пределов формируются верхняя, нижняя и две боковые стороны отсекающей области, называемой объемом наблюдения ортогональной проекции. Поскольку линии проекции перпендикулярны плоскости наблюдения, данные четыре границы являются плоскостями, также пер- пендикулярными плоскости наблюдения и проходящими через стороны отсекающего окна, формируя бесконечную отсекающую область, показанную на рис. 7.28. Размер ортогонального объема наблюдения по оси zview можно ограничить, вы- брав положение одной или двух дополнительных граничных плоскостей, параллель- ных плоскости наблюдения. Данные две плоскости называются ближней/дальней плоскостями отсечения или передней/задней плоскостями отсечения. Ближняя и дальняя плоскости позволяют исключать объекты, находящиеся перед или позади части сцены, которую требуется отобразить. Если наблюдение ведется по отрица- тельному направлению оси zview, обычно выбирается 2far < znear, так что дальняя плоскость лежит дальше по отрицательному направлению оси 2View- Некоторые гра- фические библиотеки позволяют задавать данные плоскости, а некоторые — требуют
520 Гпава 7. Трехмерное наблюдение Рис. 7.29. Конечный ортогональный объем наблюдения отсекает- ся плоскостью наблю- дения “перед” ближ- ней плоскостью этого. Если ближняя и дальняя плоскости заданы, получаем конечный ортогональный объем наблюдения, представляющий собой прямоугольный параллелепипед, как пока- зано на рис. 7.29, где также представлено одно возможное расположение плоскости наблюдения. В данном случае проекция сцены будет содержать только те объекты, которые принадлежат объему наблюдения, а все части сцены вне этого объема уда- ляются алгоритмами отсечения. В графических пакетах возможность размещения ближней и дальней отсекаю- щих плоскостей реализована по-разному, иногда пакет позволяет даже задавать до- полнительные плоскости отсечения в указанных точках сцены. Вообще, ближняя и дальняя отсекающие плоскости могут располагаться произвольным образом по от- ношению друг к другу, что позволяет получать различные эффекты наблюдения, в том числе изображать точки, расположенные на противоположных сторонах от точки наблюдения. Аналогично плоскость наблюдения можно иногда установить в любом положении относительно ближней и дальней отсекающих плоскостей, хотя часто она выбирается совпадающей с ближней плоскостью отсечения. Впрочем, наличие множества альтернатив размещения отсекающих плоскостей и плоскости проекции обычно приводит к менее эффективной обработке трехмерной сцены. НОРМИРОВКА ОРТОГОНАЛЬНОЙ ПРОЕКЦИИ Используя ортогональный перенос точек на плоскость проекции, спроектированное положение любой заданной точки (ж, у, z) можно представить как (ж, у). Следова- тельно, задав границы объема наблюдения, описания внутри этого прямоугольного параллелепипеда представляются в координатах проекции, и их можно отобразить в нормированный объем наблюдения и завершить этапы обработки, связанные с про- ектированием. В некоторых графических пакетах данный нормированный объем на-
7.6. Ортогональные проекции 521 Рис. 7.30. Левосторонняя система экранных координат блюдения представлен единичным кубом, и координаты х, у и z нормируются в диапазон от 0 до 1. Кроме того, используется симметричный куб, и в этом случае координаты меняются от — 1 до 1. Поскольку экранные координаты часто задаются в левосторонней системе коор- динат (рис. 7.30), нормированные координаты также часто задаются в левосторонней системе. Это позволяет непосредственно интерпретировать положительные расстоя- ния по направлению наблюдения как расстояния от экрана (плоскости наблюдения). Таким образом можно преобразовать координаты проекции в точки, принадлежащие левосторонней нормированной системе координат, и затем эти точки будут перево- диться преобразованием поля просмотра в левосторонние экранные координаты. Чтобы проиллюстрировать преобразование нормировки, предположим, что объ- ем наблюдения ортогональной проекции нужно отобразить в симметричный нор- мированный куб, расположенный в левосторонней системе координат. Кроме то- го, координаты z ближней и дельней плоскостей записываются как 2пеаг и Zfar соответственно. Данное преобразование нормировки иллюстрируется на рис. 7.31. Точка (Жтш, У min, 2 near) отображается в точку с нормированными координатами (-1, -1, -1), а точка (жтяУ, Утах, £far) отображается в (1,1,1). Преобразование объема наблюдения в форме прямоугольного параллелепипеда в нормированный куб выполняется с помощью методов, подобных рассмотренным в разделе 6.3 для преобразования отсекающего окна в нормированный квадрат. Пре- образование нормировки для координат х и у в ортогональном объеме наблюдения выражается матрицей нормировки (6.9). Кроме того, с помощью схожих расчетов нужно преобразовать координаты z в диапазоне от ,гпеаг до 2far в интервал от — 1
522 Глава 7. Трехмерное наблюдение Рис. 7.31. Преобразование нормировки из объема наблюдения ортогональной проекции в сим- метричный нормированный куб, определенный в левосторонней системе координат до 1. Следовательно, преобразование нормировки ортогонального объема наблюде- ния записывается так: Г 2 п л 2-^Гтах "Г ЯШпйп 2-'^max 2?Wmin ^^min 0 2 0 УШтах "Г У®тш м = ywmax ~ Уштт Уштах — У®тт п п —2 znear "Г zfar -^пеаг ^far Znear — -2-far 0 0 0 1 (7.7) На данную матрицу справа множится матрица сложного преобразования наблюдения R • Т (раздел 7.4), в результате чего находится полное преобразование из внешних координат в нормированные координаты ортогональной проекции. На этом этапе конвейера наблюдения все аппаратно-независимые преобразования координат завершены, и их можно свернуть в одну сложную матрицу. Поэтому проце- дуры отсечения эффективнее всего выполнить перед преобразованием нормировки. После отсечения могут вызываться процедуры проверки видимости, визуализации поверхностей и преобразований поля просмотра, с помощью которых генерируется конечное изображение сцены на экране.
7.7. Косоугольные параллельные проекции 523 а) б) Рис. 7.32. Косоугольная параллельная проекция куба, показанного как вид сверху на пане- ли а, дает проекцию (панель б), содержащую несколько поверхностей куба Рис. 7.33. Косоугольная па- раллельная проекция точки (ж, у, z) в точку (жр, Ур, zvp) на плоскости проекции, ко- торая характеризуется поло- жением zvp вдоль оси zview 7.7. КОСОУГОЛЬНЫЕ ПАРАЛЛЕЛЬНЫЕ ПРОЕКЦИИ В общем случае параллельная проекция сцены получается переносом описаний объ- ектов на плоскость наблюдения по траекториям проектирования, которые могут идти под любым углом к вектору нормали к плоскости наблюдения. Если траектории про- ектирования не перпендикулярны плоскости наблюдения, данное отображение назы- вается косоугольной параллельной проекцией. Используя эту проекцию, можно объ- единить, например, вид объекта спереди, сбоку и сверху, как показано на рис. 7.32. Косоугольные параллельные проекции определяются направлением линий проекции, причем это направление можно задавать по-разному.
524 Глава 7. Трехмерное наблюдение КОСОУГОЛЬНЫЕ ПАРАЛЛЕЛЬНЫЕ ПРОЕКЦИИ В ЧЕРЧЕНИИ И ПРОЕКТИРОВАНИИ В приложениях из области инженерного и архитектурного проектирования косоуголь- ная параллельная проекция часто задается двумя углами, а и ф, как показано на рис. 7.33. Точка (ж, у, z) на этой иллюстрации проектируется в точку (яр, ур, zvp) плоскости проекции, которая проходит на расстоянии zvp по оси наблюдения z. Соответствующей точкой ортогональной проекции является (т, у, zvp). Линия косо- угольной параллельной проекции, идущая от (.г\ у, z) к (ггр, ур, zvp), пересекается под углом а с линией плоскости проекции, соединяющей точки (ггр, ур, zvp) и (х, у, zvp). Данная линия плоскости проекции, имеющая длину L, образует угол ф с горизонталь- ным направлением плоскости проекции. Углу а можно присвоить значение между 0 и 90°, а угол ф может меняться от 0 до 360°. Координаты проекции можно следующим образом выразить через х, у, L и ф\ х„ = х + L cos ф, г а (7-8) ур = у + L sin ф. Длина L зависит от угла а и расстояния по перпендикуляру точки (х, у, z) от плос- кости наблюдения: Zvr. — Z tga=^—. (7.9) Lj Следовательно, г %vp tga = Li(zvp-z), (7.10) где Li = ctga, что равно L при zvp — z = 1. Таким образом, уравнения (7.8) косоугольной параллельной проекции можно записать следующим образом: хр = х + Li (zvp — z) cos ф, (7.И) УР = У + L^p - z')slnф. Ортогональная проекция получается при L\ = 0 (это условие выполняется, когда угол проекции a = 90°). Уравнения (7.11) представляют преобразование сдвига по оси z (раздел 5.14). Фактически влияние косоугольной параллельной проекции заключается в сдвиге плоскостей постоянного z и проектировании их на плоскость наблюдения. Точки с координатами фх, у) на каждой плоскости постоянного z смещаются на величину, пропорциональную расстоянию плоскости от плоскости наблюдения, поэтому углы, расстояния и параллельные линии на плоскости проектируются точно. Данный эф-
7.7. Косоугольные параллельные проекции 525 Плоскость проекции а) Рис. 7.34. Косоугольная параллельная проекция (панель а) куба (вид сверху) на плоскость наблюдения, которая совпадает с передней гранью куба, дает комбинацию вида спереди, сбоку и сверху, показанную на панели б Плоскость проекции б) Рис. 7.35. Косоаксономет- рические проекции куба на плоскость наблюдения для двух значений угла <р. На проекции глубина пред- ставляется отрезком, длина которого равна ширине и высоте куба фект показан на рис. 7.34, где плоскость наблюдения расположена на передней грани куба. Задняя плоскость куба сдвигается и накладывается на переднюю при проекти- ровании на поверхность наблюдения. Боковая грань куба, соединяющая переднюю и заднюю плоскости, проектируется в линию длины L\, которая образует угол ф с горизонтальной линией плоскости проекции. КОСОАКСОНОМЕТРИЧЕСКИЕ И КАБИНЕТНЫЕ ПАРАЛЛЕЛЬНЫЕ ПРОЕКЦИИ Обычно угол ф выбирают равным 30° или 45°, при этом изображается комбиниро- ванное изображение передней, боковой и верхней (или передней, боковой и нижней) сторон объекта. Двумя наиболее распространенными значениями а являются те, для которых tga — 1 и tga = 2. В первом случае а — 45°, и получаемые проек- ции называются косоаксонометрическими. Все линии, перпендикулярные плоскости проекции, проектируются без изменений длины. Примеры косоаксонометрических проекций для куба приведены на рис. 7.35.
526 Глава 7. Трехмерное наблюдение Рис. 7.36. Кабинетные про- екции куба на плоскость наблюдения для двух зна- чений угла ф. На проек- ции глубина представляет- ся отрезком, длина которо- го вдвое меньше ширины и высоты куба Рис. 7.37. Косоугольная па- раллельная проекция точки (ж, у, z) на плоскость наблю- дения вдоль линии проекции, определенной вектором Vp Когда угол проекции а выбран так, что tga = 2, получающаяся проекция назы- вается кабинетной. При таком угле (~ 63,4°) линии, перпендикулярные поверхности наблюдения, проектируются в отрезки вдвое меньшей длины. Кабинетные проекции кажутся более реалистичными, чем косоаксонометрические, именно из-за этого со- кращения длин перпендикуляров. Примеры кабинетных проекций для куба показаны на рис. 7.36. ВЕКТОР КОСОУГОЛЬНОЙ ПАРАЛЛЕЛЬНОЙ ПРОЕКЦИИ В библиотеках графического программирования, которые поддерживают косоуголь- ные параллельные проекции, направление проекции на плоскость наблюдения зада- ется вектором параллельной проекции Ур. Данный вектор направления можно задать точкой относительно точки наблюдения, как делалось выше для вектора нормали к плоскости наблюдения, или двумя любыми точками. В некоторых пакетах использует- ся опорная точка, заданная относительно центра отсекающего окна и определяющая
7.7. Косоугольные параллельные проекции 527 направление параллельной проекции. Если вектор проекции задан во внешних ко- ординатах, его вначале нужно преобразовать в координаты наблюдения, используя матрицу поворота, рассмотренную в разделе 7.4. (Вектор проекции не затрагивается трансляцией, поскольку это просто указатель направления, не привязанный к точке.) После определения вектор проекции Vp в координатах наблюдения все точки сце- ны переносятся на плоскость наблюдения вдоль линий, параллельных этому вектору. На рис. 7.37 иллюстрируется косоугольная параллельная проекция точки простран- ства на плоскость наблюдения. Компоненты вектора проекции относительно системы наблюдения можно обозначить как Vp = (Vpx, Vpy, Vpz), где VpyIVpx = tg</>. После этого, сравнивая на рис. 7.37 подобные треугольники, получим: а?р х Урх Z"VP % Vpz Ур ~ у _Уру Zvp z Vpz Кроме того, можно записать эквивалент уравнений косоугольной параллельной про- екции (7.11) через вектор проекции: . / \ Урх Хр — X -|- {Zvp Z) , vZ (7Л2) Ур = У + (zVp - z)~p. *pz Координаты косоугольной параллельной проекции в уравнении (7.12) сводятся к ко- ординатам ортогональной проекции (7.6) при Vpx = Vpy = 0. ОТСЕКАЮЩЕЕ ОКНО И ОБЪЕМ НАБЛЮДЕНИЯ КОСОУГОЛЬНОЙ ПАРАЛЛЕЛЬНОЙ ПРОЕКЦИИ Объем наблюдения косоугольной параллельной проекции задается с использовани- ем тех же процедур, что и при ортогональной проекции. Вначале выбирается от- секающее окно на плоскости наблюдения; левый нижний и правый верхний углы отсекающего прямоугольника имеют координаты (rcwmin> ywmin) и (xwmax, ywmax). Затем определяются верхняя, нижняя и боковые стороны объема наблюдения, для чего используется направление проекции и стороны отсекающего окна. Кроме то- го, объем наблюдения можно ограничить, добавив ближнюю плоскость и дальнюю плоскость, как показано на рис. 7.38. Окончательно объем наблюдения косоугольной параллельной проекции представляет собой наклонный параллелепипед. Косоугольные параллельные проекции могут затрагиваться изменением положе- ния плоскости наблюдения, в зависимости от того, как задано направление проекции. В некоторых системах направление косоугольной параллельной проекции параллель-
528 Глава 7. Трехмерное наблюдение Рис. 7.38. Вид сверху конечного объема наблюдения для косоугольной параллельной проекции в направлении вектора V р Дальняя плоскость ио линии, соединяющей опорную точку с центром отсекающего окна. Следовательно, если менять положение плоскости наблюдения или отсекающего окна при фиксиро- ванной опорной точке, будет меняться и форма объема наблюдения. МАТРИЦА КОСОУГОЛЬНОЙ ПАРАЛЛЕЛЬНОЙ ПРОЕКЦИИ Подставляя параметры вектора проекции в уравнения (7.12), элементы матрицы ко- соугольной параллельной проекции можно выразить следующим образом: 1 0 Vpx Vpx ZvP\T~ Vpz ^^oblique — 0 1 У>У Vpz - Ypy Zvp v pz 0 0 1 0 .0 0 0 1 (7.13) Под действием данной матрицы значения координат х и у смещаются на величи- ну, пропорциональную расстоянию от плоскости наблюдения, которая проходит на расстоянии zvp по оси zview Значения z точек не меняются. Если Vpx = Vpy = О, получаем ортогональную проекцию, и матрица (7.13) сводится к единичной. Для произвольной косоугольной параллельной проекции матрица (7.13) представ- ляет преобразование сдвига относительно оси z. Все точки косоугольного объема на- блюдения сдвигаются на величину, пропорциональную их расстоянию от плоскости наблюдения. Целью является сдвиг косоугольного объема наблюдения в прямоуголь- ный параллелепипед, как видно на рис. 7.39. Таким образом, точки внутри объема наблюдения сдвигаются в точки ортогональной проекции под воздействием косо- угольной параллельной проекции.
7.7. Косоугольные параллельные проекции 529 а) объем наблюдения б) преобразованный объем косоугольной проекции наблюдения косоугольной проекции Рис. 7.39. Вид сверху косоугольного параллельного преобразования. Косоугольный объем наблюдения переходит в прямоугольный параллелепипед, и такие объекты в объеме наблюдения, как зеленый прямо- угольник, отображаются в координаты ортогональной проекции НОРМИРОВКА КОСОУГОЛЬНОЙ ПАРАЛЛЕЛЬНОЙ ПРОЕКЦИИ Поскольку уравнения косоугольной параллельной проекции переводят описания объ- ектов в координаты ортогональной проекции, после этого преобразования можно применить процедуры нормировки. Косоугольный объем наблюдения преобразован в прямоугольный параллелепипед, поэтому используем те же процедуры, что и в разделе 7.6. Вспомнив пример нормировки из раздела 7.6, выполним отображение в сим- метричный нормированный куб, определенный в левосторонней системе координат. Таким образом, полное преобразование из координат наблюдения в нормированные координаты для косоугольной параллельной проекции записывается так: M-oblique.norni = ^Iortho,norm ’ ^loblique- (7-14) Преобразование MobiiqUe представляется матрицей (7.13), под действием которой описание сцены переводится в координаты ортогональной проекции, а преобразова- ние Mortho,norm описывается матрицей (7.7), и при его применении содержимое орто- гонального объема наблюдения отображается в симметричный нормированный куб. Чтобы завершить преобразование наблюдения (исключая отображение в экран- ные координаты поля просмотра), умножим матрицу (7.14) слева на матрицу преоб- разования Муус,УС (см. раздел 7.4). Затем к нормированному объему наблюдения можно применить процедуры отсечения, а потом определить видимые объекты, вы- полнить процедуры визуализации поверхностей и преобразование поля просмотра.
530 Глава 7. Трехмерное наблюдение Рис. 7.40. Перспектив- ная проекция двух от- резков равной длины, расположенных на раз- личных расстояниях от плоскости наблюдения Опорная точка проекции Плоскость проекции p=(x,y,z) •------- Ц>’ Уу Плоскость проекции Рис. 7.41. Перспективная проекция точки Р с координатами (ж, у, z) в выбранный центр проекции. Точка пересечения с плоскостью наблюдения имеет координаты (хр, ур, zvp) 7.8. ПЕРСПЕКТИВНЫЕ ПРОЕКЦИИ Хотя параллельную проекцию сцены легко сгенерировать и сохранить относитель- ные пропорции объектов, она нереалистична. Чтобы сымитировать изображение, да- ваемое камерой, необходимо рассмотреть отраженные лучи света на сцене, идущие по траекториям, которые сходятся на пленке камеры. Данное явление, описывае- мое геометрической оптикой, можно аппроксимировать, спроектировав объекты на плоскость наблюдения вдоль траекторий, сходящихся в точку, называемую центром проекции. После этого объекты отображаются с учетом ракурса, а проекции удален- ных объектов меньше проекций объектов того же размера, но расположенных ближе к плоскости наблюдения (рис. 7.40).
7.8. Перспективные проекции 531 КООРДИНАТЫ ПЕРСПЕКТИВНОЙ ПРОЕКЦИИ Иногда графический пакет позволяет выбирать центр проекции как еще один па- раметр наблюдения, но в некоторых системах данная точка конвергенции распо- лагается в фиксированном месте, например, в точке наблюдения. На рис. 7.41 по- казана траектория проектирования точки (ж, у, г) в произвольный центр проекции (хргр,Ургр, zprp)- Линия проекции пересекает плоскость наблюдения в точке с ко- ординатами (гСр, ур, zvp), где zvp — некоторое выбранное положение плоскости на- блюдения на оси zview Далее можно составить уравнения, в параметрической форме описывающие координаты вдоль данной линии перспективной проекции: х' - х — (х — хргр)и, У'= У ~ (У ~ УРгр)и, 0 < u < 1, z' = z — (z — zprp)u. (7-15) Координаты (х1, у1 ,z'} представляют любую точку вдоль линии проекции. При и = О мы находимся в точке Р = (т, у, г). На другом конце линии (при и = 1) имеем центр проекции с координатами (жрГр,УрГр, zprp)- На плоскости наблюдения z' = zvp, и из уравнения для z' находится параметр и в этой точке вдоль линии проекции: Zyp Z U = -------- Zprp Z (7-16) Подставляя это значение и в уравнения для х' и у1, получим уравнения произвольного перспективного преобразования: / Zprp %рр \ Z Ур ~ У ( ~ ) + Ургр (~ \ t'prp * / \ *"&Гр А (7.17) Уравнения перспективного отображения гораздо сложнее уравнений параллельной проекции, поскольку знаменатели в формулах (7.17) являются функциями координа- ты z точки пространства. Следовательно, теперь нужно сформулировать процедуры перспективного преобразования немного иначе, чтобы это отображение можно бы- ло свернуть с другими преобразованиями наблюдения. Однако рассмотрим вначале некоторые свойства уравнений (7.17). УРАВНЕНИЯ ПЕРСПЕКТИВНОЙ ПРОЕКЦИИ: ЧАСТНЫЕ СЛУЧАИ На параметры перспективной проекции часто налагаются различные ограничения. В зависимости от конкретного графического пакета расположение либо центра проек- ции, либо плоскости наблюдения может выбираться не совсем произвольно.
532 Глава 7. Трехмерное наблюдение Чтобы упростить расчет перспективной проекции, положение центра проекции можно ограничить точками вдоль оси zv-iew. 1. -£ргр — Ургр — 0 • __ / Zprp ZVp \ Zprp Z Zprp ZVp Ур — У. у Zprp z (7.18) Иногда центр проекции фиксируется в начале координат. 2. Хргр, Ургрч Zprp ) = (0,0,0): (7-19) Если плоскостью наблюдения является плоскость uv, и нет ограничений на располо- жение центра проекции, получаем следующее 3. zVp — 0. (7.20) Когда плоскостью наблюдения является плоскость uv, а центр проекции находится на оси zview, уравнения перспективной проекции записываются так. 4. ЗСртр — Ургр — ZVp = 0: / Zprp Хр ~ х \ ——-— у Zpyp Z / Zpyp Ур = у\ __ \ Zprp Z (7.21) Разумеется, центр проекции нельзя расположить на плоскости наблюдения. В этом случае вся сцена спроектировалась бы в одну точку. Обычно плоскость наблю- дения размещается между центром проекции и сценой, но в общем случае плоскость наблюдения можно поместить где угодно, только не в центре проекции. Если центр проекции находится между плоскостью наблюдения и сценой, объекты на плоскости наблюдения переворачиваются (рис. 7.42). Когда сцена расположена между плос- костью наблюдения и центром проекции, объекты увеличиваются, поскольку они проектируются от точки наблюдения на плоскость наблюдения. Эффекты перспективы также зависят от расстояния между центром проекции и плоскостью наблюдения, как следует из рис. 7.43. Если центр проекции близок к плоскости наблюдения, эффекты перспективы усиливаются; т.е. более близкие объ- екты кажутся больше удаленных объектов такого же размера. Таким образом, при
7.8. Перспективные проекции 533 (ХРФ’ Урн” Zprp) Плоскость проекции Рис. 7.42. Перспек- тивная проекция объ- екта сверху вниз, ко- гда центр проекции лежит между объек- том и плоскостью на- блюдения Отсекающее а) опорная точка проекции Отсекающее б) опорная точка проекции Отсекающее । окно г'......... в) опорная точка проекция значительно удалена от плоскости проекции Рис. 7.43. Измене- ние эффектов пер- спективы из-за удале- ния центра проекции от плоскости наблю- дения удалении центра проекции от плоскости наблюдения разница размеров ближних и дальних объектов уменьшается. Если центр проекции расположен очень далеко от плоскости наблюдения, перспективная проекция переходит в параллельную. ТОЧКИ СХОЖДЕНИЯ ПЕРСПЕКТИВНЫХ ПРОЕКЦИЙ Когда сцена проектируется на плоскость наблюдения с использованием перспектив- ного отображения, линии, параллельные плоскости наблюдения, проектируются в параллельные линии. Однако любые параллельные линии сцены, которые при этом не параллельны плоскости наблюдения, проектируются в сходящиеся линии, как по- казано на рис. 7.4. Точка, в которую сходятся проекции параллельных прямых, на- зывается точкой схождения. Отметим, что каждый набор проекций параллельных прямых имеет свою точку схождения.
534 Глава 7. Трехмерное наблюдение куба б) одноточечная перспективная проекция Рис. 7.44. Главные точки схожде- ния перспективных проекций ку- ба. Когда куб (панель а) проек- тируется на плоскость, пересека- ющую только ось з, генериру- ется только одна точка схожде- ния, расположенная на оси z (па- нель б). Когда куб проектируется на плоскость, пересекающую оси z их, получаются две точки схож- дения (панель в) Точка схождения по оси х Точка схождения по оси г в) двухточечная перспективная проекция Если набор линий параллелен одной из главных осей объекта, соответствую- щая точка схождения называется главной точкой схождения. Число главных точек схождения (одна, две или три) можно контролировать, выбирая ориентацию плоско- сти проекции. Перспективные проекции классифицируются по этому признаку как одно-, двух- и трехточечные проекции. Число главных точек схождения на проекции равно числу главных осей, которые пересекают плоскость наблюдения. На рис. 7.44 иллюстрируется внешний вид одно- и двухточечной перспективных проекций куба. На проекции, показанной на рис. 7.44, б, плоскость проекции ориентирована па- раллельно плоскости объекта ху, так что пересекается только ось z объекта. При такой ориентации получается одноточечная перспективная проекция, и единственная точка схождения расположена на оси z. При проекции, показанной на рис. 7.44, в, плоскость проекции пересекает оси х и z, но не пересекает ось у. Получающаяся двухточечная перспектива содержит точки схождения по осям х и z. Трехточечная проекция не намного повышает реализм сцены по сравнению с двухточечной, по- этому в архитектурном и инженерном проектировании трехточечные проекции не получили широкого распространения.
7.8. Перспективные проекции 535 Рис. 7.45. Бесконечный пирамидальный объем наблюдения перспективной проекции Центр проекции ОБЪЕМ НАБЛЮДЕНИЯ ДЛЯ ПЕРСПЕКТИВНОЙ ПРОЕКЦИИ Объем наблюдения задается через положение прямоугольного отсекающего окна на плоскости наблюдения. Однако теперь граничные плоскости объема наблюдения не параллельны, поскольку не параллельны линии проекции. Верхней, нижней и боко- выми сторонами объема наблюдения являются плоскости, проходящие через стороны окна и центр проекции (рис. 7.45). Все объекты вне данной пирамиды удаляются про- цедурами. Объем наблюдения перспективной проекции часто называется пирамидой Зрения, поскольку он аппроксимирует конус зрения наших глаз или камеры. Отобра- женная проекция сцены включает только объекты, находящиеся внутри пирамиды, так же, как мы не видим объекты, расположенные вне зоны видимости перифериче- ского зрения (вне конуса зрения). г Добавляя ближнюю и дальнюю плоскости отсечения, перпендикулярные оси iview (и параллельные плоскости наблюдения), мы отсекаем части бесконечного объ- ема наблюдения перспективной проекции и получаем усеченную пирамиду объема [наблюдения. На рис. 7.46 иллюстрируется форма конечного объема наблюдения пер- спективной проекции при плоскости наблюдения, размещенной между ближней от- секающей плоскостью и центром проекции. Иногда в графическом пакете ближнюю Ц дальнюю плоскости задавать можно, иногда — нужно. Обычно и ближняя, и дальняя отсекающие плоскости находятся с одной стороны рг центра проекции, причем дальняя плоскость расположена дальше по направлению ^наблюдения от центра проекции, чем ближняя. Кроме того, как и при параллельной Проекции, ближнюю и дальнюю плоскости можно использовать просто для того, что- Ебы обособить наблюдаемую сцену. Однако при перспективной проекции ближнюю Отсекающую плоскость можно использовать, чтобы удалить большие объекты, близ- кие к плоскости наблюдения, которые могут спроектироваться в окно отсечения в ви- Йе неузнаваемых форм. Аналогично дальнюю отсекающую плоскость можно исполь-
536 Глава 7. Трехмерное наблюдение плоскость отсечения плоскость отсечения Рис. 7.46. Пирамидальный объем наблюдения перспективной проекции, когда плос- кость наблюдения расположена “перед” ближней отсекающей плоскостью зовать для отрезания объектов, расположенных далеко от центра проекции, которые могут спроектироваться в маленькие пятнышки на плоскости наблюдения. Некоторые системы ограничивают расположение плоскости наблюдения относительно ближней и дальней плоскостей, а другие системы позволяют располагать их в любых местах, исключая положение центра проекции. Если плоскость наблюдения находится “поза- ди” центра проекции, объекты переворачиваются, как показано на рис. 7.42. МАТРИЦА ПЕРСПЕКТИВНОЙ ПРОЕКЦИИ В отличие от параллельной проекции, коэффициенты при координатах х и у в урав- нениях (7.17) нельзя использовать непосредственно для записи элементов матрицы перспективной проекции, поскольку знаменатели коэффициентов являются функци- ями координаты z. Впрочем, можно использовать трехмерное представление в одно- родных координатах, чтобы выразить уравнения перспективной проекции в форме •^h Ук яР = ~г, УР = (7.22) h h Где параметр однородности имеет значение h = zprp — z. (7.23) Числители в уравнениях (7.22) такие же, как в уравнениях (7.17): ЯД — X^Zprp zvp} + Я'ртр(^ур z)? Vh = yfeprp ~ zvp) + Ургр(%ур ~ -z).
7.8. Перспективные проекции 537 Таким образом, можно задать матрицу преобразования, под действием которой точка пространства переводится в однородные координаты, чтобы матрица содержала толь- ко перспективные параметры, и не содержала координат. Преобразование перспек- тивного проектирования точки, определенной в координатах системы наблюдения, выполняется в два этапа. Вначале с помощью указанной ниже матрицы преобразова- ния вычисляются однородные координаты. Ph = MDers • Р, IЬ О 7 (7.25) где — представление однородной точки (хь, yh,Zh,h) в виде вектора-столбца, а Р -вектор-столбец, представляющий точку (тг, у, z, 1). (В действительности матрица перспективной проекции будет сворачиваться с другими матрицами преобразования наблюдения, а затем сложная матрица подействует на описание сцены во внешних координатах и даст однородные координаты.) Затем после применения других про- цессов (таких, как преобразование нормировки и процедуры отсечения) однородные координаты делятся на параметр h, и в результате получаются собственно точки в преобразованных координатах. Как задать элементы матрицы для получения значений Xh и уь в однородных координатах из уравнения (7.24), понятно, но, кроме того, нужно структурировать матрицу так, чтобы сохранить информацию о глубине (значение z). В противном слу- чае координаты z исказятся параметром однородного деления h. Для этого можно так задать элементы матрицы, отвечающие за преобразование координаты z, чтобы нор- мировать координаты zp перспективной проекции. Существует несколько способов выбора элементов матрицы для получения однородных координат (7.24) и нормиро- ванного значения zp для точки (х, у, z). Одно из возможных решений дает следующая матрица перспективной проекции. Zprp ZVp 0 З'ртр Я'ргрЗ'ргр МперСП — 0 Zprp ZVp Ургр Ургр^ргр 0 0 sz tz (7.26) 0 0 — 1 Zprp Параметры sz и tz — это коэффициенты масштабирования и трансляции для норми- ровки спроектированных значений координат z. Заданные значения sz и tz зависят от выбранного диапазона нормировки. Под действием матрицы (7.26) описание сцены переводится в однородные коор- динаты параллельной проекции. Однако объем наблюдения в форме усеченной пи- рамиды может иметь любую ориентацию, поэтому данные преобразованные коорди- наты могут соответствовать косоугольной параллельной проекции. Так бывает, когда пирамидальный объем наблюдения перспективной проекции несимметричен. Если
538 Глава 7. Трехмерное наблюдение Рис. 7.47. Объем наблюдения перспектив- ной проекции, имеющий форму усеченной пирамиды. Плоскость наблюдения распо- ложена между центром проекции и ближ- ней плоскостью отсечения. Данная пирами- да симметрична относительно средней ли- нии при наблюдении снизу, сверху или со стороны любой боковой грани Средняя линия пирамиды пирамидальный объем наблюдения перспективной проекции симметричен, получаю- щиеся координаты параллельной проекции соответствуют ортогональной проекции. Более подробно указанные возможности рассмотрены ниже. СИММЕТРИЧНАЯ ПИРАМИДА ПЕРСПЕКТИВНОЙ ПРОЕКЦИИ Линия, проходящая через центр проекции и центр отсекающего окна по объему наблюдения, является средней линией пирамиды перспективной проекции. Если данная средняя линия перпендикулярна плоскости наблюдения, имеем симметрич- ную усеченную пирамиду (симметрична относительно средней линии), как показано на рис. 7.47. Поскольку средняя линия пирамиды пересекает плоскость наблюдения в точке {хргр, Ургр, zvp), угловые точки отсекающего окна можно выразить через размеры окна: ширина ширина — Xprp ~ , XWmax — Хргр + ~ , высота высота y^'niin = Ургр Д , У^'гпах = Ургр "I Д А А Следовательно, симметричную перспективную проекцию сцены можно задать, ис- пользуя ширину и высоту отсекающего окна, а не его координаты. Это однозначно устанавливает положение отсекающего окна, поскольку оно симметрично по коорди- натам х и у центра проекции.
7.8. Перспективные проекции 539 проекции Рис. 7.48. Угол обзора в для симметричного объема наблюдения перспективной проекции, ко- гда отсекающее окно находится между ближней отсекающей плоскостью и центром проекции Другой способ задания симметричной перспективной проекции — использовать параметры, аппроксимирующие свойства линз камеры. Фотография, например, по- лучается из симметричной перспективной проекции сцены на пленку. Лучи света, отраженные от объектов сцены, собираются в плоскости пленки из “конуса зрения” камеры. Данный конус зрения можно определить углом обзора — мерой размера линз камеры. Большой угол обзора, например, соответствует широкоугольным объективам. В компьютерной графике конус зрения аппроксимируется симметричной усеченной пирамидой, и с помощью угла обзора можно задать угловой размер конуса. Обычно углом обзора считается угол между верхней и нижней отсекающими плоскостями усеченной пирамиды, как показано на рис. 7.48. Для данного центра проекции и положения плоскости наблюдения угол обзора определяет высоту отсекающего окна (рис. 7.49), но не его ширину. Чтобы полно- стью определить размеры отсекающего окна, нужен дополнительный параметр, и этим вторым параметром может быть либо ширина окна, либо характеристическое отношение (ширина:высота) отсекающего окна. Из рис. 7.49 видно, что высота/2 Zprp %vp (7.27) так что высоту отсекающего окна можно вычислить следующим образом: высота (7.28)
540 Глава 7. Трехмерное наблюдение Рис. 7.49. Связь между углом обзора 0, высотой отсекающего окна и расстоянием между центром проекции и плоскостью наблюдения Уу'№41 Л-iew Следовательно, диагональные элементы со значением zprp — zvp в матрице (7.26) можно заменить любым из следующих выражений: Zprp — высота 2 ширина•ctg(0/2) 2 • (характ. отн.) (7.29) В некоторых графических библиотеках положения плоскости наблюдения и центра проекции зафиксированы, поэтому симметричная перспективная проекция полно- стью определяется углом обзора, характеристическим отношением отсекающего окна и расстоянием от точки наблюдения до ближней и дальней отсекающих плоскостей. Как правило, то же характеристическое отношение используется и при задании порта просмотра. Если в определенном приложении угол обзора уменьшен, эффекты перспективы перспективной проекции также уменьшаются. Это можно сравнить с удалением цен- тра проекции от плоскости наблюдения. Кроме того, уменьшение угла обзора умень- шает высоту отсекающего окна, поэтому на данном эффекте можно построить схему увеличения небольших участков сцены. Таким образом, большие углы обзора дают большую высоту окна отсечения (уменьшение масштаба). При этом усиливаются эф- фекты перспективы, и такое изображение мы получаем, располагая центр проекции близко к плоскости наблюдения. На рис. 7.50 показано, как меняется изображение для различных углов обзора при окне отсечения фиксированной ширины.
7.В. Перспективные проекции 541 Опорная точка проекции Рис. 7.50. Увеличение угла обзора увеличивает вы- соту отсекающего окна и усиливает перспективные эффекты
542 Глава 7. Трехмерное наблюдение Средняя линия / _ •..----------- Плоскость проекции у. Отсекающее / окно / / / 1 / 11 Опорная точка проекции Объему наблюдения придана форма параллелепипеда Рис. 7.51. Объем наблюдения симметричной усеченной пирамиды при перспективном проек- тировании отображается в ортогональный параллелепипед Когда объем наблюдения перспективной проекции является симметричной пи- рамидой, перспективное преобразование отображает точки внутри усеченной пи- рамиды в прямоугольный параллелепипед в координатах ортогональной проекции. Средняя линия параллелепипеда является средней линией пирамиды, поскольку эта прямая уже перпендикулярна плоскости наблюдения (рис. 7.51). Это является след- ствием того факта, что все точки вдоль линии проекции, принадлежащие усеченной пирамиде, отображаются в одну точку (хр, ур) плоскости наблюдения. Следователь- но, любая линия проекции переводится перспективным преобразованием в линию, перпендикулярную плоскости наблюдения, а следовательно, параллельную средней линии пирамиды. Если симметричная пирамида преобразуется в объем наблюдения ортогональной проекции, далее можно применить преобразование нормировки. УСЕЧЕННАЯ ПИРАМИДА КОСОУГОЛЬНОЙ ПЕРСПЕКТИВНОЙ ПРОЕКЦИИ Если средняя линия объема наблюдения перспективной проекции не перпендикуляр- на плоскости наблюдения, получаем наклонную усеченную пирамиду. На рис. 7.52 показан общий внешний объем наблюдения косоугольной перспективной проекции. В этом случае можно вначале преобразовать объем наблюдения в симметричную усеченную пирамиду, а затем — в нормированный объем наблюдения. Объем наблюдения косоугольной перспективной проекции можно преобразовать в симметричную пирамиду, подействовав матрицей сдвига вдоль оси z (5.115). Дан- ное преобразование смещает все точки любой плоскости, которая перпендикулярна оси z, на величину, пропорциональную расстоянию плоскости от заданной опор- ной точки на оси z. В данном случае опорной точкой является zprp — координата z центра проекции. Величина сдвига должна быть такой, чтобы центр отсекающего окна переместился в точку {хртр, ургр) на плоскости наблюдения. Поскольку средняя
7.8. Перспективные проекции 543 Средняя линия усеченной пирамиды (%ргр’ Ургр’ Zprp Рис. 7.52. Наклонная усеченная пирами- да, содержащая боковую или верхнюю грань; плоскость наблюдения располо- жена между центром проекции и ближ- ней отсекающей плоскостью линия усеченной пирамиды проходит через центр отсекающего окна, данный сдвиг так выравнивает среднюю линию, что она становится перпендикулярной плоскости наблюдения (см. рис. 7.47). Расчеты преобразования сдвига, а также перспективного преобразования и нор- мировки существенно сокращаются, если дописать, что центр проекции находится в начале системы наблюдения. Чтобы сделать это, не нарушая общности, можно так транслировать все точки сцены, чтобы выбранный центр проекции сместился в нача- ло координат. Или же можно изначально так задать систему наблюдения, чтобы ее на- чало находилось в точке проекции данного положения сцены. Кроме того, некоторые графические библиотеки фактически помещают центр проекции в начало координат. Подставляя координаты центра проекции (xprp, yprp, zprp) = (0,0,0), получаем такие элементы искомой матрицы сдвига: '1 0 sh23; o’ 0 1 sh2„ 0 Мг shear — 0 0 zy 1 0 .0 0 0 1. (7.30) Элементы матрицы перспективной проекции можно упростить еще больше, если поместить плоскость наблюдения на ближней плоскости отсечения. Кроме того, по- скольку центр отсекающего окна нужно переместить в точку с координатами (0,0)
544 Глава 7. Трехмерное наблюдение на плоскости наблюдения, нужно так определить значения параметров сдвига: О О ^пеаг 1 — мг shear 3'^min + 2 y^min + ywmax 2 ^near 1 (7.31) Следовательно, параметры этого преобразования сдвига записываются так: XWmin + XWmax shZI =------------------ 2 7 ь ^near , У^ггпп “Г Уштах sh2!/ =---------—----------- ^near (7.32) Если центр проекции находится в начале системы наблюдения, а ближняя отсекаю- щая плоскость совпадает с плоскостью наблюдения, матрица перспективной проек- ции (7.26) упрощается до вида Znear 0 0 0 0 -^near 0 0 Mpets — 0 0 Sz tz 0 0 -1 0 (7.33) Выражения для параметров масштабирования и трансляции по координате z опреде- ляются требованиями нормировки. Сворачивая упрощенную матрицу перспективной проекции (7.33) с матрицей сдвига (7.30), получим следующую матрицу косоугольной перспективной проекции для преобразования координат точек сцены в однородные координаты ортогональной проекции. Центр проекции для этого преобразования находится в начале системы наблюдения, а ближняя отсекающая плоскость совпадает с плоскостью наблюдения. ^^obliquepers — Alpers ’ — -^near shear — 0 0 2 0 y^min + y^'max 0 “ ^near 2 (7.34) 0 0 Sz tz 0 0 -1 0 Хотя выбирать положение центра проекции и плоскости наблюдения больше нельзя, использование данной матрицы позволяет эффективно генерировать перспективные проекции сцены, сохраняя при этом значительную долю гибкости.
7.8. Перспективные проекции 545 Если так выбрать координаты отсекающего окна, чтобы xwmax = -ramin и 2/Wmax — —ywmin> пирамидальный объем наблюдения будет симметричным, и мат- рица (7.34) сведется к матрице (7.33). Это объясняется тем, что центр проекции те- перь находится в начале системы наблюдения. Кроме того, если положить zprp = 0 и Zvp = znear в уравнениях (7.29), можно выразить первые два диагональных элемента данной матрицы через угол обзора и размеры отсекающего окна. НОРМИРОВАННЫЕ КООРДИНАТЫ ПЕРСПЕКТИВНОЙ ПРОЕКЦИИ Матрица (7.34) преобразует точки объекта в координатах наблюдения в однород- ные координаты перспективной проекции. Если поделить однородные координаты на однородный параметр h, получим реальные координаты проекции (координаты орто- гональной проекции). Следовательно, данная перспективная проекция переводит все точки пирамидального объема наблюдения в точки объема наблюдения, представ- ляющего собой прямоугольный параллелепипед. Заключительным этапом процесса перспективного преобразования является отображение данного параллелепипеда в нормированный объем наблюдения. Используем ту же процедуру нормировки, что и для параллельной проекции. Пре- образованный пирамидальный объем наблюдения (прямоугольный параллелепипед) отображается в симметричный нормированный куб, определенный в левосторонней системе координат (рис. 7.53). В матрицу перспективной проекции (7.34) мы уже включили параметры нормировки по z, но еще нужно определить значения этих параметров при преобразовании в симметричный нормированный куб. Кроме того, нужно определить параметры нормировки по х и у. Поскольку средней линией объ- ема наблюдения (прямоугольного параллелепипеда) теперь является ось zview, при нормировке по х и у никакой трансляции не требуется. Нужны всего лишь параметры масштабирования по х и у относительно начала координат. Матрица масштабирова- ния для выполнения нормировки по ху записывается следующим образом: Sx 0 0 0 M-xyscale — 0 sy 0 0 0 0 1 0 0 0 0 1 (7.35) Сворачивая матрицу масштабирования в плоскости ху с матрицей (7.34), получаем следующую матрицу нормировки для преобразования перспективной проекции: M-nonnpers = -M-rry scale ' -M-obliquepers =
546 Глава 7. Трехмерное наблюдение проекции наблюдения Рис. 7.53. Преобразование нормировки из преобразованного объема наблюдения перспектив- ной проекции (прямоугольный параллелепипед) в симметричный нормированный куб, опреде- ленный в левосторонней системе координат. Блнжняя плоскость отсечения используется как плоскость наблюдения, а центр проекции расположен в начале координат системы наблюдения 37Wmjn + 3?Wmax ^near^a: U Sx - U 0 ZneaxSy Sy 0 00 Sz tz 0 0 -10 Из этого преобразования получаем однородные координаты: Xh Уь Zh h — M-normpers Координаты проекции выражаются так: Xh XP~ h yh Ур~ h Zh Zp~ h ’min "b ^Wmax)/2 — Z -^near syy + Sy(^ywmin + ywmax)/2 ^пеаг —z (7.36) (7.37) (7.38) s2z + tz —z У z 1 Для нормировки этого перспективного преобразования требуется, чтобы коор- динаты проекции были равны (xp,yp,zp) = (—1,—1,—1) при входных ко- ординатах (x,y,z) = (ffWmin, z/Wmin, гпРЯГ), также необходимо, чтобы коорди-
7.8. Перспективные проекции 547 наты проекции точки были (хр, ур, zp) = (1,1,1) при входных координатах (x,y,z) = (xwmax,ywmax, Zfar). Таким образом, при решении уравнений (7.38) относительно нормировочных параметров получаем: 2 Sx = ----------------, Xwmax ~ XWmin znear 4" ^far ®z — 5 ^near — 2far 2 Sy > УШтах ~ ywmm 4 __ 2 Znear Zfar t2 — . ^near ^far (7.39) Элементы нормированной матрицы преобразования для произвольной перспективной проекции выражаются следующим образом: l^normpers — 2с:пеаг 0 З-Т^тах 4" З-Т^ппп 2-wmax — Я^ппп £'штах — 2?Wmin 0 — ^•^near У'штах 4" = У^тах. y^rnin ЗД^тах — ywm[n 0 0 гпеаг 4” 2far ^near — ^far 0 0 -1 0 0 2-Znear -^far (7.40) ^near — ^far 0 Если объем наблюдения перспективной проекции первоначально задан в виде сим- метричной усеченной пирамиды, элементы нормированного перспективного преоб- разования можно выразить через угол обзора и размеры отсекающего окна. Сле- довательно, используя уравнения (7.29) с центром проекции в начале координат и плоскостью наблюдения, совпадающей с ближней плоскостью отсечения, получаем: Мцорм. симм. персп. ’ ctg(|) хар. отн. О о о о ctgUi о о о о о о ^near 4" 2far 2znear Zfar •Znear — -Zfar ^-near — ^far -1 0 (7.41) Данная матрица полного преобразования из внешних координат в нормированные координаты перспективной проекции сформирована умножением данной матрицы перспективной проекции слева на произведение преобразования наблюдения R • Т. Затем к нормированному объему наблюдения можно применять процедуры отсече- ния. После этого останутся такие задачи, как определение видимости, визуализация поверхностей и преобразование в поле просмотра.
548 Глава 7. Трехмерное наблюдение 7.9. ПРЕОБРАЗОВАНИЯ ПОЛЯ ПРОСМОТРА И ТРЕХМЕРНЫЕ ЭКРАННЫЕ КООРДИНАТЫ После того как преобразование в нормированные координаты будет завершено, к сим- метричному кубу (или единичному кубу) можно эффективно применить отсечение. Завершив процедуры отсечения, содержимое нормированного объема наблюдения можно перевести в экранные координаты. Для координат х и у в нормированном окне отсечения эта операция не отличается от двухмерного преобразования поля просмотра, описанного в разделе 6.3. Однако точки трехмерного объема наблюдения также имеют глубину (координату z), и эту информацию о глубине нужно сохранить для проверок видимости и алгоритмов визуализации поверхностей. В связи с этим преобразование поля просмотра можно рассматривать как отображение в трехмер- ные экранные координаты. Уравнения преобразования координат х ну при переходе от нормированного от- секающего окна в прямоугольное поле просмотра записываются по матрице (6.10). Данную матрицу можно использовать в трехмерных приложениях, включив в нее па- раметры, отвечающие за преобразование значений z в экранные координаты. Часто нормированные значения z, принадлежащие симметричному кубу, перенормируются в диапазон от 0 до 1. Это позволяет соотнести z = 0 с плоскостью экрана и обра- ботку значений глубин выполнить в единичном интервале от 0 до 1. Если включить эту перенормировку по z, преобразование из нормированного объема наблюдения в трехмерные экранные координаты запишется так: M-норм. набл., ЗВ-экран — ’ З'^’тах З-^ппп 0 0 2 2 0 yvmax ~ Z/^rnin 2 0 yvmax Т 2 0 0 1 2 1 2 0 0 0 1 (7-42) В нормированных координатах грань симметричного куба znorm = — 1 соответству- ет области отсекающего окна. Также эта грань нормированного куба отображается в прямоугольное поле просмотра, которое теперь определяется уравнением zscreen = 0. Таким образом, левый нижний угол области экрана, соответствующей полю про- смотра, расположен в точке (жпт;п, уот\п, 0), а правый верхний угол — в точке (тШтах> yvmax.i 0). Каждая точка ху в поле просмотра соответствует позиции в буфере регенерации, который содержит информацию о цвете этой точки на экране. Кроме того, в другой
7.10. Функции трехмерного наблюдения OpenGL 549 области буфера, именуемой буфером глубины, содержится информация о глубинах всех точек экрана. В последующих главах будут рассмотрены алгоритмы определения точек видимых поверхностей и их цветов. Прямоугольное поле просмотра располагается на экране точно так, как и в двух- мерных приложениях. Левый нижний угол поля просмотра обычно размещается в точке, заданной относительно левого нижнего угла окна на экране. Кроме того, чтобы сохранить пропорции объекта, характеристическое отношение области поля просмот- ра задается таким же, как для отсекающего окна. 7.10. ФУНКЦИИ ТРЕХМЕРНОГО НАБЛЮДЕНИЯ OpenGL Библиотека OpenGL Utility (GLU) содержит одну функцию для определения парамет- ров трехмерного наблюдения и вторую — для задания симметричного преобразования перспективной проекции. Другие функции, например, для ортогональной проекции, косоугольной перспективной проекции и преобразования поля просмотра, содержат- ся в основной библиотеке OpenGL. Кроме того, существуют функции GLUT для определения окон на экране дисплея и работы с ними (раздел 6.4). ФУНКЦИЯ OpenGL ПРЕОБРАЗОВАНИЯ НАБЛЮДЕНИЯ При задании параметров наблюдения в OpenGL формируется матрица, которая сво- рачивается с текущей матрицей проекции модели. Следовательно, данная матрица наблюдения объединяется со всеми заданными ранее геометрическими преобразова- ниями. Под действием данной сложной матрицы описания объектов преобразовыва- ются из внешних координат в координаты наблюдения. Режим модельной проекции задается следующей командой. glMatrixMode (GL_MODELVIEW); Параметры наблюдения определяются следующей функцией GLU, которая вызывает процедуры трансляции и поворота из основной библиотеки OpenGL. gluLookAt (х0, уО, z0, xref, yref, zref, Vx, Vy, Vz); Значения всех параметров этой функции должны задаваться как числа двойной точности с плавающей запятой. В данной функции начало координат системы наблю- дения указывается как точка с внешними координатами Pg = (хО, уО, z0), опорная точка — как Pref = (xref, yref, zref), а вектор вверху — как V = (Vx, Vy, Vz). Положительное направление оси zView системы наблюдения идет по направлению N = Ро — Pref, а единичные осевые векторы системы наблюдения вычисляются по уравнениям (7.1).
550 Глава 7. Трехмерное наблюдение Поскольку направление ведется вдоль оси —zview, опорная точка Pref также на- зывается точкой взгляда (“look-at point”). Обычно в качестве этой точки берется неко- торое положение в центре сцены, которое можно использовать для привязки при за- дании параметров проекции. Опорную точку можно представить себе как положение, на которое наводится камера, находящаяся в начале координат системы наблюдения. Верх камеры задается вектором V, который выравнивается перпендикулярно N. Параметры наблюдения, заданные функцией gluLookAt, используются для фор- мирования матрицы преобразования наблюдения (7.4), выведенной в разделе 7.4. Дан- ная матрица формируется как комбинация трансляции, смещающей начало системы наблюдения в начало внешней системы координат, и поворота, который совмещает оси системы наблюдения с осями внешней системы координат. Если не вызывать функцию gluLookAt, параметры наблюдения OpenGL по умолчанию имеют такие значения: Ро = (0,0,0), Pref = (0,0, -1), v = (0,1,0). При этих значениях система наблюдения совпадает с внешней системой координат, а направление наблюдения — с отрицательным направлением оси worid. Отметим, что данные параметры по умолчанию применяются во многих приложениях. ФУНКЦИЯ ОРТОГОНАЛЬНОЙ ПРОЕКЦИИ OpenGL Проекционные матрицы записываются в режиме проектирования OpenGL. Поэто- му, чтобы задать матрицу проекции, нужно активизировать этот режим с помощью следующей команды. glMatrixMode (GL_PROJECTION); Затем при обработке любой команды преобразования соответствующая матрица будет сворачиваться с текущей проекционной матрицей. Параметры ортогональной проекции выбираются с помощью функции glOrtho (xwmin, xwmax, ywmin, ywmax, dnear, dfar) ; Значения всех параметров этой функции задаются как числа двойной точности с плавающей запятой. Функция glOrtho используется для выбора координат отсека- ющего окна и расстояний от начала системы наблюдения до ближней и дальней плос- костей отсечения. OpenGL не позволяет выбирать положение плоскости наблюдения. Плоскостью наблюдения всегда является ближняя плоскость отсечения, следователь- но, отсекающее окно всегда находится на ближней плоскости объема наблюдения.
7.10. Функции трехмерного наблюдения OpenGL 551 Рис. 7.54. Объем наблюдения ортогональ- ной проекции по умолчанию. Координат- ные границы данного симметричного ку- ба — от -1 до +1 по каждому направле- нию. Ближняя отсекающая плоскость про- ходит через точку znear = 1, а дальняя — через zfar = — 1 Функция glOrtho генерирует параллельную проекцию, перпендикулярную плоскости наблюдения (ближняя плоскость отсечения). Следовательно, данная функ- ция создает конечный объем наблюдения ортогональной проекции для заданных плос- костей отсечения и отсекающего окна. В OpenGL ближняя и дальняя плоскости отсе- чения являются обязательными параметрами, которые всегда должны задаваться для любого преобразования проектирования. В параметрах dnear и dfar указываются расстояния по отрицательному на- правлению оси Zview от начала координат системы наблюдения. Например, если dfar = 55.0, то ближняя отсекающая плоскость проходит через точку Zfar = —55.0. Отрицательное значение любого параметра соответствует положению “за” началом координат (против положительного направления оси zview)- Этим параметрам можно присваивать любые значения (положительные, отрицательные или нулевые), главное, чтобы удовлетворялось условие dnear < dfar. Объемом наблюдения для перспективного преобразования является прямоуголь- ный параллелепипед. Точки, принадлежащие этому объему, с помощью матрицы (7.7), где 2Пеаг = — dnear и Zfar = — df аг, переводятся в точки внутри симметричного нор- мированного куба, определенного в левосторонней системе координат. По умолчанию значения параметров функции OpenGL ортогонального проекти- рования равны ±1, и они дают объем наблюдения в форме симметричного нормиро- ванного куба, определенного в правосторонней системе наблюдения. Использование значений по умолчанию равносильно явному вызову такой команды. glOrtho (-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); При этом отсекающее окно является симметричным нормированным квадра- том, а объем наблюдения по умолчанию — это симметричный нормированный куб с Znear = L0 (за точкой наблюдения) и Zfar = —1.0. Внешний вид и положение объема наблюдения ортогональной проекции по умолчанию показаны на рис. 7.54.
552 Глава 7. Трехмерное наблюдение В двухмерных приложениях для настройки отсекающего окна используется функ- ция gluOrtho2D. Чтобы задать отсекающее окно, можно также использовать функ- цию glOrtho при условии, что параметрам dnear и dfar присвоены значения с противоположными знаками. Фактически вызов gluOrtho2D эквивалентен вызову функции glOrtho с параметрами dnear = —1.0 и dfar = 1.0. Функции OpenGL для генерации косоугольной проекции не существует. Что- бы получить такую проекцию, можно задать собственную проекционную матрицу, подобную приведенной в уравнении (7.14). Затем нужно сделать ее текущей проек- ционной матрицей OpenGL, используя функции работы с матрицами, рассмотренные в разделе 5.17. Другой способ генерации косоугольной проекции — так повернуть сцену в подходящее положение, чтобы ортогональная проекция в направлении zView давала искомое изображение. ФУНКЦИИ OpenGL СИММЕТРИЧНОЙ ПЕРСПЕКТИВНОЙ ПРОЕКЦИИ Существует две функции для получения перспективной проекции сцены. Одна из них генерирует объем наблюдения в виде симметричной усеченной пирамиды по направ- лению наблюдения (отрицательное направление оси zView)- Другую функцию можно использовать для получения либо симметричной перспективной проекции, либо ко- соугольной перспективной проекции. Для обоих функций центр проекции совпадает с началом системы наблюдения, а ближняя плоскость отсечения — с плоскостью наблюдения. Объем наблюдения перспективной проекции в виде симметричной усеченной пирамиды задается функцией GLU gluPerspective (theta, aspect, dnear, dfar); Здесь значениями всех четырех параметров являются числа двойной точности с плавающей запятой. Первые два параметра определяют размер и положение отсе- кающего окна на ближней плоскости, а вторые — расстояние от точки наблюдения (начало координат) до ближней и дальней плоскостей отсечения. Параметр theta представляет угол обзора — угол между верхней и нижней плоскостями отсечения (см. рис. 7.48). Данному углу можно присвоить любое значение от 0° до 180°. Параметру aspect присваивается значение характеристического отношения (ширина:высота) отсекающего окна. При построении перспективной проекции в OpenGL ближняя и дальняя плос- кости отсечения должны всегда идти по отрицательному направлению оси zvjew; ни одна из них не может располагаться “за” точкой наблюдения. К ортогональным про- екциям данное ограничение не применяется, но оно предотвращает вывод на экран перевернутой перспективной проекции объекта, когда плоскость наблюдения нахо- дится позади точки наблюдения. Следовательно, обоим параметрам dnear и dfar нужно присвоить положительные значения, а положения ближней и дальней плоско- стей вычислить как znear = —dnear и Zfar = —dfar.
7.10. Функции трехмерного наблюдения OpenGL 553 Если проектирующая функция не задана, сцена отображается с использованием ортогональной проекции по умолчанию. В этом случае объем наблюдения представ- ляет собой симметричный нормированный куб, показанный на рис. 7.54. В заключение отметим, что пирамидальный объем наблюдения, заданный функ- цией gluPerspective, симметричен относительно отрицательной оси 2vjew, а для преобразования описания сцены в нормированные однородные координаты проекции используется матрица (7.41). ФУНКЦИИ OpenGL ПРОИЗВОЛЬНОЙ ПЕРСПЕКТИВНОЙ ПРОЕКЦИИ Чтобы задать перспективную проекцию с объемом наблюдения, представляющим со- бой либо симметричную усеченную пирамиду, либо наклонную усеченную пирамиду, можно использовать следующую функцию. glFrustum (xwmin, xwmax, ywmin, ywmax, dnear, dfar); Значения всех параметров данной функции задаются как числа двойной точно- сти с плавающей запятой. Как и в других функциях наблюдения-проектирования, ближняя плоскость и центр проекции находятся в точке наблюдения (начало коор- динат). Указанная функция имеет те же параметры, что и функция ортогональной параллельной проекции, но теперь расстояния до ближней и дальней плоскостей отсечения должны быть положительными. Первые четыре параметра задают коор- динаты отсекающего окна на ближней плоскости, а последние два — расстояния от начала координат до ближней и дальней плоскости отсечения вдоль отрицательного направления оси zvjew. Положения ближней и дальней плоскостей вычисляются как Znear = -dnear и zfar = -dfar. Отсекающее окно можно задать где угодно на ближней плоскости. Выбрав ко- ординаты отсекающего окна, при которых zwmin = — xwmax и ywmin = —ywmax, получим симметричную усеченную пирамиду (средней линией является отрицатель- ная ОСЬ ^view)- Как и ранее, если команда проектирования не отдана явно, OpenGL выполняет ортогональную проекцию сцены по умолчанию. В этом случае объем наблюдения представляет собой симметричный куб (рис. 7.54). ПОЛЯ ПРОСМОТРА И ОКНА НА ЭКРАНЕ OpenGL После завершения процедур отсечения в нормированных координатах содержимое нормированного отсекающего окна плюс информация о глубине переводятся в трех- мерные экранные координаты. Код цвета для каждой точки ху поля просмотра запи- сывается в буфере регенерации (буфер цвета), также для каждой точки ху в буфере глубины записана информация о глубине.
554 Глава 7. Трехмерное наблюдение Как отмечалось в разделе 6.4, прямоугольное поле просмотра определяется сле- дующей функцией OpenGL. glViewport (xvmin, yvmin, vpWidth, vpHeight); Первые два параметра этой функции задают точку экрана с целочисленными ко- ординатами, которая является левым нижним углом поля просмотра относительно левого нижнего угла окна экрана. Последние два параметра задают целочисленную ширину и высоту поля просмотра. Чтобы сохранить пропорции объектов на сцене, ха- рактеристическое отношение поля просмотра задается равным характеристическому отношению отсекающего окна. Создание окон на экране и работа с ними выполняется с помощью процедур GLUT; подробно различные функции работы с окнами из библиотеки GLUT рас- смотрены в разделе 6.4. Поле просмотра по умолчанию имеет такие же размеры и положение, что и текущее окно на экране. ПРИМЕР ПРОГРАММЫ ТРЕХМЕРНОГО НАБЛЮДЕНИЯ OpenGL Ниже приводится пример программы, выводящей на экран перспективную проекцию квадрата, как показано на рис. 7.55. Квадрат определен на плоскости ху, и начало системы наблюдения выбирается так, чтобы передняя грань наблюдалась под углом. Далее с помощью функции glFrustum получаем перспективную проекцию, выбрав центр квадрата в качестве точки взгляда. Если переместить начало координат системы наблюдения на другую сторону многоугольника, задняя грань будет отображаться как каркасный объект. ♦include <GL/glut.h> GLint winWidth « 600, winHeight = 600; /* Исходный размер окна на экране. */ GLfloat хО = 100.0, уО =50.0, z0 = 50.0; /* Начало координат системы наблюдения. */ GLfloat xref = 50.0, yref = 50.0, zref = 0.0; // Точка взгляда. GLfloat Vx = 0.0, Vy = 1.0, Vz = 0.0; // Вектор верха. /* Задаются координатные границы отсекающего окна: */ GLfloat xwMin = -40.0, ywMin = -60.0, xwMax = 40.0, ywMax = 60.0; /* Задается положение ближней и дальней отсекающих плоскостей: */ GLfloat dnear = 25.0, dfar = 125.0;
7.10. Функции трехмерного наблюдения OpenGL 555 void init (void) ( glClearColor (1.0, 1.0, 1.0, 0.0); glMatrixMode (GL_MODELVIEW); gluLookAt (xO, yO, zO, xref, yref, zref, Vx, Vy, Vz); glMatrixMode (GL_PROJECTION); glFrustum (xwMin, xwMax, ywMin, ywMax, dnear, dfar); } void displayFcn (void) ( glClear (GL_COLOR_BUFFER_BIT); /* Задаются параметры квадратной закрашенной области. */ glColor3f (0.0, 1.0, 0.0); /* Квадрат будет закрашен зеленым цветом. */ glPolygonMode (GL_FRONT, GL_FILL); glPolygonMode (GL_BACK, GL_LINE); // Каркасная задняя грань. glBegin (GL_QUADS); glVertex3f (0.0, 0.0, 0.0); glVertex3f (100.0, 0.0, 0.0); glVertex3f (100.0, 100.0, 0.0); glVertex3f (0.0, 100.0, 0.0); glEnd ( ); glFlush ( ); } void reshapeFcn (GLint newWidth, GLint newHeight) ( glViewport (0, 0, newWidth, newHeight); winWidth = newWidth; winHeight = newHeight; } void main (int argc, char** argv) ( glutlnit (&argc, argv); glutlnitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutlnitWindowPosition (50, 50); glutlnitWindowSize (winWidth, winHeight); glutCreateWindow ("Перспективная проекция квадрата"); init ( ) ; glutDisplayFunc (displayFcn); glutReshapeFunc (reshapeFcn); glutMainLoop ( ) ; }
556 Глава 7. Трехмерное наблюдение 7.11. Рис. 7.55. Выходное изображение, сгенерированное программой трехмерного на- блюдения ТРЕХМЕРНЫЕ АЛГОРИТМЫ ОТСЕЧЕНИЯ В главе 6 обсуждались преимущества использования нормированных границ отсе- кающего окна в двухмерных алгоритмах отсечения. Подобным образом трехмерные алгоритмы отсечения можно применить к нормированным границам объема наблюде- ния. Это позволяет крайне эффективно реализовать конвейер проектирования и про- цедуры отсечения. Все аппаратно-независимые преобразования (геометрические и проектирования) сворачиваются и применяются до выполнения процедур отсечения. В трехмерном случае каждая граница отсечения нормированного объема наблюдения представляет собой плоскость, параллельную одной из декартовых плоскостей, вне зависимости от типа проекции и исходной формы объема наблюдения. В зависимо- сти от того, нормирован объем наблюдения в единичный куб или в симметричный
7.11. Трехмерные алгоритмы отсечения 557 куб со стороной 2, плоскости отсечения проходят через точки с координатами 0 и 1 или -1 и 1. Для симметричного куба уравнения трехмерных плоскостей отсечения записываются так: ^min = ~ 1, Z^min — £'штах ~ 1) У^тах ~ ZWmax = 1- (7-43) Границы отсечения по х и у — это нормированные границы отсекающего окна, а гра- ницы отсечения по z — это нормированные положения ближней и дальней плоскостей отсечения. В алгоритме отсечения для трехмерного наблюдения определяются и записыва- ются все участки объектов, попадающие в нормированный объем наблюдения, для отображения на устройстве вывода. Все части объектов, расположенные вне плоско- стей отсечения объема наблюдения, удаляются. Отметим, что алгоритмы трехмерного отсечения являются расширением двухмерных методов, в которых вместо линейных границ нормированного отсекающего окна используются нормированные граничные плоскости объема наблюдения. ОТСЕЧЕНИЕ В ТРЕХМЕРНЫХ ОДНОРОДНЫХ КООРДИНАТАХ Графические библиотеки обрабатывают пространственные точки в четырехмерных однородных координатах, поэтому все преобразования можно представить матрицами 4 на 4. При поступлении каждой точки на конвейер наблюдения она преобразуется в четырехмерное представление: (ж,у,г) (ж,у,и,1). После того как точка прошла геометрические преобразования, преобразования на- блюдения и проектирования, она записывается в такой однородной форме: (7-44) где матрица М представляет свертку всех различных преобразований из внешних координат в нормированные, однородные координаты проекции, причем однородный параметр h уже может быть не равным 1. Фактически h может иметь любое действи- тельное значение в зависимости от того, как представлены объекты сцены, и какой тип проекции используется.
558 Глава 7. Трехмерное наблюдение Рис. 7.56. Возможное упорядочение границ отсечения объема наблюдения, соответствующих разрядам кода области Если однородный параметр h равен 1, однородные координаты аналогичны де- картовым координатам проекции. Такая ситуация часто возникает при параллельном проектировании. Однако перспективная проекция дает однородный параметр, кото- рый является функцией координаты z любой точки пространства. Однородный па- раметр перспективной проекции может даже быть отрицательным. Так бывает, когда точки располагаются за центром проекции. Кроме того, представления поверхностей объектов рациональными сплайнами часто формулируются в однородных коорди- натах, где однородный параметр может быть положительным или отрицательным. Следовательно, если отсечение выполняется в координатах проекции после деления на однородный параметр h, некоторая координатная информация может теряться, и объекты не будут отсекаться корректно. Чтобы эффективно обрабатывать все возможные проекционные преобразования и представления объектов, следует применить процедуры отсечения к представлению точек пространства в однородных координатах. Кроме того, поскольку все объемы на- блюдения можно преобразовать в нормированный куб, на аппаратном уровне можно реализовать единственную процедуру отсечения, обрабатывающую объекты в одно- родных координатах нормированными плоскостями отсечения. ТРЕХМЕРНЫЕ КОДЫ ОБЛАСТЕЙ Расширим концепцию кода области (раздел 6.7) на три измерения, просто введя пару дополнительных разрядов для учета ближней и дальней плоскостей отсечения. Таким образом, теперь будет использоваться шестиразрядный код области, как показано на рис. 7.56. Разряды в этом примере нумеруются справа налево и соответствуют левой, правой, нижней, верхней, ближней и дальней плоскостям отсечения (в таком порядке). Условия для выбора значений разрядов по сути те же, что описаны в разде- ле 6.7, только добавляется два новых условия для ближней и дальней отсекающих плоскостей. Для трехмерной сцены, однако, процедуры отсечения нужно применять к координатам проекции, которые преобразованы в нормированное пространство. После проектирования каждая точка сцены представляется четырьмя компонента- ми Р = (xh,yhi zh,h)- Если отсечение выполняется по границам нормированного симметричного куба (уравнения (7.43)), точка будет находиться внутри этого норми-
7.11. Трехмерные алгоритмы отсечения 559 рованного объема наблюдения при условии, что координаты проекции точки удовле- творяют следующим шести неравенствам: Xh h УН h (7.45) -1<^<1. h Если все сделано без ошибок, значение однородного параметра h не равно нулю. Пе- ред реализацией процедур, в которых фигурируют коды областей, можно проверить, не имеет ли однородный параметр нулевое или просто очень маленькое значение. Кроме того, однородный параметр может быть положительным или отрицательным. Следовательно, предполагая, что h / 0, предыдущие неравенства можно записать в такой форме: —h < < h, ~h<yh< h, —h < zh < h если h > 0, h < Xh < —h, h<yh < ~h, h< zh< -h если h < 0. (7.46) В большинстве случаев h > 0, и тогда с точками можно следующим образом сопо- ставлять значения разрядов в коде области: бит 1 = 1, бит 2=1, бит 3 = 1, бит 4=1, бит 5 = 1, бит 6=1, если h + Xh < C 0 (левая), если h — Xh < C 0 (правая), если h + уь < C 0 (нижняя), если h — уь < ; 0 (верхняя), если h + Zh < ; 0 (ближняя), если h — Zh < : 0 (дальняя). (7-47) Данные значения можно определить, используя тот же подход, что и при двухмерном отсечении. Следовательно, просто находится бит знака одного из выражений h zE Xh, Н±уь или Л± Zh, и на его основе устанавливается соответствующее значение разря- да кода области. На рис. 7.57 указаны все 27 кодов области для объема наблюдения. В тех случаях, когда для некоторой точки h < 0, отсечение можно выполнять, ис- пользуя второй набор неравенств из уравнения (7.46), или же можно инвертировать координаты и провести отсечение с помощью проверок для h > 0. ТРЕХМЕРНОЕ ОТСЕЧЕНИЕ ТОЧЕК И ЛИНИЙ Для обычных точек и отрезков, определенных на сцене, которая не лежит позади центра проекции, все однородные параметры положительны, и коды областей можно установить, используя условия (7.47). Затем, определив для каждой точки на сцене код области, можно легко найти положения точек, входящих или не входящих в объ- ем наблюдения. Например, код области 101000 сообщает, что точка находится над объемом наблюдения и позади него, а код области 000000 указывает на внутреннюю
560 Глава 7. Трехмерное наблюдение 011001 011000 011010 010001 010000 010010 010101 010100 010110 а) коды области перед ближней плоскостью 001001 001000 001010 000001 000000 000010 000101 000100 000110 б) коды области между ближней и дальней плоскостью 101001 101000 101010 100001 100000 100010 100101 100100 100110 в) коды области за дальней плоскостью Рис. 7.57. Значения трехмерного шестиразрядного кода области, идентифицирующие простран- ственные положения относительно границ объема наблюдения точку объема (рис. 7.57). Следовательно, при отсечении точек просто удаляются те точки, код области которых не равен 000000. Другими словами, если любая из про- верок (7.47) дает отрицательный результат, точка находится вне объема наблюдения. Методы трехмерного отсечения линий, по сути, не отличаются от методов отсе- чения двухмерных линий. Вначале можно проверить коды области конечных точек на предмет тривиального принятия или отбрасывания линии целиком. Если код обла- сти обеих конечных точек линии равен 000000, линия полностью находится внутри объема наблюдения. Аналогично линию можно тривиально принять, если примене- ние операции логического ИЛИ к кодам области двух конечных точек дает 0. Также можно тривиально отбросить линию, если применение операции логического И к двум кодам конечных точек дает ненулевое значение. Данное значение указывает, что оба кода имеют значение 1 в одном разряде, следовательно, линия полностью лежит вне одной плоскости отсечения. Чтобы проиллюстрировать сказанное, обра- тимся к рис. 7.58, где отрезок от Рз до Р4 характеризуется кодами 010101 и 100110. Видно, что данная линия полностью находится под нижней плоскостью отсечения.
7.11. Трехмерные алгоритмы отсечения 561 Рис. 7.58. Трехмерные коды области для двух отрезков. Линия Р1Р2 пересекает пра- вую и верхнюю границы отсечения, а линия Р3Р4 целиком находится под нижней плоскостью отсечения Если линии не дают положительного ответа при двух указанных проверках, далее анализируется уравнение линии, на основе чего определяется, нужно ли сохранить какой-либо фрагмент данной линии. Уравнения трехмерных отрезков удобно выразить в параметрической форме, а методы отсечения Кируса-Бека или Лианга-Барски (раздел 6.7) можно расши- рить на трехмерные сцены. Для отрезка с концами Pj = (хнъ у hi, z/ii, h\) и P2 = (xh2> yhi, zh2, ^2), можно записать следующее параметрическое уравнение, описывающее любую точку отрезка: Р = Р1 + (Р2-Р1)ц 0 < u < 1. (7.48) Если значение параметра отрезка равно и = 0, имеем точку Pi. Значение и = 1 соответствует другому концу отрезка Р2. Расписывая параметрическое уравнение отрезка явно через однородные координаты, получаем xh xhl Н” (xh2 xhl yh = У hl + (yh.2 - У hi)u, 0 < и < 1, (7.49) Zh = Zhl + (zh2 - Zhl)u, h = hi + (/i2 - hi)u. Используя коды области конечных точек отрезка, можно вначале определить, какие отсекающие плоскости он пересекает. Если код одного конца имеет значение 0 в определенном разряде, а код другого конца имеет в том же разряде значение 1, то
562 Глава 7. Трехмерное наблюдение линия пересекает соответствующую плоскость отсечения. Другими словами, одна из проверок (7.47) дает отрицательное значение, тогда как та же проверка для дру- гого конца дает неотрицательное значение. Чтобы найти точку пересечения с этой плоскостью отсечения, вначале используем подходящие уравнения из (7.49), чтобы определить соответствующее значение параметра и. Затем вычисляются координаты точки пересечения. В качестве примера расчета точки пересечения рассмотрим отрезок Р1Р2 на рис. 7.58. Данная линия пересекает правую плоскость отсечения, которую можно описать уравнением жтах = 1. Следовательно, чтобы определить значение параметра и в точке пересечения, нужно положить координату х-й проекции равной 1: хк _ xhi + (xh2 - xhr)u h + (Л2 - h\)u Вычисляя отсюда параметр и, получим: Xhl ^*1 и —--------------------------. (xhl - М - (xh2 - h2y (7.50) (7.51) Далее определяем значения ур и zp на этой плоскости отсечения, используя рассчи- танное значение и. В нашем случае значения ур и zp принадлежат границам ±1 объе- ма наблюдения, и линия не пересекает внутреннюю часть объема наблюдения. Таким образом, целью последующей обработки является локализация точки пересечения с верхней плоскостью отсечения. Соответствующие расчеты завершают обработку это- го отрезка, поскольку точка пересечения с верхней и правой плоскостями отсечения определяет часть отрезка, находящуюся внутри объема наблюдения, и все фрагменты отрезка, расположенные вне объема наблюдения. Когда линия пересекает границу отсечения, но не входит во внутреннюю часть объема наблюдения, обработка отрезка продолжается, как и в соответствующем двух- мерном алгоритме. Участок линии, расположенный вне этой границы отсечения, уда- ляется, и для части отрезка, находящейся внутри этой границы, обновляется инфор- мация по кодам области и значения параметра и. Затем проверяются оставшиеся участки линии с другими плоскостями отсечения на предмет возможного отклонения отрезка или поиска точки пересечения. Отрезки на трехмерных сценах обычно не появляются обособленно. Чаще всего они служат компонентами описания объемных объектов на сцене, и обработка линий является необходимой частью процедур отсечения поверхностей. ТРЕХМЕРНОЕ ОТСЕЧЕНИЕ МНОГОУГОЛЬНИКОВ В графических пакетах обычно обрабатываются только сцены, содержащие “графиче- ские объекты”. Так называются объекты, границы которых описываются линейными
7.11. Трехмерные алгоритмы отсечения 563 Рис. 7.59. Трехмерное отсечение объ- ектов. Участки поверхности, лежащие внутри плоскостей отсечения объема наблюдения, удаляются из описания объекта, при этом, возможно, потребу- ется построить новые грани уравнениям, так что каждый объект составлен из наборов многоугольных поверх- ностей. Следовательно, чтобы выполнить отсечение объектов на трехмерной сцене, процедуры отсечения применяются к многоугольным поверхностям. На рис. 7.59, например, подсвечены участки поверхности пирамиды, которые будут отрезаны, а пунктиром показаны участки многоугольных поверхностей, принадлежащие объему наблюдения. Вначале многогранник можно проверить на тривиальное принятие или откло- нение, используя его координатные границы, ограничивающую сферу или какую-то другую меру его координатных границ. Если координатные границы объекта принад- лежат всем границам отсечения, объект записывается целиком. Если все координат- ные границы лежат за любой из границ отсечения, весь объект удаляется. Когда объект нельзя принять или отбросить целиком, можно обработать спис- ки вершин набора многоугольников, определяющего поверхности объекта. Применяя методы, подобные описанным для двухмерного отсечения многоугольников, можно отсекать стороны, формируя новые списки вершин поверхностей объекта. Возможно, также придется создать несколько новых списков вершин для дополнительных по- верхностей, возникших в результате операций отсечения. Кроме того, таблицы мно- гоугольников обновляются, чтобы включить в них новые многоугольные поверхности и проверить информацию о связности и общих сторонах поверхностей. Чтобы упростить отсечение произвольных многогранников, многоугольные по- верхности часто делятся на треугольные участки и описываются треугольными фраг- ментами. В таком случае для отсечения можно использовать подход Сазерленда- Ходгмана, рассмотренный в разделе 3.15. Каждая полоса из треугольников обраба- тывается последовательно шестью плоскостями отсечения, и на выходе получается конечный список вершин полосы.
564 Глава 7. Трехмерное наблюдение Для вогнутых многоугольников можно применить методы расщепления (раз- дел 3.15) и получить, например, набор треугольников, а затем выполнить их отсе- чение. Как вариант, обработку вогнутых трехмерных многоугольников можно прово- дить с помощью алгоритма Уэйлера-Азертона, описанного в разделе 6.8. ТРЕХМЕРНОЕ ОТСЕЧЕНИЕ КРИВЫХ Как и при отсечении многогранников, вначале проверяется, не принадлежат ли ко- ординатные границы криволинейного объекта (например, сферы или сплайновой по- верхности) полностью объему наблюдения. Затем можно проверить, лежит ли объект полностью за одной из шести плоскостей отсечения. Если тривиально принять (отвергнуть) не удалось, нужно найти точки пересече- ния объекта с плоскостями отсечения. Для этого решается система уравнений поверх- ности и уравнения плоскости отсечения. По этой причине большинство графических пакетов не содержит процедур отсечения криволинейных объектов. Вместо этого криволинейные поверхности аппроксимируются набором многоугольных участков, а затем выполняется отсечение объекта с использованием процедур отсечения мно- гоугольников. При применении процедур визуализации поверхностей к многоуголь- ным участкам можно получить высокореалистичные изображения криволинейной поверхности. ПРОИЗВОЛЬНЫЕ ПЛОСКОСТИ ОТСЕЧЕНИЯ В некоторых графических пакетах для отсечения трехмерной сцены можно исполь- зовать дополнительные плоскости, которые могут иметь любую пространственную ориентацию. Данная возможность полезна во многих приложениях. Например, может потребоваться изолировать или вырезать объект неправильной формы, для создания спецэффекта удалить часть сцены под непрямым углом или вырезать фрагмент объ- екта по заданным осям, чтобы показать его внутреннее строение. Вместе с описанием сцены можно задать дополнительные плоскости отсечения, чтобы до преобразования проектирования можно было выполнить операции отсе- чения. Впрочем, это также означает, что процедуры отсечения реализованы на про- граммном уровне. Плоскость отсечения можно задать параметрами плоскости А, В, С и D. За- тем плоскость делит пространство на две части, и все части сцены, которые лежат с одной стороны плоскости, удаляются. Предположим, что отсекаются объекты за плоскостью, тогда со сцены удаляется любая точка (ж, у, z), удовлетворяющая сле- дующему неравенству: Ах + By + Cz + D < 0. (7.52)
7.11. Трехмерные алгоритмы отсечения 565 Рис. 7.60. Отсечение отрезка плоско- стью с вектором нормали N В качестве примера рассмотрим массив параметров плоскости (А, В, С, D} — (1,0; 0,0; 0,0; 8,0). В этом случае любая точка, удовлетворяющая условию х + 8,0 < 0,0 (или х < —8,0), удаляется со сцены. Чтобы усечь отрезок, вначале проверяются два его конца — может, он полностью лежит за плоскостью или перед ней. Неравенство (7.52) можно представить в вектор- ной форме, используя вектор нормали N = (А, В, С). Получив отрезок с концами Р] и Рг, его можно полностью отбросить, если для обоих концов справедливо условие: N • Pfc + Л < О, к = 1,2. (7.53) Вся линия сохраняется, если оба ее конца удовлетворяют условию N • Pfe + D > 0, А: = 1,2. (7.54) В противном случае концы отрезка лежат по разные стороны плоскости отсечения, как показано на рис. 7.60, и нужно вычислять точку пересечения. Чтобы вычислить точку пересечения линии с плоскостью отсечения, можно ис- пользовать следующее параметрическое представление отрезка: Р = Pi + (Р2 - Pi)u, 0<ц<1. (7.55) Точка Р находится на плоскости отсечения, если она удовлетворяет уравнению плос- кости: N • Р + D = 0. (7.56)
566 Глава 7. Трехмерное наблюдение Рис. 7.61. Отсечение по- верхностей пирамиды плос- костью с вектором норма- ли N, Поверхности перед плоскостью сохраняются, а за ней — удаляются Подставляя выражение для Р из формулы (7.55), получаем N • [Pt + (Р2 - Pju] + 0 = 0. (7.57) Находя из этого уравнения параметр и, получаем -D-N • Pi N - (Р2-Р!)' (7.58) Далее это значение и подставляется в векторное параметрическое представление линии (7.55), и получаются координаты х, у и z точки пересечения. Для примера, по- казанного на рис. 7.60, участок линии от Pi to Р отсекается и сохраняется фрагмент от Р до Р2. К многограннику, например, пирамиде, показанной на рис. 7.61, применяются сходные процедуры отсечения. Вначале проверяется, лежит ли объект полностью за или перед плоскостью отсечения. Если нет, для каждой поверхности многоугольника обрабатывается список вершин. К каждой стороне многоугольника последовательно применяются методы отсечения линий, и в результате получаются списки вершин поверхностей. В рассмотренном выше случае такая операция выполнялась только для одной плоскости отсечения.
7.12. Дополнительные плоскости отсеченияв OpenGL 567 Отсечение криволинейного объекта одной плоскостью отсечения легче отсечения объекта шестью плоскостями объема наблюдения. Однако в этом случае все равно приходится решать систему нелинейных уравнений для поиска точек пересечения, если не аппроксимировать криволинейные границы прямыми отрезками. 7.12. ДОПОЛНИТЕЛЬНЫЕ ПЛОСКОСТИ ОТСЕЧЕНИЯ В OpenGL Помимо шести плоскостей отсечения, замыкающих объем наблюдения, OpenGL позволяет задавать на сцене дополнительные плоскости отсечения. В отличие от плоскостей отсечения объема наблюдения, каждая из которых перпендикулярна од- ной из координатных осей, данные дополнительные плоскости могут иметь любую ориентацию. Чтобы ввести дополнительную плоскость отсечения и активизировать отсечение по этой плоскости, используется следующий оператор. glClipPlane (id, planeParameters); glEnable (id); Параметр id используется как идентификатор плоскости отсечения. Ему присва- ивается одно из значений GL_CLIP_PLANEO, GL_CLIP_PLANE1 и так далее до максимальной глубины. Сама плоскость определяется с использованием четырех- элементного массива planeParameters, состоящего из чисел двойной точности с плавающей запятой — параметров уравнения плоскости А, В, С и D. Чтобы отклю- чить активизированную плоскость, имеющую идентификатор id, используется такое выражение. glDisable (id); Параметры плоскости А, В, С и D преобразуются в координаты наблюдения и используются для проверки в координатах наблюдения точек сцены. Последующие изменения параметров наблюдения или геометрических преобразований не влияют на записанные параметры плоскости. Следовательно, если задать дополнительные плоскости отсечения до геометрических преобразований или преобразований наблю- дения, записанные параметры плоскости будут такими же, как входные параметры. Кроме того, поскольку процедуры отсечения для этих плоскостей применяются в Координатах наблюдения, а не в нормированном координатном пространстве, произ- водительность программы может снизиться при активизации дополнительных плос- юстей отсечения. Любая точка, расположенная за активизированной плоскостью отсечения, удаля- ется. Таким образом, точка с координатами в системе (г, у, z) отсекается, если она Удовлетворяет условию (7.52).
568 Глава 7. Трехмерное наблюдение В любой реализации OpenGL доступны шесть дополнительных плоскостей от- сечения, но их может быть и больше. Чтобы узнать, сколько дополнительных плос- костей отсечения доступны в конкретной реализации OpenGL, используется следую- щий запрос: glGetlntegerv (GL_MAX_CLIP_PLANES, numPlanes); Параметр numPlanes — это имя массива целых чисел, в который вернется це- лое значение, равное числу дополнительных плоскостей отсечения, которые мож- но использовать. По умолчанию в функции glClipPlane параметрам отсекающей плоскости А, В, С и D присвоены нулевые значения для всех дополнительных плоскостей. Кроме того, изначально все дополнительные плоскости отсечения отключены. 7.13. РЕЗЮМЕ Процедуры наблюдения для трехмерных сцен имеют ту же структуру, что и при двухмерном наблюдении. Вначале создается сцена во внешних координатах (либо по определениям объектов в модельных координатах, либо сцена строится непо- средственно во внешней системе координат). Затем задается система наблюдения, и описания объектов переводятся из внешних координат в координаты наблюдения. По- сле этого описания объектов обрабатываются различными процедурами и в конечном итоге переводятся в координаты устройства. В отличие от двухмерного при трехмерном наблюдении требуются процедуры проектирования для преобразования описаний объектов на плоскость наблюдения (плоскость проекции) перед преобразованием в координаты устройства. Кроме того, в операциях трехмерного наблюдения фигурирует больше пространственных пара- метров, для описания которых можно использовать аналогию с камерой. Система наблюдения задается центром проекции (положение камеры), вектором нормали к плоскости наблюдения N (направление линз камеры) и вектором верха V (“верх” камеры). Положение плоскости наблюдения устанавливается вдоль оси z системы наблюдения, и описания объектов проектируются на эту плоскость. Для перевода описаний объектов на плоскость наблюдения можно использовать методы параллель- ного или перспективного проектирования. Параллельные проекции бывают ортографическими или косоугольными, и их можно задавать вектором проекции. Ортографические параллельные проекции, на которых наблюдается несколько граней объекта, называются аксонометрическими. Чтобы получить изометрическое изображение объекта, используется аксонометриче- ская проекция, которая представляет с одинаковой перспективой все главные оси. Широко используемыми косоугольными проекциями являются косоаксонометриче- ская и кабинетная проекции. Перспективные проекции объектов получаются с помо- щью линий проекции, которые сходятся в центр проекции. В параллельных проекци-
Литература 569 ях сохраняются пропорции объектов, а перспективные проекции уменьшают размер удаленных объектов. При перспективном проектировании кажется, что параллельные линии сходятся в точку схождения, при условии, что линии не параллельны плоско- сти наблюдения. Можно получать инженерные и архитектурные изображения с одно-, двух- или трехточечными перспективными проекциями в зависимости от числа глав- ных осей, которые пересекает плоскость наблюдения. Косоугольная перспективная проекция получается тогда, когда линия, соединяющая центр проекции с центром отсекающего окна, не перпендикулярна плоскости наблюдения. Объекты трехмерной сцены можно обрезать объемом наблюдения, чтобы устра- нить нежелательные участки сцены. Верх, низ и боковые стороны объема наблюдения формируются плоскостями, которые параллельны линиям проекции и проходят через стороны отсекающего окна. Для создания замкнутого объема наблюдения использу- ются ближняя и дальняя (передняя и задняя) плоскости. При параллельной проекции объем наблюдения является параллелепипедом, при перспективной — усеченной пи- рамидой. В любом случае объем наблюдения можно преобразовать в нормированный куб, границы которого проходят по каждой оси в точках с координатами 0 и 1 или -1 и 1. Эффективные алгоритмы отсечения обрабатывают объекты сцены ограничи- вающими плоскостями нормированного объема наблюдения. В графических пакетах отсечение обычно выполняется в четырехмерных однородных координатах с после- дующим проектированием и нормировкой объема наблюдения. Затем однородные координаты преобразуются в трехмерные декартовы координаты проекции. Чтобы убрать выбранные части сцены или получить спецэффекты, можно использовать до- полнительные плоскости отсечения с произвольной ориентацией. Чтобы задать параметры наблюдения, используется функция трехмерного на- блюдения из библиотеки OpenGL Utility (табл. 7.1). Данная библиотека включает функцию для задания симметричной перспективной проекции. Еще три функции наблюдения есть в стандартной библиотеке OpenGL, и с их помощью задается ор- тографическая проекция, произвольная перспективная проекция и дополнительные плоскости отсечения. Резюме по функциям наблюдения OpenGL, рассмотренным в данной главе, приведено в табл. 7.1. Кроме того, в таблице указано несколько род- ственных функций. ЛИТЕРАТУРА Обсуждение алгоритмов трехмерного наблюдения и отсечения можно найти в работах [73, 191, 380, 381]. Алгоритмы отсечения в однородных координатах описаны в публикациях [29, 33-35, 285]. Различные техники программирования трехмерного наблюдения изучаются в сборниках [8, 122, 151, 176, 244]. Полный перечень функций трехмерного наблюдения OpenGL предлагается в справочнике [320]. Примеры программирования в OpenGL с использованием трехмерного наблюдения приводятся в книге [400]. Дополнительные примеры программирования можно найти на Web-сайте Нейта Робинса (Nate Robins): http: //www. cs . Utah. edu/~narobins/opengl .html.
570 Глава 7. Трехмерное наблюдение ТАБЛИЦА 7.1. Резюме по функциям трехмерного наблюдения OpenGL Функция Описание gluLookAt Задает параметры трехмерного наблюдения glOrtho Задает параметры отсекающего окна, а также ближней и дальней плоскостей отсечения для ортогональной проекции gluPerspective Задает угол поля обзора и другие параметры симметричной перспективной проекции glFrustum Задает параметры отсекающего окна, а также ближней и дальней плоскостей отсечения для перспективной проекции (симметричной или косоугольной) glClipPlane Задает параметры дополнительной плоскости отсечения УПРАЖНЕНИЯ 7.1. Напишите процедуру формирования матрицы, переводящей точки с внешними координа- тами в трехмерные координаты наблюдения для данных Рц, N и V. Вектор верха может иметь любое направление, не параллельное N. 7.2. Создайте процедуру преобразования вершин многогранника в координаты проекции, ис- пользуя параллельную проекцию с любым заданным вектором проекции. 7.3. Разработайте процедуру получения различных параллельных проекций многогранника по- сле поворота на заданный угол. 7.4. Напишите процедуру построения одноточечной перспективной проекции объекта. 7.5. Разработайте процедуру построения двухточечной перспективной проекции объекта. 7.6. Создайте процедуру построения трехточечной перспективной проекции объекта. 7.7. Напишите процедуру преобразования усеченной пирамиды перспективной проекции в пра- вильный параллелепипед. 7.8. Модифицируйте двухмерный алгоритм отсечения линий Коэна-Сазерленда для отсечения трехмерных линий нормированным симметричным объемом наблюдения. 7.9. Модифицируйте двухмерный алгоритм отсечения линий Лианга-Барски для отсечения трех- мерных линий заданным прямоугольным параллелепипедом. 7.10. Модифицируйте двухмерный алгоритм отсечения линий Лианга-Барски для отсечения дан- ного многогранника заданным прямоугольным параллелепипедом. 7.11. Напишите процедуру выполнения отсечения линии в однородных координатах.
Упражнения 571 7.12. Разработайте алгоритм отсечения многогранника определенной усеченной пирамидой. Срав- ните операции, необходимые в этом алгоритме, с операциями в алгоритме отсечения пря- моугольным параллелепипедом. 7.13. Расширьте алгоритм Сазерленда-Ходгмана на отсечение вогнутого многогранника норми- рованным симметричным объемом наблюдения. 7.14. Реализуйте алгоритм, написанный в предыдущем упражнении. 7.15. Напишите процедуру отсечения многогранника в однородных координатах. 7.16. Модифицируйте программу из раздела 7.10, чтобы пользователь мог задавать вид на квад- рат — спереди или сзади. 7.17. Модифицируйте программу из раздела 7.10, чтобы пользователь мог вводить параметры перспективного наблюдения. 7.18. Модифицируйте программу из раздела 7.10, чтобы она давала проекцию любого введенного многогранника. 7.19. Модифицируйте программу из предыдущего упражнения, чтобы она давала проекцию мно- гогранника с использованием ортографической проекции. 7.20. Модифицируйте программу из предыдущего упражнения, чтобы она давала проекцию мно- гогранника с использованием косоугольной параллельной проекции.
Представления трехмерных объектов Построенная средствами компьютерной графики комнатная сцена, содержащая объекты, смоделированные с помощью различных трехмерных представлений (перепечатано с разрешения Autodesk, Inc.)
8.1. Многогранники 8.17. Отображения сплайновых кривых и 8.2. Функции многогранников OpenGL поверхностей 8.3. Криволинейные поверхности 8.18. Функции OpenGL аппроксимации 8.4. Поверхности второго порядка сплайнами 8.5. Суперквадрики 8.19. Заметающие представления 8.6. Функции OpenGL поверхностей второго 8.20. Методы конструктивной блочной и третьего порядка геометрии 8.7. Каплевидные объекты 8.21. Октодеревья 8.8. Сплайновые представления 8.22. BSP-деревья 8.9. Методы интерполяции кубическими 8.23. Методы фрактальной геометрии сплайнами 8.24. Грамматики форм и другие 8.10. Сплайновые кривые Безье процедурные методы 8.11. Поверхности Безье 8.25. Системы многих частиц 8.12. Би-сплайновые кривые 8.26. Физическое моделирование 8.13. Би-сплайновые поверхности 8.27. Визуализация наборов данных 8.14. Бета-сплайны 8.28. Резюме 8.15. Рациональные сплайны 8.16. Преобразование сплайновых представлений рафические сцены могут содержать объекты и материальные поверхно- сти множества различных типов: деревья, облака, скалы, вода, кирпичи, деревянные панели, резина, бумага, мрамор, сталь, стекло, пластик и одежда — это лишь некоторые из них. Поэтому не стоит удивляться, что не существует единого универсального метода, включающего все характеристики данных различных материалов, с помощью которого можно описывать все объекты. Многоугольные и квадратичные поверхности позволяют точно описать такие про- стые евклидовы объекты, как многогранники и эллипсоиды; сплайновые поверхности и методы конструктивной блочной геометрии полезны при разработке крыльев само- летов, зубчатых передач и других инженерных структур с криволинейными поверх- ностями; такие процедурные методы, как фрактальные построения и использование систем многих частиц, позволяют моделировать особенности рельефа, облака, зарос- ли травы и другие природные объекты; в методах физического моделирования (phys- ically based modeling) системы взаимодействующих сил используются для описания нежесткого поведения деталей одежды или капли желе; кодирование с помощью ок-
574 Глава 8. Представления трехмерных объектов тодерева используется для представления внутренних особенностей структуры, полу- ченных, например, по медицинским изображениям компьютерной томографии; кроме того, чтобы визуально представить трехмерные дискретные наборы данных, исполь- зуются изображения в горизонталях, объемная визуализация и другие методы. Схемы представления твердых объектов часто делятся на две широкие категории, хотя не все представления можно строго отнести к той или иной категории. Контур- ные представления (boundary representations, В-rep) описывают трехмерный объект как набор поверхностей, отделяющих внутреннюю часть объекта от среды. Типич- ные примеры контурных представлений — описание через грани многоугольника и сплайновые участки. Представления с разбиением пространства (space-partitioning representation) позволяют описывать внутренние свойства через разбиение области пространства, содержащей объект, на набор небольших неперекрывающихся непре- рывных объемных тел (обычно кубов). Распространенным описанием трехмерного объекта с разбиением пространства является представление в форме октодерева (oc- tree). В данной главе рассмотрены особенности различных схем представления и то, как они используются в приложениях компьютерной графики. 8.1. МНОГОГРАННИКИ Наиболее распространенным контурным представлением трехмерного графического объекта является указание набора поверхностей-многоугольников, огораживающих внутреннюю часть объекта. Многие графические системы хранят все описания объ- ектов именно в форме наборов многоугольных поверхностей. Это упрощает и уско- ряет визуализацию поверхности и отображение объектов, поскольку все поверхности описываются линейными уравнениями. По этой причине многоугольные описания часто называются стандартными графическими объектами. В некоторых случаях многоугольное представление является единственным доступным, но многие пакеты также позволяют описывать поверхности объектов с помощью других схем, напри- мер, с использованием сплайновых поверхностей, которые обычно преобразуются в многоугольные представления с целью обработки в конвейере наблюдения. Чтобы описать объект как набор многоугольных граней, нужно указать коорди- наты вершин всех многоугольных участков поверхности объекта. Затем для каждого многоугольника координаты вершин и информация по краям участков поверхности записываются в таблицы (раздел 3.15) вместе с информацией о векторе нормали к поверхности. Некоторые графические пакеты предлагают процедуры, позволяющие генерировать сетки из многоугольных поверхностей — наборов треугольников или четырехугольников. Так можно описывать большие участки поверхности, ограничи- вающей объект, или даже всю поверхность с помощью одной команды. Кроме того, некоторые пакеты также предлагают процедуры вывода на экран таких распростра- ненных форм, как куб, сфера или цилиндр, представленных многоугольными по- верхностями. В серьезных графических системах используются быстрые аппаратные
8.2. Функции многогранников OpenGL 575 реализации схем визуализации с помощью многоугольников, что позволяет отобра- жать миллион или даже больше затененных многоугольников (обычно треугольников) за секунду, включая наложение текстуры на поверхность и применение специальных эффектов освещения. ФУНКЦИИ МНОГОГРАННИКОВ OpenGL Многоугольные поверхности в программе OpenGL можно задать двумя способами. С помощью многоугольных примитивов, рассмотренных в разделе 3.16, можно сгенери- ровать множество форм многоугольников и сеток поверхностей. Кроме того, можно использовать функции GLUT вывода на экран пяти правильных многогранников. ФУНКЦИИ OpenGL ЗАПОЛНЕНИЯ ОБЛАСТИ МНОГОУГОЛЬНИКА Чтобы ввести набор многоугольных участков для фрагмента поверхности объ- екта или полное описание многогранника, можно использовать константы (примитивы) OpenGL GL_POLYGON, GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUADS и GL_QUAD_STRIP. Таким образом можно, на- пример, представить боковую поверхность цилиндра в виде мозаичной структуры с помощью четырехугольной полоски. Аналогично все стороны параллелограмма можно описать набором многоугольников, а все грани треугольной пирамиды задать с помощью набора связанных треугольных поверхностей. ФУНКЦИИ GLUT ПРАВИЛЬНЫХ МНОГОГРАННИКОВ В процедурах библиотеки GLUT предопределены некоторые стандартные формы (пять правильных многогранников). Отличительной особенностью данных много- гранников, также называемых телами Платона, является то, что все грани любого правильного многогранника — идентичные правильные многоугольники. Следова- тельно, все стороны правильного многогранника равны, все плоские углы при верши- нах равны, и все углы между гранями также равны. Многогранники названы согласно числу граней: правильный тетраэдр (или треугольная пирамида, 4 грани), правильный гексаэдр (или куб, 6 граней), правильный октаэдр (8 граней), правильный додекаэдр (12 граней) и правильный икосаэдр (20 граней). Библиотека GLUT предлагает 10 функций генерации названных тел: пять функ- ций дают каркасные объекты, пять отображают грани многогранников как затененные закрашенные области. Характеристики закрашиваемой области определяются свой- ствами материала и условиями освещения, заданными для сцены. Все правильные многогранники описываются в модельных координатах, так что все они центрирова- ны в начале внешней системы координат.
576 Глава 8. Представления трехмерных объектов Чтобы получить четырехгранную правильную треугольную пирамиду, использу- ется одна из следующих двух функций: glutWireTetrahedron ( ); или glutSolidTetrahedron ( ); Центр данного многогранника совпадает с началом внешней системы координат, а радиус (расстояние от центра тетраэдра до любой вершины) составляет \/3. Шестисторонний правильный гексаэдр (куб) отображается с помощью функций glutWireCube (edgeLength); или glutSolidCube (edgeLength); Параметру edgeLength может присваиваться любое положительное значение двой- ной точности с плавающей запятой, а центр куба находится в начале координат. Чтобы отобразить восьмигранный правильный октаэдр, вызывается одна из сле- дующих команд: glutWireOctahedron ( ); или glutSolidOctahedron ( ); Данный многогранник имеет равносторонние треугольные грани, а его радиус (рас- стояние от центра октаэдра до любой вершины) равен 1. Двенадцатигранный додекаэдр, центрированный в начале глобальной системы координат, генерируется командой glutWireDodecahedron ( ); или glutSolidDodecahedron ( ); Каждая грань данного многогранника — пятиугольник. Следующие две функции генерируют двадцатигранный правильный икосаэдр. glutWirelcosahedron ( ); или glutSolidlcosahedron ( ); По умолчанию радиус (расстояние от центра многогранника в начале координат до любой вершины) икосаэдра равен 1, а все его грани — равносторонние треугольники.
8.2. Функции многогранников OpenGL 577 Рис. 8.1. Перспективная про- екция пяти многогранников GLUT, масштабированных и размещенных в окне на экране дисплея с помощью про- цедуры displayWirePoly- hedra ПРИМЕР ПРОГРАММЫ GLUT ПОСТРОЕНИЯ МНОГОГРАННИКОВ В приведенной ниже программе с помощью функций GLUT вывода на экран тел Пла- тона генерируются преобразованные каркасные перспективные изображения данных многогранников. Все пять тел размещаются в пределах одного окна (рис. 8.1). ♦include <GL/glut.h> GLsizei winWidth = 500, winHeight = 500; /* Исходный размер окна. */ void init (void) { glClearColor (1.0, 1.0, 1.0, 0.0); // Белое окно на экране. ) void displayWirePolyhedra (void) { glClear (GL_COLOR_BUFFER_BIT); // Очистить окно. glColor3f (0.0, 0.0, 1.0); // Сделать цвет линий синим. /* Задать преобразование точки наблюдения. */ gluLookAt (5.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
578 Глава 8. Представления трехмерных объектов /* Масштабировать куб и отобразить его в виде * каркасного параллелепипеда. */ glScalef (1.5, 2.0, 1.0); glutWireCube (1.0); /* Масштабировать, транслировать и отобразить * каркасный додекаэдр. */ glScalef (0.8, 0.5, 0.8); glTranslatef (-6.0, -5.0, 0.0); glutWireDodecahedron ( ); /* Транслировать и отобразить каркасный тетраэдр. */ glTranslatef (8.6, 8.6, 2.0); glutWireTetrahedron ( ); /* Транслировать и отобразить каркасный октаэдр. */ glTranslatef (-3.0, -1.0, 0.0); glutWireOctahedron ( ); /* Масштабировать, транслировать и отобразить * каркасный икосаэдр. */ glScalef (0.8, 0.8, 1.0); glTranslatef (4.3, -2.0, 0.5); glutWirelcosahedron ( ); glFlush ( ); } void winReshapeFcn (GLint newWidth, GLint newHeight) { glViewport (0, 0, newWidth, newHeight); glMatrixMode (GL_PROJECTION); glFrustum (-1.0, 1.0, -1.0, 1.0, 2.0, 20.0); glMatrixMode (GL_MODELVIEW); glClear (GL_COLOR_BUFFER_BIT); } void main (int argc, char** argv) { glutlnit (&argc, argv); glutlnitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutlnitWindowPosition (100, 100); glutlnitWindowSize (winWidth, winHeight); glutCreateWindow ("Каркасные многоугольники"); init ( ) ; glutDisplayFunc (displayWirePolyhedra); glutReshapeFunc (winReshapeFcn); glutMainLoop ( ); }
8.4. Поверхности второго порядка 579 Ось г Р = U, у. г) Ось у .41 Ось л Рис. 8.2. Точка с параметрическими координатами (г,(?,ф) на поверх- ности сферы радиуса г КРИВОЛИНЕЙНЫЕ ПОВЕРХНОСТИ Уравнения объектов с криволинейными границами можно выразить в параметри- ческой или непараметрической форме (необходимая информация дается в прило- жении А, где также сравниваются параметрические и непараметрические представ- ления). В число различных объектов, часто полезных в графических приложениях, входят поверхности второго порядка (квадрики), суперквадрики, полиномиальные и показательные функции, сплайновые поверхности. Данные входные описания объ- ектов обычно представляются в мозаичной форме, что позволяет аппроксимировать поверхности многоугольными сетками. ПОВЕРХНОСТИ ВТОРОГО ПОРЯДКА Одним из наиболее часто используемых является класс объектов, включающий по- верхности второго порядка (квадрики), которые описываются уравнениями второго порядка (квадратными). Эти поверхности включают сферы, эллипсоиды, торы, пара- болоиды и гиперболоиды. Поверхности второго порядка, особенно сферы и эллип- соиды, часто присутствуют на графических сценах, и в графических пакетах обычно реализуются процедуры генерации этих поверхностей. Кроме того, поверхности вто- рого порядка можно получить с помощью рациональных сплайнов. СФЕРА В декартовых координатах сферическая поверхность радиуса г с центром в начале координат определяется как набор точек (х, у, z), удовлетворяющих уравнению: 2,2,2 2 X + у + Z = Г . (8.1) Сферическую поверхность можно также описать в параметрической форме, исполь- зуя углы широты и высоты (рис. 8.2): х = rcos(/)cos6, — 7г/2 < ф < тг/2;
580 Глава 8. Представления трехмерных объектов Рис. 8.3. Другое определение сферических координат (г, в, ф) Z = Г sin ф. В параметрическом представлении в формуле (8.2) принят симметричный диапазон угловых параметров 0 и ф. В качестве альтернативного варианта параметрические уравнения можно записать, используя стандартные сферические координаты, где угол ф задается как дополнение до широты (рис. 8.3). В таком случае ф определено в диапазоне 0 < ф < тг, а диапазон 0 часто выбирается равным 0 < в < 2тг. Еще одно представление через параметры и и v, определенные в диапазоне от 0 до 1, можно получить с помощью замены ф = тги и 0 = 2тгп. ЭЛЛИПСОИД Эллипсоидальную поверхность можно описать как расширение сферической поверх- ности, где радиусы в трех взаимно перпендикулярных направлениях могут иметь различные значения (рис. 8.4). Декартово представление точек на поверхности эл- липсоида с центром в начале координат имеет вид: (8-3)
8.4. Поверхности второго порядка 581 Рис. 8.5. Тор с центром в начале координат, имеющий круговое сечение и ось, параллельную оси z Вид сверху Параметрическое представление эллипсоида через угол широты ф и угол долготы О (рис. 8.2) выглядит так: х = rx COS<^>COS0, у = ry cos<^>sin0, z = rz sin ф. - тг/2 < ф < тг/2\ — тг < 0 < тг; (8-4) ТОР Торам называется баранкообразный объект. Наиболее часто он описывается как по- верхность, полученная вращением окружности или эллипса вокруг компланарной осевой линии, не проходящей через коническое сечение. Определяющими парамет- рами тора являются расстояние от центра конического сечения до оси вращения и размеры конического сечения. Тор, полученный вращением окружности радиуса г в плоскости yz вокруг оси z, показан на рис. 8.5. Если центр окружности лежит на оси у, радиальное расстояние raxjai получающегося тора равно расстоянию от оси z (ось вращения) по оси у до центра окружности. Радиус сечения тора — это радиус порождающей окружности.
582 Глава 8. Представления трехмерных объектов Уравнение поперечного сечения тора (окружности), показанного на рис. 8.5 (про- екция сбоку), выглядит так: (У - 7'axial)2 + 22 = Г2. Вращая эту окружность вокруг оси z, получаем тор, точки на поверхности которого в декартовых координатах описываются следующим уравнением: (у/х2 + у2 - r^ial)2 + 22 = Г2. (8.5) Соответствующие параметрические уравнения для тора с круговым поперечным се- чением имеют вид: X = (/"axial + r COS ф) COS в, — 7Г < ф < 7Г; У = (/"axial + Т COS ф) sin в, - 7Г < 0 < 7Г; z = г sin ф. (8.6) Тор можно также получить вращением не окружности, а эллипса вокруг оси z. Урав- нение эллипса в плоскости yz, имеющего большую и малую полуось гу и rz, можно записать следующим образом: \ 2 / \ 2 У /"axial \ । f z \ гу ) где /"axial — расстояние от оси вращения z по оси у до центра эллипса. В результате получается тор, уравнение которого в декартовых координатах имеет такой вид: yjx2 + у2 - /"axial А ( ГУ ) \г* (8.7) Соответствующее параметрическое представление тора с эллиптическим поперечным сечением выглядит так: X = (/"axial + ry COS ф) COS в, — 7Г < ф < 7Г; У = (/"axial + ГУ cos ф) sin 9, - к < в < 7г; z = rz sin ф. (8.8) В записанном выше уравнении тора возможны дальнейшие модификации. Например, поверхность тора можно породить вращением окружности или эллипса по эллипти- ческой траектории относительно оси вращения.
8.5. Суперквадрики 583 8.5. Рис. 8.6. Суперэллипсы, полученные при различных значениях параметра s из диапазона 0,5-3,0 (Гл = Ту) СУПЕРКВАДРИКИ Данный класс объектов является обобщением поверхностей второго порядка (квад- рик). Для получения суперквадрик в уравнение поверхности второго порядка вводятся дополнительные параметры, что дает большую гибкость в настройке форм объектов. В уравнения кривых вводится один дополнительный параметр, а в уравнениях по- верхностей используются два новых параметра. СУПЕРЭЛЛИПС Представление суперэллипса в декартовых координатах получается из соответствую- щего уравнения эллипса, в котором степень х и у может меняться. Одним возможным решением является запись декартова уравнения суперэллипса в такой форме: / \ 2/s / \ 2/s I х\ , I =1 у / (8-9) X где параметр s может иметь любое действительное значение. При s = 1 получаем обычный эллипс. Соответствующие параметрические уравнения суперэллипса, представленного формулой (8.9), можно выразить как X = rx coss в, у = гу sins в. (8.10) На рис. 8.6 иллюстрируются суперэллиптические формы, которые можно сгенериро- вать, используя различные значения параметра s.
584 Глава 8. Представления трехмерных объектов СУПЕРЭЛЛИПСОИДЫ Декартово представление суперэллипсоида развивается из уравнения эллипсоида вве- дением в него двух степенных параметров: „ \ 2/s2 / \ 2/s2-i s2/si - + И) + rxJ \ryJ (8.11) При S] = S2 = 1 получается обычный эллипсоид. Далее можно записать соответствующее параметрическое представление супер- эллипсоида, выраженного формулой (8.11): х = rx cosS1 <^>cosS2 в, у = гу cosS1 фsinS2 в, z = rz sinS1 ф. — 7г/2 < ф < тг/2 — 7Г < 0 < 7Г (8.12) На рис. 8.7 иллюстрируются формы суперэллипсоидов, которые можно получить при различных значениях параметров sj и s^. Эти и другие суперквадрики можно объединять, создавая еще более сложные структуры, например, изображения мебели, болтов с нарезкой и других изделий. 8.6. ФУНКЦИИ OpenGL ПОВЕРХНОСТЕЙ ВТОРОГО И ТРЕТЬЕГО ПОРЯДКА Сферу и многие другие трехмерные объекты с поверхностями второго порядка можно вывести на экран, используя функции, включенные в наборы OpenGL Utility Toolkit (GLUT) и OpenGL Utility (GLU). Кроме того, GLLTT содержит одну функцию для отоб- ражения формы чайника, определенного с помощью бикубических участков поверх- ности. Все функции GLUT, которые легко внедрить в программу-приложение, имеют две версии. Один вариант каждой функции отображает каркасную поверхность, а дру- гой — представляет поверхность как визуализированный набор многоугольных участ- ков закрашенных областей. С помощью функций GLUT можно отобразить сферу, ко- нус, тор или чайник. Функции GLU поверхностей второго порядка несколько сложнее настроить, но они дают больше альтернатив — сферу, цилиндр, конический цилиндр, конус, плоское круговое кольцо (или шайбу) и участок кругового кольца (или диска). ФУНКЦИИ GLUT ПОВЕРХНОСТЕЙ ВТОРОГО ПОРЯДКА Сфера GLUT генерируется с помощью одной из следующих функций: glutWireSphere (г, nLongitudes, nLatitudes);
8.6. Функции OpenGL поверхностей второго и третьего порядка 585 .V/ 2,5 * J" ТО jt' 1,5 « «Й '•<> « f I I П' 0,0 0,5 1,0 1,5 2,0 2,5 si Рис. 8.7. Суперэллипсоиды, изображенные для разных значений параметров si и S2 из диапа- зона от 0,0 до 2,5 при гх = Ту = rz ИЛИ glutSolidSphere (г, nLongitudes, nLatitudes); Здесь радиус сферы определяется числом с плавающей запятой двойной точно- сти, присвоенным параметру г. Параметры nLongitudes и nLatitudes задают целое число линий долготы и широты, которые будут использоваться для аппрок- симации сферической поверхности четырехугольной сеткой. Стороны участков че- тырехугольной поверхности являются линейной аппроксимацией линий широты и долготы. Сфера определяется в модельных координатах, ее центр находится в начале внешней системы координат, а полярная ось проходит по оси z. Конус GLUT выводится на экран с помощью команды glutWireCone (rBase, height, nLongitudes, nLatitudes); или glutSolidCone (rBase, height, nLongitudes, nLatitudes); Радиус основания конуса и высота конуса выбираются равными значениям с плавающей запятой двойной точности, при этом используются параметры rbase и height соответственно. Как и при изображении сферы GLUT, параметрам nLongi- tudes и nLatitudes присваиваются целые значения, задающие число ортогональ- ных линий поверхности аппроксимирующей четырехугольной сетки. Линия долготы конуса является прямым отрезком, проходящим по поверхности конуса от вершины до основания и полностью лежащим в плоскости, содержащей ось конуса. Каждая линия широты отображается как набор прямых отрезков по периметру окружности на
586 Глава 8. Представления трехмерных объектов поверхности конуса, параллельной основанию конуса и лежащей на плоскости, пер- пендикулярной оси конуса. Конус описывается в модельных координатах, центр его основания находится в начале глобальной системы координат, а ось конуса проходит по оси z глобальной системы координат. Каркасное изображение тора с круговым поперечным сечением или изображение с затененными поверхностями получается с помощью команд glutWireTorus (rCrossSection, rAxial, nConcentrics, nRadialSlices) ; или glutSolidTorus (rCrossSection, rAxial, nConcentrics, nRadialSlices); Top, получаемый посредством указанных процедур GLUT, можно описать как поверхность, порожденную вращением окружности радиуса rCrossSection во- круг компланарной оси z, где расстояние от центра окружности до оси z равно rAxial (раздел 8.4). Размер тора (радиусы) в этих функциях GLUT выбирается с использованием значений двойной точности с плавающей запятой. Чтобы задать раз- мер четырехугольников в аппроксимирующей тор поверхностной сетке, параметрам nConcentrics и nRadialSlices присваиваются требуемые целые значения. Па- раметр nConcentrics задает число концентрических окружностей (с центром на оси z) на поверхности тора, а параметр nRadialSlices задает число радиальных сечений, проходящих через поверхность тора. Данные два параметра определяют число ортогональных линий сетки, проходящих по поверхности тора, причем линии сетки изображаются прямыми отрезками (границы четырехугольников), расположен- ными между точками пересечения. Отображаемый тор центрирован в начале внешней системы координат, а его ось идет по оси z внешней системы координат. ФУНКЦИЯ GLUT ИЗОБРАЖЕНИЯ ЧАЙНИКА С ПОМОЩЬЮ КУБИЧЕСКИХ ПОВЕРХНОСТЕЙ На заре развития методов компьютерной графики для описания нескольких трех- мерных объектов были построены наборы данных (представления через многоуголь- ные сетки), которые затем можно было использовать для проверки методов визуали- зации. Такие объекты включали поверхности автомобиля “Фольксваген” и чайник, разработанный в Университете штата Юта (США). Набор данных для чайника, по- строенного Мартином Ньюэллом (Martin Newell) в 1975 году, содержал 306 вершин, определяющих 32 бикубических участка поверхности Безье (раздел 8.11). Поскольку определение координат точек сложной поверхности является длительным процессом, эти наборы данных, особенно чайник в виде поверхностной сетки, стали широко использоваться.
8.6. Функции OpenGL поверхностей второго и третьего порядка 587 Чтобы отобразить чайник в виде сетки из более тысячи бикубических участков поверхности, используется одна из следующих двух функций GLUT: glutWireTeapot (size); или glutSolidTeapot (size); Поверхность чайника генерируется с использованием функций OpenGL построения кривых Безье (раздел 8.11). Параметр size устанавливает значение двойной точно- сти с плавающей запятой — максимальный радиус тела чайника. Чайник центрирован в начале внешней системы координат, а его вертикальная ось идет вдоль оси у. ФУНКЦИИ GLU ПОВЕРХНОСТЕЙ ВТОРОГО ПОРЯДКА Чтобы сгенерировать поверхность второго порядка с использованием функций GLU, нужно присвоить имя квадрике, активизировать процедуру визуализации поверхно- стей второго порядка GLU, а также задать значения параметров поверхности. Кроме того, можно указать значения других параметров, чтобы контролировать внешний вид поверхности второго порядка GLU. Приведенные ниже операторы иллюстрируют стандартную последовательность вызовов для отображения каркасной сферы с центром в начале внешней системы координат. GLUquadricObj *spherel; spherel = gluNewQuadric ( ); gluQuadricDrawStyle (spherel, GLU_LINE); gluSphere (spherel, r, nLongitudes, nLatitudes); Название объекта второго порядка определяется в первом операторе, и в данном при- мере выбрано имя spherel. Затем это имя можно использовать в других функциях GLU для обращения к этой конкретной поверхности второго порядка. Затем с помо- щью функции gluNewQuadric активизируется процедура визуализации поверхно- стей второго порядка, после чего с помощью команды gluQuadricDrawStyle для поверхности spherel выбирается режим отображения GLU_LINE. Таким образом, сфера выводится на экран в каркасной форме с отрезками между каждой парой вер- шин поверхности. Параметру г присваивается значение двойной точности (радиус сферы), и сферическая поверхность делится на набор многоугольных граней с помо- щью равномерно размещенных линий широты и долготы. Целое число линий долготы и широты задается в виде значений параметров nLongitudes и nLatitudes. Для отображения поверхностей GLU второго порядка доступны три других ре- жима отображения. Если использовать символьную константу GLU_POINT как аргу- мент функции gluQuadricDrawStyle, поверхность второго порядка отобразится
588 Глава 8. Представления трехмерных объектов в виде точечного графика. В каждой вершине поверхности, сформированной пересе- чением линии широты и линии долготы, ставится точка. Другой вариант — исполь- зовать символьную константу GLU_SILHOUETTE. В результате получится каркасное изображение с общими краями между двумя компланарными многоугольными граня- ми. Наконец, при использовании символьной константы GLU_FILL многоугольные участки отображаются как затененные закрашенные области. Изображения других примитивов GLU второго порядка формируются с исполь- зованием той же базовой последовательности команд. Чтобы получить изображения конуса, цилиндра или конического цилиндра, вместо функции gluSphere вызыва- ется функция gluCylinder (quadricName, rBase, rTop, height, nLongitudes, nLatitudes); Основание этого объекта лежит в плоскости ху (z = 0), а ось проходит по оси z. Радиус основания этой поверхности второго порядка задается в параметре rBase, а радиус вершины поверхности — в параметре гТор. Если гТор — 0.0, получаем конус; если rTop = rBase, получаем цилиндр. В противном случае отображается кониче- ский цилиндр. Параметру height присваивается значение (число двойной точности) высоты, и поверхность делится на несколько равномерно расположенных вертикаль- ных и горизонтальных линий, как определяется целыми значениями — параметрами nLongitudes и nLatitudes. Плоское круговое кольцо или сплошной диск на плоскости ху (z — 0) с центром в начале внешней системы координат выводится на экран с помощью команды gluDisk (ringName, rlnner, rOuter, nRadii, nRings); Внутренний и внешний радиусы задаются в параметрах rlnner и rOuter (значе- ния двойной точности). Если rlnner = 0, диск сплошной. В противном случае он отображается с концентрическим отверстием в центре. Поверхность диска делится на набор граней, которые определяются целыми параметрами nRadii и nRings, за- дающими число радиальных сегментов, используемых в мозаичном представлении, и число концентрических окружностей соответственно. Ориентация кольца опреде- ляется по отношению к оси z, причем передняя часть кольца смотрит в направлении +z, а задняя — в направлении — z. Сегмент кругового кольца можно задать с помощью следующей функции GLU. gluPartialDisk (ringName, rlnner, rOuter, nRadii, nRings, startAngle, sweepAngle);
8.6. Функции OpenGL поверхностей второго и третьего порядка 589 Параметр двойной точности startAngle определяет угловое расстояние в гра- дусах на плоскости ху, отсчитываемое по часовой стрелке от положительного на- правления оси у. Аналогично параметр sweepAngle задает угловое расстояние в градусах от положения startAngle. В результате отображается сегмент плоско- го кругового диска от положения startAngle до startAngle + sweepAngle. Например, если startAngle = 0.0 и sweepAngle = 90.0, отображается сегмент диска, лежащий в первом квадранте плоскости ху. Отметим, что для любой поверхности GLU второго порядка можно выделить область памяти, а для удаления поверхности используется команда gluDeleteQuadric (quadricName); Кроме того, можно определить направление любой поверхности второго порядка, используя функцию ориентации: gluQuadricOrientation (quadricName, normalVectorDirection); Параметру normalVectorDirection присваивается либо значение GLU_ OUTSIDE, либо GLU_INSIDE, чтобы указать направление векторов нормали к по- верхности, где “outside” обозначает направление передней грани, a “inside” — направ- ление задней грани. По умолчанию значение равно GLU_OUTSIDE. Для плоского кругового кольца направление передней грани по умолчанию совпадает с положи- тельным направлением оси z (передняя грань находится “над” диском). Альтернати- вой служит генерация векторов нормали к поверхности. gluQuadricNormals (quadricName, generationMode) ; Параметру generationMode присваивается значение символьной константы, указывающей, как должны генерироваться векторы нормали к поверхности. Значе- ние по умолчанию — GLU_NONE, означающее, что векторы нормали не генерируются, кроме того, обычно на поверхность второго порядка не налагаются условия освещен- ности. Для затенения плоской поверхности (с каждой поверхностью соотносится постоянный код цвета) используется символьная константа GLU_FLAT. В результате для каждой многоугольной грани генерируется одна нормаль. Если нужно применить другие условия освещения и затенения, используется константа GLU_SMOOTH, и для каждой вершины поверхности генерируется вектор нормали. Кроме того, для поверхностей второго порядка GLU можно установить парамет- ры поверхностной текстуры, также можно задать функцию, которая будет вызываться при ошибке в процессе генерации поверхности второго порядка: gluQuadricCallback (quadricName, GLU_ERROR, function);
590 Глава 8. Представления трехмерных объектов Рис. 8.8. Изображение сферы GLUT, конуса GLUT и цилин- дра GLU, размещенных в окне с помощью процедуры wire- QuadSurfs ПРИМЕР ПРОГРАММЫ С ИСПОЛЬЗОВАНИЕМ ФУНКЦИЙ GLUT И GLU ДЛЯ СОЗДАНИЯ ПОВЕРХНОСТЕЙ ВТОРОГО ПОРЯДКА Приведенная ниже программа отображает три каркасных поверхности второго поряд- ка (сфера, конус и цилиндр). Направление наблюдения совпадает с положительным направлением оси z, так что оси всех отображенных объектов направлены вертикаль- но. Три объекта размещены в различных точках в пределах одного окна экрана, как показано на рис. 8.8. ♦include <GL/glut.h> GLsizei winWidth = 500, winHeight = 500; /* Размер исходного окна на экране дисплея. */ void init (void){ glClearColor (1.0, 1.0, 1.0, 0.0); // Задается цвет окна. ) void wireQuadSurfs (void){ glClear (GL_COLOR_BUFFER _BIT); II Окно очищается. glColor3f (0.0, 0.0, 1.0); // Цвет линии выбран синим.
8.6. Функции OpenGL поверхностей второго и третьего порядка 591 /* Направление наблюдения задается по оси z внешней * системы координат. */ gluLookAt (2.0, 2.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0); /* Размещается и отображается каркасная сфера GLUT. */ glPushMatrix ( ); glTranslatef (1.0, 1.0, 0.0); glutWireSphere (0.75, 8, 6); glPopMatrix ( ) ; /* Размещается и отображается каркасный конус GLUT. */ glPushMatrix ( ); glTranslatef (1.0, -0.5, 0.5); glutWireCone (0.7, 2.0, 7, 6); glPopMatrix ( ); /* Размещается и отображается каркасный цилиндр GLU. */ GLUquadricObj *cylinder; // Задается имя объекта GLU. glPushMatrix ( ); glTranslatef (0.0, 1.2, 0.8); cylinder = gluNewQuadric ( ); gluQuadricDrawStyle (cylinder, GLU_LINE); gluCylinder (cylinder, 0.6, 0.6, 1.5, 6, 4); glPopMatrix ( ); glFlush ( ); ) void winReshapeFcn (GLint newWidth, GLint newHeight) ( glViewport (0, 0, newWidth, newHeight); glMatrixMode (GL_PROJECTION); glOrtho (-2.0, 2.0, -2.0, 2.0, 0.0, 5.0); glMatrixMode (GL_MODELVIEW); glClear (GL_COLOR_BUFFER_BIT) ; ) void main (int argc, char** argv) ( glutlnit (&argc, argv); glutlnitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutlnitWindowPosition (100, 100); glutlnitWindowSize (winWidth, winHeight); glutCreateWindow ("Каркасные квадратичные поверхности"); init ( ); glutDisplayFunc (wireQuadSurfs) ; glutReshapeFunc (winReshapeFcn); glutMainLoop ( );
592 Глава 8. Представления трехмерных объектов Рис. 8.9. Молекулярные связи. При удалении двух молекул друг от друга поверхности растягиваются, обрываются и наконец сжимаются в сферы Рис. 8.10. “Каплевидные” мускулы руки человека 8.7. КАПЛЕВИДНЫЕ ОБЪЕКТЫ На настоящее время в приложениях компьютерной графики разработано множество технологий моделирования нежестких объектов, а методы отображения характери- стик таких материалов, как одежда и резина, обсуждаются в разделе 8.26. Однако такие объекты, как молекулярные структуры, жидкости и капли воды, плавящиеся объекты и мускулы людей и животных, имеют определенную степень текучести. Они меняют свои поверхностные характеристики при определенных движениях, или ко- гда в окрестности находятся другие объекты, также для них характерны криволиней- ные поверхности, которые нельзя просто представить с использованием стандартных форм. В совокупности все такие объекты называются каплевидными (blobby objects). Форму отдельных молекул, например, можно считать сферической, но она меня- ется при приближении одной молекулы к другой. Это объясняется тем, что плотность электронного облака искажается присутствием других молекул, так что возникают краевые эффекты. На рис. 8.9 иллюстрируется растяжение, обрыв и сжимание мо- лекулярных форм при удалении двух молекул друг от друга. Подобные свойства проявляют мускулы человеческой руки, показанные на рис. 8.10. Отметим, что дан- ные характеристики нельзя адекватно описать просто с помощью сферических или эллиптических форм. Было разработано несколько моделей для представления каплевидных объектов как функций распределения в области пространства. Обычно формы поверхностей описываются так, что объем объекта остается постоянным при любых движениях или взаимодействиях. Один метод моделирования каплевидных объектов — использовать
8.7. Каплевидные объекты 593 -а 0 a Рис. 8.11. Трехмерные гауссовы функции плотности с центром в точке 0, имеющие амплитуду Ь и дисперсию a Рис. 8.12. Сложный каплевидный объект, сформированный четырьмя гауссовыми “горбиками” Рис. 8.13. Структура экрана, используемая в пакетах Blob Modeler и Blob Animator для моделирования объектов “меташарика- ми” (перепечатано с разрешения Thomson Digital Image) комбинацию гауссовых функций плотности (горбиков) (рис. 8.11). Затем поверхност- ная функция определяется следующим образом: = = (8.13) к где = х2к + yj. + zk, параметр T — некоторый заданный порог, а параметры аь и bfc используются для подгонки “степени каплевидности” отдельных компонентов поверхности. Используя отрицательные значения параметра Ъ^, можно получить впа- дины вместо горбиков. На рис. 8.12 иллюстрируется структура поверхности сложного объекта, смоделированного четырьмя гауссовыми функциями плотности. При поро- говых проверках используются численные методы нахождения корней, позволяющие найти координаты точек пересечения. Затем сечения отдельных объектов модели- руются окружностями или эллипсами. Если два сечения расположены рядом, они сливаются и формируют одну каплю, как показано на рис. 8.9, причем структура этой капли зависит от того, насколько разнесены два объекта.
594 Глава 8. Представления трехмерных объектов В других методах для генерации каплевидных объектов используются функции плотности, спадающие до 0 в конечном интервале не по экспоненте. Модель меташа- риков (meta-ball) описывает сложные объекты как комбинацию квадратных функций плотности следующего вида: f(r) = < если если если (8-14) < °, В модели мягкого объекта (soft object) используется функция ( 22г2 17г4 4г6 /(г) = J “ ~9сР + ~9dA ~ 9^6’ I О, если 0 < г < d если г > d (8.15) Некоторые пакеты разработки и рисования предлагают возможности моделирования каплевидных функций для обработки ситуаций, которые нельзя удовлетворительно смоделировать с помощью других представлений. На рис. 8.13 показан пользова- тельский интерфейс программы моделирования каплевидных объектов с помощью меташариков. 8.8. СПЛАЙНОВЫЕ ПРЕДСТАВЛЕНИЯ В черчении сплайном называется гибкая полоска, используемая для получения глад- кой кривой, проходящей по набору заданных точек. Чтобы удержать полоску на чер- тежном столе при проведении кривой, вдоль нее распределяется несколько небольших гирек. Термином сплайновая кривая изначально называлась кривая, нарисованная ука- занным выше способом. Математически эту кривую можно описать кусочно-гладкой кубической полиномиальной функцией, первая и вторая производная которой непре- рывны на различных участках кривой. В компьютерной графике сплайновой кри- вой сейчас называют любую составную кривую, сформированную полиномиальны- ми участками, удовлетворяющими заданным условиям непрерывности на границах участков. Сплайновую поверхность можно описать двумя наборами ортогональных сплайновых кривых. Существует несколько различных типов определений сплайнов, используемых в приложениях компьютерной графики. Каждая отдельная специфика- ция просто связана с определенным типом полиномов с конкретными предопреде- ленными граничными условиями.
8.8. Сплайновые представления 595 Рис. 8.14. Набор из шести контрольных точек, интерполированных кусочно-гладкой непре- рывной полиномиальной кривой Рис. 8.15. Набор из шести контрольных точек, аппроксимированных кусочно-непрерывными полиномиальными участками Сплайны используются для разработки кривых и поверхностей, для оцифровки рисунков и для задания путей анимации объектов или положений камеры на сцене. Типичные сферы применения автоматизированного проектирования с использовани- ем сплайнов включают разработку кузовов автомобиля, поверхностей самолетов и космических кораблей, корпусов кораблей и бытовых электроприборов. ИНТЕРПОЛЯЦИЯ И АППРОКСИМАЦИЯ СПЛАЙНАМИ Сплайновая кривая задается через набор координат точек, именуемых контрольными, которые указывают общую форму кривой. Затем по данным точкам одним из двух способов подбирается кусочно-непрерывная параметрическая полиномиальная функ- ция. Если полиномиальные участки соединяют все контрольные точки, как показано на рис. 8.14, получающаяся кривая называется интерполяцией набора контрольных точек. С другой стороны, если генерируемая полиномиальная кривая строится так, что некоторые или все контрольные точки не лежат на пути кривой, эта кривая называется аппроксимацией набора контрольных точек (рис. 8.15). Подобные методы использу- ются для построения интерполяций или аппроксимаций сплайновых поверхностей. Методы интерполяции широко используются для оцифровки рисунков или зада- ния путей анимации. Методы аппроксимации применяются в основном в средствах проектирования для создания форм объектов. На рис. 8.16, например, показана ап- проксимирующая сплайновая поверхность в некотором пакете проектирования. Кон- трольные точки над поверхностью соединяются прямыми отрезками. Сплайновая кривая или поверхность определяется, модифицируется и использу- ется путем действий с контрольными точками. Интерактивно выбирая положения кон- трольных точек в пространстве, разработчик может задавать первоначальную форму. После того как для данного набора контрольных точек на экране отображено поли- номиальное представление, разработчик может изменить положения некоторых или Всех контрольных точек, подбирая таким образом структуру формы объекта. Наконец, геометрические преобразования (трансляция, вращение и масштабирование) приме-
596 Глава 8. Представления трехмерных объектов Рис. 8.16. Аппроксимирующая сплайновая поверхность в прило- жении автоматизированного про- ектирования автомобилей. Кон- туры поверхности представлены полиномиальными фрагментами кривых, а контрольные точки по- верхности соединяются прямы- ми отрезками (перепечатано с разрешения Evans & Sutherland) няются к объектам также через преобразование контрольных точек. Кроме того, паке- ты автоматизированного проектирования иногда позволяют вводить дополнительные контрольные точки, чтобы помочь разработчику получить требуемую форму объекта. Набор контрольных точек формирует границу области пространства, называемую выпуклой оболочкой. Чтобы представить себе форму выпуклой оболочки для двух- мерной кривой, подумайте о резиновой ленте, которая так натягивается на положения контрольных точек, что каждая контрольная точка находится либо на периметре этой границы, либо внутри него (рис. 8.17). Таким образом, выпуклая оболочка двухмер- ной сплайновой кривой является выпуклым многоугольником. В трехмерном про- странстве выпуклая оболочка набора сплайновых кривых формирует выпуклый мно- гогранник. Вообще, выпуклые оболочки позволяют отклонять кривую или поверх- ность от области пространства вблизи контрольных точек. В большинстве случаев сплайн ограничивается его выпуклой оболочкой, а это гарантирует, что форма объек- та следует за контрольными точками без ложных осцилляций. Кроме того, выпуклая оболочка — это мера координатных границ заданной кривой или поверхности, так что ее удобно использовать в процедурах поворота и изменения точки наблюдения. Ломанная линия, соединяющая последовательность контрольных точек аппрок- симирующей сплайновой кривой, обычно отображается и напоминает разработчику о положении и упорядочении контрольных точек. Данный набор связанных сегментов линий называется контрольным графом кривой. Часто контрольный граф называется “контрольным многоугольником” или “характеристическим многоугольником”, даже когда он является не многоугольником, а ломанной линией. На рис. 8.18 показана форма контрольного графа последовательностей контрольных точек, приведенных на
8.8. Сплайновые представления 597 Рис. 8.17. Формы выпуклых оболочек (пунктирные линии) двух наборов контрольных то- чек на плоскости ху Рис. 8.18. Формы контрольно- го графа (пунктир) двух набо- ров контрольных точек на плос- кости ху рис. 8.17. Для сплайновой поверхности края многоугольных граней четырехугольной сетки поверхности контрольного графа формируют два набора связующих ломанных, как показано на рис. 8.16. ПАРАМЕТРИЧЕСКИЕ УСЛОВИЯ НЕПРЕРЫВНОСТИ Чтобы гарантировать гладкие переходы от одного участка кусочно-гладкого пара- метрического сплайна к следующему, можно наложить различные условия непрерыв- ности в точках соединения. Если каждый участок сплайновой кривой описывается набором параметрических координатных функций вида X = х(и), у = у(и), Z = z(u), U\<U<U2, (8.16) параметрическая непрерывность (непрерывность по параметру) задается согласо- ванием производных соединяющихся участков кривых по параметрам в их общей границе.
598 Глава 8. Представления трехмерных объектов Рис. 8.19. Кусочно-гладкое построение кривой путем соединения двух сегментов с использованием непрерывности разного порядка: а) непре- рывность нулевого порядка; б) непрерывность первого порядка; в) непре- рывность второго порядка Непрерывность нулевого порядка по параметру, С°, означает просто, что кривые встречаются. Следовательно значения х, у и z, вычисленные в точке и? для перво- го участка кривой, равны соответственно значениям х, у и z, вычисленным в U] для следующего участка кривой. Непрерывность первого порядка по параметру, С1, означает, что первые производные по параметру (касательные) координатных функ- ций в уравнении (8.16) двух последовательных участков кривых равны в точках их соединения. Непрерывность второго порядка по параметру, или С2, означает, что первая и вторая производные по параметру двух кривых одинаковы в точке пересе- чения. Сходным образом определяется непрерывность по параметру более высоких порядков. Примеры непрерывности С°, С1 и С2 приведены на рис. 8.19. При непрерывности второго порядка по параметру в точке пересечения равны скорости изменения касательных векторов соединяющихся участков. Следовательно, касательная одной кривой гладко переходит в касательную следующей (рис. 8.19, в). В то же время, если требуется только непрерывность первого порядка, скорость из- менения касательных векторов двух участков может довольно сильно различаться (рис. 8.19, б), и общие формы двух соседних участков могут меняться произволь- но. Непрерывности первого порядка часто достаточно для оцифровки рисунков и в некоторых конструкторских приложениях, тогда как непрерывность второго порядка полезна при задании путей анимации для движения камеры и во многих точных при- ложениях автоматизированного проектирования. Камера, перемещающаяся по кри- вой траектории, показанной на рис. 8.19, б, с равными шагами по параметру и, будет испытывать резкие изменения ускорения на границе двух участков, демонстрируя разрывы на последовательности кадров. Однако, если камера перемещается по тра- ектории, показанной на рис. 8.19, в, на последовательности кадров с изображением движения будут наблюдаться гладкие переходы на границе.
8.8. Сплайновые представления 599 Рис. 8.20. По трем контрольным точкам были подобраны кривые: а) с условием параметрической непрерывности; б) с условием геометрической непрерывности, где касательный вектор кривой Сз в точке Pi имеет большую длину, чем каса- тельный вектор кривой Ci в точке Pi Ь УСЛОВИЯ ГЕОМЕТРИЧЕСКОЙ НЕПРЕРЫВНОСТИ Другой метод соединения двух последовательных участков кривых заключается в на- ложении условий геометрической непрерывности. В этом случае требуется только, чтобы производные по параметрам двух участков были не равны, а просто пропор- । циональны друг другу на общей границе. Геометрическая непрерывность первого порядка, обозначаемая G°, — это то же \ самое, что и непрерывность нулевого порядка по параметру. Следовательно, два по- F следовательных участка кривой должны иметь одинаковые координаты в граничной точке. Геометрическая непрерывность первого порядка, или G1, означает, что первые г производные по параметрам пропорциональны в точке пересечения двух последова- Iтельных участков. Если обозначить параметрическое положение на кривой как Р(и), J то при непрерывности в G1 последовательные участки кривой в их общей точке |будут иметь равное направление касательного вектора Р'(и), но не обязательно его [модуль. Геометрическая непрерывность второго порядка, или непрерывность в G2, [означает, что первая и вторая параметрические производные двух участков кривой I пропорциональны на их границе. При непрерывности в G2 кривизны обоих участков t кривой будут равными в точке соединения. I Кривая, генерируемая с наложенными условиями геометрической непрерывно- [сти, подобна кривой, полученной с условием параметрической непрерывности, но [Имеются определенные отличия в форме кривой. Условия геометрической и пара- I метрической непрерывности сравниваются на рис. 8.20. Геометрически непрерывные [кривые притягиваются к участку с большей длиной касательного вектора. |. I' [спецификация сплайна |Существует три эквивалентных метода определения конкретного сплайна при дан- рой степени полинома и положениях контрольных точек: 1) можно задать набор [/раничных условий, налагаемых на сплайн; 2) можно задать матрицу, характеризую- |Иую сплайн; 3) можно задать набор стыковочных функций (или базисных функций), определяющих, как заданные условия на кривую используются для расчета точек пдоль кривой.
600 Глава 8. Представления трехмерных объектов Чтобы проиллюстрировать названные эквивалентные спецификации, предполо- жим, что дано следующее параметрическое представление кубическим полиномом через координату х по траектории участка сплайновой кривой: х(и) = ахи3 + Ьхи2 + схи + dx, 0 < и < 1. (8.17) Для этой кривой в конечных точках можно задать граничные условия т(0) и х(1), а также условия на первые производные по параметрам: т/(0) и 2/(1). Этих четырех граничных условий достаточно, чтобы определить значения четырех коэффициентов Пд}, бх, и dx. Из граничных условий можно получить матрицу, характеризующую данную сплайновую кривую. Для этого вначале перепишем уравнение (8.17) как произве- дение матриц: т(и) = [и3 и2 и 1] = U • С, (8.18) где U — матрица-строка степеней параметра и, а С — матрица-столбец коэффици- ентов. Используя уравнение (8.18), можно записать граничные условия в матричной форме и найти матрицу коэффициентов С: С = M^spline ‘ M-geomi (8-19) где Mgeom — четырехэлементная матрица-столбец, содержащая значения геометриче- ских условий (граничные условия) на сплайн, a Mspiine — матрица 4 на 4, преобразую- щая значения геометрических условий в коэффициенты полинома и характеризующая сплайновую кривую. Матрица Mgeom содержит координаты контрольных точек и дру- гие геометрические условия, которые должны удовлетворяться. Таким образом, мат- ричное представление С можно подставить в уравнение (8.18) и получить следующее: rr(u) = U • Mspiine • Mgeom. (8.20) Матрица Mspiine, характеризующая сплайновое представление, иногда называется базисной матрицей, и она особенно полезна при переходе от одного сплайнового представления к другому.
8.8. Сплайновые представления 601 | Наконец, уравнение (8.20) можно расширить, чтобы получить полиномиальное I представление координаты х через параметры геометрических условий дь, таких как I I координаты контрольных точек и наклон кривой в контрольных точках: I 3 I х(и) ~ ^9к • BFfc(u). (8.21) I fc=o I Полиномы BFfe(u) при k = 0,1, 2,3 называются стыковочными или базисны- I ми функциями, поскольку они используются для “сшивки” значений геометрических К условий при получении координат точек кривой. В последующих разделах изучаются Е особенности различных сплайновых кривых и поверхностей, полезные в приложени- I ях компьютерной графики, включая спецификацию их матричного представления и к представления через стыковочные функции. I СПЛАЙНОВЫЕ ПОВЕРХНОСТИ В Обычная процедура определения сплайновой поверхности заключается в следующем: с помощью сетки контрольных точек в некоторой области пространства задается два В набора ортогональных сплайновых кривых. Если обозначить положения контрольных К точек через Pku,kv, тогда любую точку сплайновой поверхности можно определить как декартово произведение стыковочных функций сплайновых кривых: I P(u,d) = ^2 Pfcu,k^Ffcu(>)BFfcv(u). (8-22) В- В Параметры поверхности и и v часто меняются в диапазоне 0-1, но этот диапазон В зависит от типа используемых сплайновых кривых. Существует метод задания трех- В мерных положений контрольных точек, заключается в выборе значений высот над В двухмерной сеткой точек на нулевой плоскости. I НАСТРОЙКА СПЛАЙНОВЫХ ПОВЕРХНОСТЕЙ К В приложениях автоматизированного проектирования разработка поверхности мо- жет требовать некоторых особенностей, которые нельзя реализовать, просто настраи- вая положения контрольных точек. Например, может понадобиться отрезать участок к сплайновой поверхности, чтобы совместить два элемента, или может потребовать- ся отверстие, чтобы пропустить через поверхность проводник. В таких ситуациях К графические пакеты часто предлагают функции, позволяющие генерировать настро- ечные кривые (trimming curves), которые можно использовать для удаления участков сплайновых поверхностей, как показано на рис. 8.21. Настроечные кривые обычно Н определяются в параметрических координатах поверхности uv, и часто их нужно задавать как замкнутые кривые.
602 Глава 8. Представления трехмерных объектов Рис. 8.21. Модификация участка поверхности с использова- нием настроечных кривых Рис. 8.22. Кусочно-непрерывная интерполяция кубическими сплайнами п + 1 контрольных точек 8.9. МЕТОДЫ ИНТЕРПОЛЯЦИИ КУБИЧЕСКИМИ СПЛАЙНАМИ Данный класс сплайнов наиболее часто используется для настройки путей движения объектов или получения представления существующего объекта или рисунка, хотя интерполирующие сплайны также иногда применяются для разработки форм объек- тов. Кубические полиномы предлагают разумный компромисс между гибкостью и скоростью вычислений. По сравнению с полиномами более высоких порядков ку- бические сплайны требуют меньше расчетов и памяти, и они более устойчивы. По сравнению с квадратными полиномами и прямыми отрезками кубические сплайны эффективнее при моделировании форм объектов. Чтобы интерполировать данный набор контрольных точек кубическими сплай- нами, по входным точкам подбирается кусочно-кубическая полиномиальная кривая, проходящая через все контрольные точки. Предположим, что даны п +1 контрольных точек, заданных координатами Pfc = (xk, yk, zk), k = 0,1, 2,
8.9. Методы интерполяции кубическими сплайнами 603 Кубическая интерполяция данных точек иллюстрируется на рис. 8.22. Параметри- ческий кубический полином, связывающий каждую пару контрольных точек, можно описать следующей системой уравнений: т(и) = ах и3 + Ьх и2 + сх и + dx, у(и) — ау и3 + Ьу и? + Су и + dy, z(u) — az и3 + bz и2 + cz и + dz. (0 < и < 1), (8.23) Для каждого из этих трех уравнений нужно определить значения четырех коэффици- ентов а, Ь, с и d в полиномиальном предоставлении каждого из п участков кривой между n + 1 контрольными точками. Для этого задается достаточное число гранич- ных условий в контрольных точках между участками кривой, на основе которых находятся численные значения всех коэффициентов. В следующих разделах обсуж- даются общие методы задания граничных условий для интерполяции кубическими сплайнами. ЕСТЕСТВЕННЫЕ КУБИЧЕСКИЕ СПЛАЙНЫ Одной из первых сплайновых кривых, разработанных для графических приложений, стал естественный кубический сплайн. Данная интерполирующая кривая является математическим представлением первоначального чертежного сплайна. Чтобы опре- делить естественный кубический сплайн, нужно указать, что два соседних участка кривой имеют равные первые и вторые производные по параметру в их общей точке. Таким образом, естественные кубические сплайны непрерывны в С2. Если даны п + 1 контрольных точек, как показано на рис. 8.22, тогда имеется п участков кривой, и всего нужно определить 4п коэффициентов полиномов. В каждой из п — 1 внутренних контрольных точек задается четыре граничных условия: два участка кривой с обеих сторон контрольной точки должны иметь одинаковые первые и вторые производные по параметру в данной контрольной точке, и каждая кривая должна проходить через эту контрольную точку. В результате имеем 4п—4 уравнений, которые должны удовлетворяться 4п коэффициентами полиномов. Еще одно уравне- ние дает первая контрольная точка ро, начало кривой, и еще одно — контрольная точка рп, которая должна быть последней точкой кривой. Однако, чтобы определить значения всех коэффициентов, недостает еще двух уравнений. Одним способом по- лучения двух дополнительных условий является установка вторых производных в точках ро и рп равными 0. Другой подход — добавить две дополнительные контроль- ные точки (именуемые ложными точками (dummy points)), по одной в каждом конце исходной последовательности контрольных точек. Таким образом, в начале кривой добавляется контрольная точка, обозначенная p_i, а в конце кривой — контрольная точка Рп+1 • После этого все исходные контрольные точки являются внутренними, и имеются необходимые 4п граничных условий.
604 Глава 8. Представления трехмерных объектов Р(и) = (х(и),т(и),г(и)) Рис. 8.23. Параметрическая точечная функция Р(и) для участка эрми- *Р*+ i ТОВОЙ кривой Между КОНТРОЛЬНЫМИ Точками Р), И Pfe^l 1 Хотя естественные кубические сплайны являются математической моделью чер- тежного сплайна, они обладают серьезным недостатком. Если поменять положение любой контрольной точки, изменится вся кривая. Таким образом, естественные куби- ческие сплайны не допускают “локального управления”, поэтому часть кривой нельзя реструктурировать, не задавая нового набора контрольных точек. По этой причине были разработаны другие методы интерполяции кубическими сплайнами. ЭРМИТОВА ИНТЕРПОЛЯЦИЯ Эрмитовым сплайном (названным в честь французского математика Шарля Эрмита (Charles Hermite)) является интерполирующий кусочно-кубический полином с задан- ной касательной в каждой контрольной точке. В отличие от естественных кубических сплайнов эрмитовы сплайны можно настраивать локально, поскольку каждый участок кривой зависит только от условий в конечных точках. Если обозначить через Р(и) параметрическую кубическую точечную функцию участка кривой между контрольными точками pfc и pt+i, как показано на рис. 8.23, граничные условия, определяющие эрмитову кривую, запишутся в виде P(0)=pfc, Р(1) = Pfc+i, Р'(0) = DPfc, Р'(1) = Dpfc+1, (8.24) где Dpfc и Dpfc+1 задают значения производных по параметру (наклона кривой) в контрольных точках рд и pjfc+i соответственно. Векторный эквивалент уравнения (8.23) для этой эрмитовой кривой можно запи- сать следующим образом: Р(ц) = ан3 + bи2, + си + d, 0 < и < 1, (8-25) где х-й компонент Р(и) равен г(и) = ах и3 + Ьх и2 + сх и + dx; подобные выражения записываются для компонентов у и z. Матричный эквивалент уравнения (8.25) имеет такой вид:
8.9. Методы интерполяции кубическими сплайнами 605 Р(и) = [и3 и2 и 1] • а b с d (8.26) и производная точечной функции выражается как Р'(ц) = [3u2 2и 1 0] • (8.27) Подставляя в предыдущие два уравнения вместо параметра и значения конечных точек 0 и 1, эрмитовы граничные условия (8.24) можно выразить в матричной форме: Рк ’0 0 0 Г а’ Рк+1 1111 b DPt 0 0 10 с (8.28) _DPfc+i. 3 2 1 0 d Решая это уравнение относительно коэффициентов полиномов, получаем: a I ’0 0 0 г -1 Рк b 1 1 1 1 Pfc+l с 0 0 1 0 D] 3fc _dj 3 2 1 0 DPfe+i ' 2 —2 1 1 -I Pk Pk -3 3 2 - Pfc+l •ж r P^ + l — = МЯ- _ , (8.29) 0 0 1 0 DPfc DPfc _ 1 0 0 0 DPfc+i |_DPfc+i. где эрмитова матрица Мд является обратной к матрице граничных условий. Далее уравнение (8.26) можно записать через граничные условия: Pk P(u) = [u3 u2 и 1] • Мд • Pfc+l (8.30) DPfc _DPfc+i.
606 Глава 8. Представления трехмерных объектов Рис. 8.24. Эрмитовы стыковочные функции Наконец, можно определить выражения для полиномиальных эрмитовых стыковоч- ных функций Hk(u) при k = 0,1,2,3, выполнив матричное умножение в уравне- нии (8.30) и собрав коэффициенты для граничных условий, в результате чего полу- чается полиномиальная форма P(it) = ра,(2п3 — 3it2 + 1) + Pfc+i(—2it3 + 3u2) + Dpfc(it3 — 2u2 + u) + + Dpfc+1(u3 -u2) = = pkHo(u) + pfc+i77i + DpfcH2 + Dpfc+1//.3. (8.31) На рис. 8.24 показана форма четырех эрмитовых стыковочных функций. Полиномы Эрмита могут быть полезны в некоторых сферах оцифровки, где задать или аппроксимировать наклон кривой не слишком сложно. Однако в большинстве за- дач компьютерной графики полезнее генерировать сплайновые кривые, не требуя ввода значений наклонов кривых или другой геометрической информации, отличной от координат контрольных точек. В последующих двух разделах рассматриваются фундаментальные сплайны и сплайны Коханека-Бартелса (Kochanek-Bartels), являю- щиеся модификациями эрмитовых сплайнов, которые не требуют ввода производных кривых в контрольных точках. В процедурах с использованием этих сплайнов пара- метрические производные вычисляются по координатам контрольных точек.
8.9. Методы интерполяции кубическими сплайнами 607 Pt-i Pt р(") Pt-1 Рис. 8.25. Параметрическая точечная функция Р(и) фундаментального сплайна между контрольными точками pfe и рь+1 Рис. 8.26. Касательные векторы в конечных точках фундаментального сплайна параллельны хордам, сформированным соседними контрольными точками (показаны пунктиром) /<0 (Более ослабленная кривая) t>0 (Более натянутая кривая) Рис. 8.27. Влияние параметра натяжения на форму участка фунда- ментального сплайна ФУНДАМЕНТАЛЬНЫЕ СПЛАЙНЫ Как и эрмитовы сплайны, фундаментальные сплайны — это интерполирующие кусочно-кубические полиномы с заданными касательными в конечных точках (на гра- ницах участков кривой). Отличие заключается в том, что теперь значения касательных в конечных точках вводить не нужно. Для фундаментального сплайна касательная в контрольной точке вычисляется по координатам двух соседних контрольных точек. Участок фундаментального сплайна полностью задается положениями четырех последовательных контрольных точек. Две средние контрольные точки являются ко- нечными точками участка, другие две используются при расчете касательных в ко- нечных точках. Если обозначить через Р('«) представление параметрической куби- ческой точечной функции между контрольными точками pjt и Pfc+i, как показано на рис. 8.25, тогда по четырем контрольным точкам от p^-i до pt+i ставятся граничные условия на участок фундаментального сплайна: Р(0) = рь Р(1) = pfc+i, Р'(0) = J(l-*)(pfc+1-Pfc-i), (8-32) Р'(1) = |(1 -i)(Pfc+2 -Pfc)-
608 Глава 8. Представления трехмерных объектов Таким образом, касательные в контрольных точках pi и Pfc+i считаются пропор- циональными соответственно хордам Pfc-iPfc+i и PfcPfc+2 (рис. 8.26). Параметр t называется параметром натяжения, поскольку он контролирует то, насколько тесно фундаментальный сплайн соответствует входным контрольным точкам. На рис. 8.27 иллюстрируется форма фундаментальной кривой для очень малого и очень большого натяжения t. При t = 0 данный класс кривых называется сплайнами Катмалла-Рома (Catmull-Rom splines) или сплайнами Оувергаузера (Overhauser splines). Используя методы, подобные описанным для эрмитовых сплайнов, граничные условия (8.32) можно преобразовать в матричную форму: Pfc-1 Р(д) = [и3 и2 и 1] • Мс • Pfc Pfc+l _Pfc+2_ , (8.33) где фундаментальная матрица имеет вид —s 2 -s s —2 s 2s s-3 3 - 2s —s Me = —s 0 s 0 (8.34) . 0 1 0 0 _ при s = (1 — t)/2. Расписывая матричное уравнение (8.33) в полиномиальную форму, получаем Р(п) — pfc—i (—s и -Г 2 s и — s и) + pfc [(2 — s)n -Н (s — 3)п -Г 1] -Г + Pfc+l [(s - 2)г? + (3 - 2s)u2 + s it] + Pfc+2(s u3 - s u2) = = Pfc_! CARo(u) + Pfc CARi(u) + Pfc+l CAR2(u) + pfc+2 CAR3(w), (8.35) где полиномы CARfc(u) при k = 0,1,2,3 — это стыковочные (базисные) функции фундаментального сплайна. На рис. 8.28 приведен график базисных функций фунда- ментальных сплайнов при t = 0. Примеры кривых, полученных с помощью стыковочных функций фундаменталь- ных сплайнов, приводятся на рис. 8.29-8.31. На рис. 8.29 изображены четыре участ- ка фундаментальных сплайнов, формирующих замкнутую кривую. Первый участок кривой генерируется с использованием набора контрольных точек {ро, Pi,Р2, Рз}> вторая кривая получается из набора контрольных точек {pi, Р2, Рз, Ро}, третий уча- сток кривой имеет контрольные точки {р2, р3, Ро, Pi}, и последний участок кривой имеет контрольные точки {рз,Ро,Р1,Р2}- На рис. 8.30 показана замкнутая кривая, полученная с использованием одного участка фундаментальной кривой, где положе- ние третьей контрольной точки совпадает с положением второй. На рис. 8.31 показан
8.9. Методы интерполяции кубическими сплайнами 609 Рис. 8.28. Стыковочные функции фундаментальных сплайнов при t = 0 (s = 0,5) самопересекающийся участок фундаментального сплайна, в котором положение тре- тьей контрольной точки очень близко ко второй контрольной точке. Возникающее при этом самопересечение объясняется условиями, наложенными на касательную кривой в конечных точках pi и рг- СПЛАЙНЫ КОХАНЕКА-БАРТЕЛСА Данные интерполирующие кубические полиномы являются расширением фундамен- тальных сплайнов. В уравнения условий вводится два дополнительных параметра, определяя сплайны Коханека-Бартелса (Kochanek-Bartels splines) и предлагая повы- шенную гибкость в настройке форм сегментов кривых. Для четырех данных последовательных контрольных точек, обозначенных Pk-i, Pfc> Pfc+1 и Pfc+2, граничные условия для участка кривой Коханека-Бартелса между Pfc и Pfc_|_i определяются следующим образом:
610 Глава 8. Представления трехмерных объектов Рис. 8.29. Замкнутая кривая из четырех участков — фун- даментальных сплайнов, по- лученная циклической пере- становкой контрольных точек (параметр натяжения t = 0) Рис. 8.30. Петля фун- даментального сплайна, полученная при совпа- дающих конечных точ- ках кривой. Натяжение равно 0 Р(0) =pfc, Р(1) = Pfe+l, P'(0)in = |(1 - t)[(l + Ь)(1 - c)(pfc - pfc_i)+ £ + (1 - 6)(1 + c)(pfc+i — Pfc)], P'(l)out = т(1 — ^)[(1 + b)(l + c)(Pk+l — Pfc) + £ + (1 - 6)(1 - c)(pfc+2 - Pfc+1)],
8.10. Сплайновые кривые Безье 611 Рис. 8.31. Самопересекаю- щаяся кривая (фундамен- тальный сплайн), порож- денная близко расположен- ными конечными точками кривой. Параметр натяже- ния равен 0 Ро ₽4 Рис. 8.32. Влияние параметра сме- щения на форму участка сплайна Коханека-Бартелса где t — параметр натяжения, Ь — параметр смещения (биения), а с — параметр непре- рывности. В формулировке Коханека-Бартелса производные по параметрам могут не быть непрерывными на границах участков. Параметр натяжения t интерпретируется так же, как для фундаментальных сплай- нов; т.е. он контролирует плотность участков кривой. Смещение Ь используется для настройки кривизны в каждом конце участка, так что этот участок кривой можно скосить к одному или другому концу (рис. 8.32). Параметр с контролирует непре- рывность касательного вектора на границах участков. Если параметру с присвоено ненулевое значение, на границах участков наблюдается разрыв касательной кривой. Сплайны Коханека-Бартелса разработаны для моделирования путей анимации. В частности, резкие изменения движения объекта можно сымитировать, используя ненулевые значения параметра с. Данные изменения движения используются в муль- типликации, например, когда анимационный персонаж быстро останавливается, ме- няет направление или сталкивается с некоторым объектом. 8.10. СПЛАЙНОВЫЕ КРИВЫЕ БЕЗЬЕ Данный метод аппроксимации сплайнами был разработан французским инженером Пьером Безье (Pierre Bezier) для использования в проектировании кузова автомобиля Рено. Сплайны Безье имеют ряд свойств, делающих их крайне полезными и удобными
612 Глава 8. Представления трехмерных объектов при разработке кривых и поверхностей. Кроме того, их также легко реализовать. По этим причинам сплайны Безье широко используются в различных системах автомати- зированного проектирования, в универсальных графических пакетах и в смешанных пакетах рисования и живописи. Вообще, участок кривой Безье можно подобрать по любому числу контрольных точек, хотя в некоторых графических пакетах число контрольных точек ограниче- но четырьмя. Степень полинома Безье определяется числом контрольных точек и их относительным положением. Как и для интерполирующих сплайнов, путь кри- вой Безье можно задать в окрестности контрольных точек, используя стыковочные функции, характеристическую матрицу или граничные условия. Для общих кривых Безье без ограничения числа контрольных точек наиболее удобным представлением является спецификация стыковочных функций. УРАВНЕНИЯ КРИВЫХ БЕЗЬЕ Рассмотрим вначале общий случай п + 1 контрольных точек, положения которых обозначим через рк = (xk,yk, zk\ где к меняется от 0 до п. Данные точки со- бираются в вектор положений P(w), который описывает путь аппроксимирующей полиномиальной функции Безье между ро и рп. п Р(и) = У? Рк ВЕ,2к1П(и), 0 < и < 1 (8.37) k=o Стыковочные функции Безье BEZ^ .,, (?/.) являются полиномами Бернстайна В£Лк,п(и) = С(п, к)ик(1 - и)п~к, (8.38) где параметры С(п, к) — это биномиальные коэффициенты (839) Векторное уравнение (8.37) представляет систему из трех параметрических уравне- ний для отдельных координат кривых: п х(и) ~^2Xk BEZfcjn(u), fc=0 п у(и) = '^Ук BEZfcjn(u), (8.40) fc=0 п
8.10. Сплайновые кривые Безье 613 Рис. 8.33. Примеры двухмерных кривых Безье, сгенерированных по трем, че- тырем и пяти контрольным точкам. Пунктирные линии соединяют положения контрольных точек В большинстве случаев кривая Безье — это полином, степень которого на единицу меньше заданного числа контрольных точек: три точки определяют параболу, четы- ре — кубическую кривую и т.д. На рис. 8.33 демонстрируется внешний вид нескольких кривых Безье при различном выборе контрольных точек на плоскости ху (z = 0). При определенном расположении контрольных точек, однако, получаются вырожден- ные полиномы Безье. Например, кривая Безье, сгенерированная тремя контрольными точками, лежащими на одной прямой, является прямым отрезком. Наконец, “кривая” Безье для набора контрольных точек с совпадающими координатами представляет собой одну точку. Для получения последовательных значений биномиальных коэффициентов мож- но использовать рекурсивные вычисления: С(п, к) =-----— С(п, к — 1) (8.41) к при п > к. Кроме того, стыковочная функция Безье удовлетворяет рекурсивному соотношению BEZfci?l(?z) - (1 -u)BEZ*;,n_i(?z) + ?zBEZfc_iin_i(u), n > к > 1, (8.42) где BEZ^k = uk и BEZo,t = (1 — и)к.
614 Глава 8. Представления трехмерных объектов ПРИМЕР ПРОГРАММЫ ГЕНЕРАЦИИ КРИВЫХ БЕЗЬЕ В приведенной ниже программе реализован расчет стыковочных функций Безье и генерация двухмерного кубического сплайна Безье. На плоскости ху определены че- тыре контрольные точки, и на кривой отмечено 1000 положений пикселей, причем ширина пикселя равна 4. Значения биномиальных коэффициентов вычисляются в процедуре binomialCoef f s, а положения точек на кривой вычисляются в проце- дуре computeBezPt. Данные значения передаются процедуре bezier, и пиксели отмечаются на кривой с использованием процедур OpenGL вывода точек на экран. Кроме того, траекторию кривой можно аппроксимировать прямыми отрезками, ис- пользуя при этом меньшее число точек. Более эффективные методы генерации точек вдоль сплайновой кривой рассматриваются в разделе 8.17. В приведенном примере наложены условия внешней системы координат, поэтому отображаются только точки кривой, находящиеся в окне просмотра (рис. 8.34). Если дополнительно требуется изобразить положения контрольных точек, контрольный граф или выпуклую оболоч- ку, отсекающее окно нужно расширить во внешней системе координат. Рис. 8.34. Кривая Безье, изображенная программой-примером
8.10. Сплайновые кривые Безье 615 ♦include <GL/glut.h> ♦include <stdlib.h> ♦include <math.h> /★ Задается исходный размер окна на экране дисплея. */ GLsizei winWidth = 600, winHeight = 600; /* Задается размер отсекающего окна во внешних * координатах. */ GLfloat xwcMin = -50.0, xwcMax - 50.0; GLfloat ywcMin = -50.0, ywcMax = 50.0; class wcPt3D { public: GLfloat x, y, z; }; void init (void) { /* Цвет окна выбирается белым. */ glClearColor (1.0, 1.0, 1.0, 0.0); } void plotPoint (wcPt3D bezCurvePt) { glBegin (GL_POINTS); glVertex2f (bezCurvePt.x, bezCurvePt.y); glEnd ( ); } /* Вычисляются биномиальные коэффициенты С для данного * значения п. */ void binomialCoeffs (GLint n, GLint * C) { GLint k, j; for (k = 0; k <= n; k++) { /* Вычисляется n!/(k!(n - k)!). */ C [k] = 1; for (j = n; j >= k + 1; j —) C [k] *= j; for (j = n - k; j >= 2; j —) C [k] /= j; } }
616 Глава 8. Представления трехмерных объектов void computeBezPt (GLfloat u, wcPt3D * bezPt, GLint nCtrlPts, wcPt3D * ctrlPts, GLint * C) { GLint k, n = nCtrlPts - 1; GLfloat bezBlendFcn; bezPt->x = bezPt->y = bezPt->z = 0.0; /* Вычисляются стыковочные функции и контрольные * точки соединений. */ for (к = 0; к < nCtrlPts; к++) { bezBlendFcn = С [к] * pow (и, к) * pow (1 - и, п - к); bezPt->x +- ctrlPts [к].х * bezBlendFcn; bezPt->y += ctrlPts [к].у * bezBlendFcn; bezPt->z += ctrlPts [k].z * bezBlendFcn; void bezier (wcPt3D * ctrlPts, GLint nCtrlPts, GLint nBezCurvePts) { wcPt3D bezCurvePt; GLfloat u; GLint *C, k; /* Распределяется память для биномиальных коэффициентов.*/ С = new GLint [nCtrlPts]; binomialCoeffs (nCtrlPts - 1, C); for (k = 0; к <= nBezCurvePts; k++) { u = GLfloat (k) / GLfloat (nBezCurvePts); computeBezPt (u, SibezCurvePt, nCtrlPts, ctrlPts, C); plotPoint (bezCurvePt); } delete [ ] C; void displayFcn (void) { /* Задается число контрольных точек и число точек * кривой, изображаемых на кривой Безье. */ GLint nCtrlPts - 4, nBezCurvePts - 1000; wcPt3D ctrlPts [4] = { {-40.0, -40.0, 0.0), {-10.0, 200.0, 0.0), {10.0, -200.0, 0.0), {40.0, 40.0, 0.0} }; glClear (GL_COLOR_BUFFER_BIT); /* Очищается окно на экране дисплея. */
8.10. Сплайновые кривые Безье 617 glPointSize (4); glColor3f (1.0, 0.0, 0.0); // Цвет точек выбран красным, bezier (ctrlPts, nCtrlPts, nBezCurvePts); glFlush ( ); } void winReshapeFcn (GLint newWidth, GLint newHeight) { /* Характеристическое отношение поддерживается равным 1. */ glViewport (0, 0, newHeight, newHeight); glMatrixMode (GL_PROJECTION); glLoadldentity ( ); gluOrtho2D (xwcMin, xwcMax, ywcMin, ywcMax); glClear (GL_COLOR_BUFFER_BIT) ; void main (int argc, char** argv) { glutlnit (&argc,>argv); glutlnitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutlnitWindowPosition (50, 50); glutlnitWindowSize (winWidth, winHeight); glutCreateWindow ("Кривая Безье"); init ( ) ; glutDisplayFunc (displayFcn); glutReshapeFunc (winReshapeFcn); glutMainLoop ( ); } СВОЙСТВА КРИВЫХ БЕЗЬЕ Кривые Безье обладают крайне полезным свойством: кривая соединяет первую и по- следнюю контрольные точки. Следовательно, базовую характеристику любой кривой Безье можно сформулировать так: Р(0) = Ро, Р(1) = Рп- (8.43) Значения первых производных кривых Безье по параметру в конечных точках можно вычислить по координатам контрольных точек: Р'(0) = -про + npi, Р'(1) = - прп_1 + прп (8.44)
618 Глава 8. Представления трехмерных объектов Рис. 8.35. Замкнутая кривая Безье, для генерации которой были сов- мещены первая и последняя контрольные точки Из приведенных выражений видно, что касательная в начале кривой параллельна ли- нии, соединяющей первые две контрольные точки, а касательная в конце кривой идет по линии, соединяющей последние точки. Подобным образом, вторые производные кривых Безье по параметру в конечных точках вычисляются так: Р"(0) = п(п - 1)[(р2 - pi) - (pi - ро)], (о.40) P"(i) = п(п - 1)[(рп-2 - Рп-1) - (Рп-1 - Рп)]. Другое важное свойство кривых Безье заключается в том, что вся она лежит внут- ри выпуклой оболочки, сформированной контрольными точками. Это следует из того факта, что все стыковочные функции Безье положительны, и их сумма всегда равна 1: п 52BEZfc;n(u) = 1, (8.46) fc=0 так что любая точка кривой является взвешенной суммой контрольных точек. Указан- ное свойство гарантирует полиномиальную гладкость соединения контрольных точек без неравномерных осцилляций. МЕТОДЫ ПРОЕКТИРОВАНИЯ С ИСПОЛЬЗОВАНИЕМ КРИВЫХ БЕЗЬЕ Чтобы сгенерировать замкнутую кривую Безье, положение последней контрольной точки выбирается равным положению первой, как в примере, показанном на рис. 8.35. Кроме того, ввод нескольких контрольных точек с одинаковыми координатами рав- носильно присвоению большего весового коэффициента этой точке. На рис. 8.36 введены две одинаковые контрольные точки, и видно, что получающаяся кривая при- тягивается к этой точке.
8.10. Сплайновые кривые Безье 619 Рис. 8.36. Кривую Безье можно проложить ближе к данной точке, соотнеся с этим положением несколько контрольных точек Кривую Безье можно подобрать по любому числу контрольных точек, но это требует расчета полиномиальных функций большой степени. Если необходимо сге- нерировать сложные кривые, их проще сформировать стыковкой нескольких участ- ков Безье меньшей степени. Использование меньших участков кривых Безье также улучшает локальный контроль над формой кривой. Поскольку кривые Безье соеди- няют первую и последнюю контрольные точки, участки кривой легко согласовать (непрерывность нулевого порядка). Кроме того, кривые Безье обладают следующим важным свойством: касательная к кривой в конечной точке направлена по линии, соединяющей последнюю точку с предпоследней. Следовательно, чтобы получить непрерывность участков кривой первого порядка, контрольные точки ро' и рр сле- дующего участка кривой нужно выбрать на той же прямой линии, что и контрольные точки рп-1 и рп предыдущего участка (рис. 8.37). Если первый участок кривой имеет п контрольных точек, а следующий — п', тогда касательные к кривым можно согласовать, разместив контрольную точку рр в положении п Р1'=Рп + —(Рп-Рп-1)- (8.47) п Чтобы облегчить размещение рг, можно потребовать только геометрической непре- рывности и поместить рц где-либо на линии между рп-1 и р„. Чтобы получить непрерывность в С2, нужно по уравнению (8.45) согласовать вторые производные по параметру двух соседних участков Безье. В результате в дополнение к фиксированному положению ро' и рр (что необходимо для непрерыв- ности С° и С1) определяется положение контрольной точки р2'. В то же время, тре- бование непрерывности второго порядка участков кривой Безье может быть излишне ограничивающим. Особенно это касается кубических кривых, которые могут иметь только четыре контрольные точки на участок. В этом случае непрерывность второго порядка полностью определяет (фиксирует) положения первых трех контрольных то- чек и оставляет незафиксированной только одну точку, которую можно использовать для настройки формы сегмента кривой.
620 Глава 8. Представления трехмерных объектов Рис. 8.37. Кусочно-гладкая аппроксимация, сформированная двумя участками Безье. Что- бы добиться непрерывности нулевого и первого порядка между двумя участками кривой, использовались условия р0' = Р2 и рр на линии, сформированной точками pi и рг КУБИЧЕСКИЕ КРИВЫЕ БЕЗЬЕ Многие графические пакеты предлагают только функции отображения кубических сплайнов. Это дает разумную гибкость проектирования, не требуя увеличения рас- четов, необходимых при использовании полиномов более высоких порядков. Куби- ческие кривые Безье определяются четырьмя контрольными точками. Четыре сты- ковочные функции для кубических кривых Безье получаются подстановкой п = 3 в уравнение (8.38), и они имеют следующий вид: BEZo,3 = (1 - гг)3, BEZj з = Зд(1 — и)2, ; (8.48) BEZ2,3 = 3и2(1 -и), ’ BEZ3j3 = и3. Графики четырех кубических стыковочных функций Безье приведены на рис. 8.38. Форма стыковочных функций определяет, как контрольные точки влияют на форму кривой при значениях параметра и из диапазона от 0 до 1. При и = 0 единственной отличной от нуля стыковочной функцией является BEZq,3, значение которой равно 1. При и = 1 единственной ненулевой функцией является BEZs^l) = 1. Таким образом, кубическая кривая Безье всегда начинается в контрольной точке ро и за- канчивается в контрольной точке рз. Другие функции, BEZi)3 и BEZ2,3, влияют на форму кривой в промежуточных значениях параметра и, так что получающаяся кри- вая притягивается к точкам pi и р2. Стыковочная функция BEZ13 имеет максимум при и = 1/3, BEZ2,3 достигает максимума при и = 2/3.
8.10. Сплайновые кривые Безье 621 Рис. 8.38. Четыре стыковочные функции Безье для кубических кривых (п = 3) Отметим, что на рис. 8.38 все четыре стыковочные функции не равны нулю во всем диапазоне изменения параметра и между конечными точками. Таким образом, кривые Безье не допускают локального контроля за формой кривой. Если переместить любую из контрольных точек, изменится вся кривая. В конечной точке кубической кривой Безье первые производные по параметру (наклон) равны Р'(0) = 3(pi — ро), Р'(1) = 3(рз-Р2). Вторые производные по параметру равны Р"(0) = 6(р0 - 2Р1 + Р2), Р"(1) = 6(Р1 - 2Р2 + рз). Чтобы построить сложные сплайновые кривые, можно применить ряд кубических участков Безье. Используя выражения для производных по параметру, можно прирав- нять касательные к кривым и получить непрерывность С1 между участками кривой. Кроме того, можно использовать выражения для вторых производных и получить непрерывность С2, хотя это жестко зафиксирует первые три контрольные точки.
622 Глава 8. Представления трехмерных объектов а) б) Рис. 8.39. Каркасная поверхность Безье, построенная по девяти контрольным точкам, выстро- енным в сетку 3 на 3 (панель а), шестнадцати контрольным точкам, выстроенным в сетку 4 на 4 (панель S). Показанные пунктирные линии соединяют контрольные точки Матричная формулировка кубической функции Безье является расширением по- линомиальных выражений для стыковочных функций, при котором уравнения пере- писываются в следующем виде: Р(ц) = р и2 и 1] Мвег • ’Ро' Р1 Р2 , (8.49) .Рз. где матрица Безье имеет такую форму: -1 3 -3 г 3 -6 3 0 ^^Bez — -3 3 0 0 (8.50) _ 1 0 0 0_ Кроме того, можно ввести дополнительные параметры, позволяющие настраивать “натяжение” и “смещение” кривой, как это делалось для интерполирующих сплайнов. Однако, если требуются эти возможности, обычно используются более гибкие би- сплайны или /3-сплайны. 8.11. ПОВЕРХНОСТИ БЕЗЬЕ Набор ортогональных кривых Безье можно использовать для проектирования поверх- ности объекта. Параметрическая векторная функция для поверхности Безье представ- ляется декартовым произведением стыковочных функций Безье: т п P(u,v) = ^2^2pj-fcBEZjjm(-r)BEZfc,n(u) (8.51) j=0 fc=0 при что задает положение (m + 1) на (п + 1) контрольных точках.
8.11. Поверхности Безье 623 Рис. 8.40. Сложная по- верхность Безье, постро- енная из двух участков Безье, соединенных по указанной граничной ли- нии. Пунктирные линии соединяют контрольные точки. Непрерывность первого порядка достига- ется следующим образом: отношение длины L\ к длине L2 поддерживается постоянным для всех кол- линеарных линий кон- трольных точек вдоль границы участков поверх- ности На рис. 8.39 иллюстрируются графики поверхностей Безье. Контрольные точки соединяются пунктирными линиями, а сплошными линиями показаны кривые по- стоянных и и V. Каждая кривая постоянного и изображена для V, меняющегося в интервале от 0 до 1, причем фиксированное и также равно значению из этого интер- вала. Кривые постоянного v изображаются аналогично. Поверхности Безье имеют те же свойства, что и кривые Безье, и они являются удобным средством в приложениях интерактивного проектирования. Чтобы задать трехмерные координаты контрольных точек, можно вначале построить прямоуголь- ную сетку на “нижней” (нулевой) плоскости. Затем в точках пересечения сетки вы- бирается высота над нулевым уровнем — значение координат z контрольных точек. Участки поверхности можно представить многоугольниками и затененными областя- ми, используя методы визуализации, описанные в главе 10. На рис. 8.40 показана поверхность, сформированная двумя участками Безье. Как и для кривых, гладкие переходы от одного участка к другому формируются с помощью условий непрерывности нулевого и первого порядка на линии границы. Непрерыв- ность нулевого порядка достигается за счет согласования контрольных точек на гра- нице. Непрерывность первого порядка получается за счет выбора контрольных точек на прямой линии, идущей по границе, с поддержанием фиксированного отношения сегментов коллинеарных отрезков на границе участков.
624 Глава 8. Представления трехмерных объектов 8.12. БИ-СПЛАЙНЫ Данная категория сплайнов является наиболее используемой, и функции би-сплайнов широко применяются в системах автоматизированного проектирования и многих па- кетах графического программирования. Подобно сплайнам Безье, би-сплайны генери- руются путем аппроксимации набора контрольных точек. В то же время, би-сплайны обладают двумя преимуществами по сравнению со сплайнами Безье: во-первых, сте- пень полинома би-сплайна можно задать независимо от числа контрольных точек (с определенными ограничениями), во-вторых, би-сплайны допускают локальный кон- троль над формой кривой. Платой за этой является большая сложность би-сплайнов по сравнению со сплайнами Безье. УРАВНЕНИЕ БИ-СПЛАЙНА Общее выражение для расчета координат точек би-сплайна можно записать, исполь- зуя концепцию стыковочной функции: п Р(и) = 52 VkBk,d(u), итт <и< umax, 2 < d < п + 1, (8.52) k=o где — входной набор из п + 1 контрольных точек. Существует несколько отли- чий данной формулировки би-сплайна от выражения для сплайна Безье. Диапазон параметра и теперь зависит от того, как выбираются другие параметры би-сплайна. Наконец, стыковочные функции би-сплайна B^^d — это полиномы степени d — 1, где d — параметр степени. (Иногда параметр d называется “порядком” полинома, но такая формулировка может ввести в заблуждение, поскольку термином “порядок” также часто называется степень полинома, которая равна d — 1.) Параметр степени d может принимать любое целое значение из диапазона от 2 до числа контрольных то- чек (n + 1). В действительности значение параметра степени можно также положить равным 1, но тогда наша “кривая” будет простым точечным графиком контрольных точек. Локальный контроль за формой би-сплайна достигается определением стыко- вочных функций на подынтервалах из всего диапазона и. Стыковочные функции для би-сплайнов определяются рекурсивными формулами Кокса-де Бура (Cox-deBoor): {1, если гц. < и < гц.+1 0 в противном случае . (8.53) Bk,d\^) — Bfcd—“Г Bill'd— 1 (^)> ^k+d— 1 '^k ^k+d ^k+1
8.12. Би-сплайны 625 Рис. 8.41. Локальная модификация би-сплайна. Изменение одной контрольной точки (панель а) дает кривую (панель S), которая отличается от предыдущей только в окрестности измененной контрольной точки где каждая стыковочная функция определена на своем подынтервале (общее число — d) общего диапазона и. Конечная точка каждого подынтервала Uj называется узлом (knot), а весь набор конечных точек выбранных подынтервалов называется вектором узлов (knot vector). Значения конечных точек подынтервалов можно выбирать любы- ми при условии, что Uj < Uj+i. После этого значения umin и umax зависят от числа выбранных контрольных точек, значения параметра степени d и выбора подынтер- валов (вектора узлов). Поскольку элементы вектора узлов можно выбрать так, чтобы некоторые знаменатели в формулах Кокса-де Бура обращались в 0, при практическом расчете по этим формулам предполагается, что любой член вида 0/0 имеет значение 0. На рис. 8.41 демонстрируются возможности би-сплайнов по локальному кон- тролю. Помимо локального контроля би-сплайны позволяют варьировать число кон- трольных точек, используемых в разработке кривой, без изменения степени поли- нома. Кроме того, можно увеличить число значений в векторе узлов, что облегчает проектирование кривых. Впрочем, если так поступить, придется добавить несколько контрольных точек, поскольку размер вектора узлов зависит от параметра п. Би-сплайны имеют следующие свойства. • Полиномиальная кривая имеет степень d — 1 и непрерывность Cd~2 в диапазоне изменения и. • При n+1 контрольных точек кривая описывается n+1 стыковочными функциями. • Каждая стыковочная функция определена на d подынтервалах общего диа- пазона и, начиная со значения узла и^. • Диапазон параметра и делится на n + d подынтервалов n + d + 1 значениями, заданными в векторе узлов.
626 Глава 8. Представления трехмерных объектов • Если значения узлов обозначить {uo, ui,..., un+d}, получающийся би-сплайн определяется только в интервале от значения узла u^-i до значения un+i. (Неко- торые стыковочные функции вне этого интервала не определены.) • Каждый участок сплайна (между двумя последовательными значениями узлов) определяется d контрольными точками. • Любая контрольная точка может влиять на форму максимум d участков кривой. Кроме того, би-сплайн лежит внутри выпуклой оболочки максимум d+1 контрольных точек, так что би-сплайны тесно связаны с введенными положениями. Для любого значения и в интервале от узлового значения до un+i сумма всех базисных функций равна 1: п ^Вм(п) = 1. (8.54) fc=0 Для данных положений контрольных точек и значения параметра степени d требуется задать значения узлов, чтобы, используя рекуррентные соотношения (8.53), получить стыковочные функции. Существует три общие классификации векторов узлов: рав- номерная, открытая равномерная и неравномерная. Би-сплайны часто описываются согласно классу выбранного вектора узлов. РАВНОМЕРНЫЕ ПЕРИОДИЧЕСКИЕ БИ-СПЛАЙНЫ Если расстояние между значениями в узлах постоянно, получающаяся в результате кривая называется равномерным би-сплайном. Например, можно задать следующий равномерный вектор узлов: {-1,5; -1,0; -0,5; 0,0; 0,5; 1,0; 1, 5; 2,0}. Часто значения узлов нормируются в диапазон от 0 до 1, как, например, в следующем примере: {0,0; 0,2; 0,4; 0,6; 0,8; 1,0}. Во многих приложениях удобно задать равномерные значения узлов с шагом 1 и начальным значением 0. Пример подобной спецификации приводится ниже. {0; 1; 2; 3; 4; 5; 6; 7}.
г 8.12. Би-сплайны 627 В2» 1 0,8 0,6 0,4 0,2 0 В|.3(») 1 и 0,4 0,8 0,6 0,8 0,6 В3,з(“) 1г- б) 6й 0,2 О "Ь Дтл) — В"Ь 2Ди), (8.55) Равномерные квадратные би-сплайны ПРИМЕР 8.1. и 0,4 0,2 Равномерные би-сплайны имеют периодические стыковочные функции. Следователь- но, для данных значений п и d все стыковочные функции имеют одинаковую фор- му. Каждая последующая стыковочная функция является просто смещенной версией предыдущей: где Ди — интервал между соседними значениями узлов. На рис. 8.42 показана квад- ратная равномерная стыковочная функция би-сплайна, сгенерированная в приведен- ном ниже примере по кривой с четырьмя контрольными точками. 0 12 3 в) г) Рис. 8.42. Периодические стыковочные функции би-сплайна для п = d = 3 и равномерный целый вектор узлов Чтобы проиллюстрировать формулировку стыковочных функций би-сплайнов для равномерного целого вектора узлов, выберем значения параметров d = п = 3. В таком случае вектор узлов должен содержать п + d + 1 = 7 значений узлов: {0; 1; 2; 3;4; 5; 6}, параметр и изменяется от 0 до 6, число подынтервалов равно п + d — 6.
628 Глава 8. Представления трехмерных объектов Каждая из четырех стыковочных функций захватывает d = 3 подынтервала общего диапазона и. Используя рекуррентные формулы (8.53), получаем первую стыковочную функцию: ( 1 2 — и для 0 < и < 1, Вод(и) - < -п(2 — и) + ~ — и) для 1 < “ < 2, — (3 — и)2 для 2 < и < 3. Следующая периодическая стыковочная функция получается с использованием соотношения (8.55) при подстановке в него и — 1 вместо и в .Вод и смещении начального положения на 1 в сторону увеличения: — (и — l)^ для 1 < и < 2, В1,з(и) = < -(и - 1)(3 - и) + -(и - 2)(4 - и) для 2 < и < 3, — (4 — и) для 3 < и < 4. Подобным образом, оставшиеся две периодические функции получаются после- довательным смещением Вцз вправо: ~(и — 2)2 для 2 < и < 3, Вгд(и) = < -(ц — 2)(4 — п) + -(п — 3)(5 — п) для 3 < и < 4, — (5 — и)2 для 4 < и < 5, ~(и — 3)2 для 3 < и < 4, Вз,з(и) = < ^(u — 3)(5 — и) + -(и — 4)(6 — и) для 4 < и < 5, — (6 — и)2 для 5 < и < 6. График четырех периодических квадратных стыковочных функций представлен на рис. 8.42, где демонстрируется локальная особенность би-сплайна. Первая контрольная точка умножается на стыковочную функцию Вод (и). Следовательно, изменение положения первой контрольной точки влияет только на форму кривой до и = 3. Аналогично последняя контрольная точка влияет на форму сплайновой кривой в интервале, где определено Взд.
8.12. Би-сплайны 629 Рис. 8.43. Квадратный периодический би-сплайн, подобранный по четырем контрольным точкам на плоскости ху 4 Ро Рз Рис. 8.44. Замкнутый периодический кусочно-гладкий би-сплайн, по- строенный с использованием циклической спецификации четырех контрольных точек для каждого участка кривой На рис. 8.42 также иллюстрируются ограничения би-сплайнов. Все стыко- вочные функции представлены в интервале от Ud-i — 2 до un+i = 4. Ниже 2 и выше 4 представлены не все стыковочные функции. Данный интервал от 2 до 4 является диапазоном полиномиальной кривой и интервалом, в котором спра- ведливо уравнение (8.54). Следовательно, сумма всех стыковочных функций на этом интервале равна 1. Вне данного интервала суммировать все стыковочные функции нельзя, поскольку не все они определены ниже 2 и выше 4. Поскольку диапазон получающейся полиномиальной кривой принадлежит промежутку от 2 до 4, начальную и конечную позицию кривой можно определить, вычислив стыковочные функции, в этих точках: Pstart — 2 (РО + Pl)> Pend — 2 (Р2 4“ Рз)- Таким образом, кривая начинается посредине между первыми двумя контрольны- ми точками и заканчивается посредине между двумя последними контрольными точками. Кроме того, в начальной и конечной точках кривой можно определить па- раметрические производные. Вычисляя производные стыковочных функций и подставляя значения конечных точек вместо параметра и, получаем, что Pstart = Р1 - Ро, Pend=P3~P2- Параметрическая касательная кривой в начале параллельна линии, соединя- ющей первые две контрольные точки, а параметрическая касательная в конце кривой параллельна линии, соединяющей последние две контрольные точки. На рис. 8.45 приведен график квадратного периодического би-сплайна для четырех контрольных точек, выбранных на плоскости ху.
630 Глава 8. Представления трехмерных объектов В предыдущем примере было отмечено, что квадратная кривая начинается меж- ду первыми двумя и заканчивается между двумя последними контрольными точками. Полученный результат справедлив для квадратных периодических би-сплайнов, по- добранных по любому числу различных контрольных точек. Вообще, для полиномов высокого порядка начальная и конечная точки являются взвешенным средним d — 1 контрольных точек. Кроме того, сплайновую кривую можно поместить ближе к любой контрольной точке, введя эту точку несколько раз. Общие выражения для граничных условий на периодические би-сплайны можно получить, так перепараметризовав стыковочные функции, чтобы параметр и отобра- жался в единичный интервал от 0 до 1. Затем начальное и конечное условие находится при и = 0 и и = 1. КУБИЧЕСКИЕ ПЕРИОДИЧЕСКИЕ БИ-СПЛАЙНЫ Поскольку кубические периодические би-сплайны широко используются в графи- ческих пакетах, рассмотрим формулировку этого класса сплайнов. Периодические сплайны особенно полезны при генерации определенных замкнутых кривых. Напри- мер, замкнутую кривую, показанную на рис. 8.44, можно сгенерировать, циклически задав четыре из шести контрольных точек для каждого участка. Кроме того, если ко- ординаты трех последовательных контрольных точек равны, кривая проходит через эту точку. Для кубических би-сплайнов d. = 4 и каждая стыковочная функция захватывает четыре подынтервала из общего диапазона и. Если нужно подобрать кубическую кривую по четырем контрольным точкам, можно использовать целочисленный век- тор узлов {0; 1; 2; 3; 4; 5; 6; 7} и рекуррентные соотношения (8.53), из которых находятся периодические стыковоч- ные функции, как было сделано в предыдущем разделе для квадратных периодиче- ских би-сплайнов. Чтобы вывести уравнение кривой для периодического кубического би-сплайна, рассмотрим альтернативную формулировку, начав с граничных условий и получив стыковочные функции, нормированные в интервал 0 < и < 1. Используя эту форму- лировку, можно также легко найти характеристическую матрицу. Граничные условия на периодические кубические би-сплайны для четырех контрольных точек, обозна- ченных ро, pi, Р2 и рз, имеют вид: Р(0) = |(ро + 4pi +р2), Р(1) = |(Р1 +4Р2 + Рз),
8.12. Би-сплайны 631 Р'(0) = ^(Р2-Р«), P'(l) = l(P3-Pi). (8.56) Данные граничные условия подобны условиям для фундаментальных сплайнов: участки кривой определены четырьмя контрольными точками, и параметрические касательные в начале и конце каждого участка кривой параллельны хордам, соеди- няющим соседние контрольные точки. Участок би-сплайна начинается в точке возле Р1 и заканчивается в точке вблизи рг- Матричную формулировку кубического периодического би-сплайна с четырьмя контрольными точками можно записать следующим образом: Р(и) = [и3 и2 и 1] • Mjg • Ро Р1 Р2 .РЗ. (8-57) где матрица би-сплайна для периодических кубических полиномов выглядит так: ’-I 3 -3 Г 13-630 6 -3 0 3 0 14 10 (8.58) Данную матрицу можно получить, найдя коэффициенты в общем выражении для кубического полинома, используя четыре заданных граничных условия. Кроме того, уравнения би-сплайнов можно модифицировать так, чтобы они вклю- чали параметр натяжения t (как для фундаментальных сплайнов). Матрица периоди- ческого кубического би-сплайна с параметром натяжения t равна -t 12 - 9t 9*- 12 *‘ 1 3t 12* - 18 18 - 15* 0 МВ, = - -3* 0 3* 0 t 6-2* * 0_ (8-59) и она сводится к Мв при t = 1.
632 Глава 8. Представления трехмерных объектов Стыковочные функции периодического кубического би-сплайна с параметром, меняющимся в диапазоне 0-1, получаются расширением матричного представления в полиномиальную форму. Например, используя значение натяжения t = 1, получаем В0,з(и) = j(l - и)3, 0 < и < 1, ВцзН = |(Зи3-6и2 + 4), J (8-60) •®2,з(и) = — (—Зи3 + 8tz2 + Зи + 1), 1 3 В3,з(и) = . ОТКРЫТЫЕ РАВНОМЕРНЫЕ БИ-СПЛАЙНЫ Данный класс би-сплайнов является промежуточным между равномерными и нерав- номерными би-сплайнами. Иногда он считается частным случаем равномерного би- сплайна, а иногда он относится к неравномерным би-сплайнам. Для открытых равно- мерных би-сплайнов, или просто открытых би-сплайнов, расстояние между узлами равномерно, за исключением концов, где значения узлов повторяются d раз. Ниже приводится два примера открытых равномерных целочисленных вектора узлов с начальным значением 0. {0, 0,1,2,3,3} для d = 2 и п = 3, 1 (8.61) {0,0,0,0,1,2,2,2,2} для d = 4 и п = 4. Данные векторы можно нормировать в единичный интервал от 0 до 1: {0,0,0.33,0.67,1,1} для d = 2 и п = 3, г , (8-62) {0, 0,0,0, 0.5,1,1,1,1} для d = 4 и п = 4. Для любых значений параметров d и п открытый равномерный вектор узлов с целыми значениями можно сгенерировать, используя формулы {0 для 0 < j < d, j — d + 1 для d < j < n, (8.63) n — d + 2 для j > n, для значений j из диапазона от 0 до п + d. При этом первым d узлам присваивается значение 0, а последние d узлов имеют значение п — d + 2.
8.12. Би-сплайны 633 Открытые равномерные би-сплайны обладают характеристиками, весьма подоб- ными характеристикам сплайнов Безье. Фактически при d = n +1 (степень полинома равна п) открытые би-сплайны сводятся к сплайнам Безье, и все значения узлов рав- ны 0 или 1. Например, при кубическом открытом би-сплайне (d = 4) и четырех контрольных точках вектор узлов равен: {0,0,0,0,1,1,1,1}. Полиномиальная кривая для открытого би-сплайна соединяет первую и последнюю контрольную точку. Кроме того, параметрическая касательная кривой в первой кон- трольной точке параллельна прямой линии, сформированной первыми двумя кон- трольными точками, а параметрическая касательная в последней контрольной точке параллельна линии, определенной двумя последними контрольными точками. Таким образом, геометрические условия для согласования участков кривой не отличаются от условий для кривых Безье. Как и для кривых Безье, задание нескольких совпадающих контрольных точек притягивает би-сплайн к данной точке. Поскольку открытые би-сплайны начинают- ся в первой контрольной точке и заканчиваются в последней, замкнутую кривую можно определить, задав первую и последнюю контрольную точку с одинаковыми координатами. ПРИМЕР 8.2. Открытые равномерные квадратные би-сплайны Из условий (8.63) при d = 3 и п = 4 (пять контрольных точек) получаем следу- ющие восемь значений вектора узлов: {0,0,0,1,2,3,3,3}. Общий диапазон и делится на семь подынтервалов, и каждая из пяти стыковоч- ных функций 3 определяется на трех подынтервалах, начиная с положения узла ид,. Следовательно, Во з определена от uq = 0 до = 1, Bi 3 определена от uj = 0 до U4 = 2 и В4 3 определена от гц = 2 до 117 = 3. Явные поли- номиальные выражения для стыковочных функций находятся из рекуррентных соотношений (8.53): В0,з(«) = (1 - «)2 ( |«(4 - Згг) D /.Л __ ) 0 < и < 1, 0 < и < 1, 1 < и < 2,
634 Глава 8. Представления трехмерных объектов ' 1 2 2U #2,з(^) = < ^и(2 - и) + - 1)(3 - и) и Лр-“)2 О < и < 1, 1 < и < 2, 2 < и < 3, ( I)2 В3>3(и) = j [ ^(3 “ и)(3и - 5) •64,3(и) = (« - 2)2 1 < и < 2, 2 < и < 3, 2 < и < 3. На рис. 8.45 показана форма данных пяти стыковочных функций. Снова видны локальные особенность би-сплайнов. Стыковочная функция Bq 3 не равна нулю только в подынтервале от 0 до 1, так что первая контрольная точка влияет на кривую только в этом интервале. Подобным образом, функция В^з равна 0 вне интервала от 2 до 3, и положение последней контрольной точки не влияет на форму кривой в начале и середине кривой. Матричные преобразования для открытых би-сплайнов нельзя получить в такой удобной форме, как для периодических равномерных би-сплайнов. Это вызвано тем, что в начале и конце вектора узлов присутствуют кратные значения. НЕРАВНОМЕРНЫЕ БИ-СПЛАЙНЫ Для данного класса сплайнов вектор узлов может принимать любые значения из любых интервалов. При неравномерных би-сплайнах можно выбирать несколько внутренних значений узлов и неравномерное размещение значений узлов. Приведем несколько примеров: {0; 1; 2; 3;3;4}, {0; 2; 2; 3; 3; 6}, {0; 0; 0; 1; 1; 3; 3; 3}, {0; 0,2; 0,6; 0,9; 1,0}. Неравномерные би-сплайны предлагают повышенную гибкость в управлении формой кривой. Неравномерные интервалы в векторе позволяют получать различные формы стыковочных функций в различных интервалах, что может использоваться для определения особенностей сплайнов. Увеличивая кратность узлов, можно настраи- вать траекторию кривой и вводить разрывы. Отметим также, что кратные значения узлов уменьшают непрерывность на 1 при каждом повторе значения.
8.12. Би-сплайны 635 Рис. 8.45. Открытая равномерная би-сплайновая стыковочная функция при п = 4 и d = 3 Стыковочные функции неравномерного би-сплайна получаются с помощью мето- дов, подобных рассмотренным для равномерных и открытых би-сплайнов. Для данно- го набора n+1 контрольных точек задается степень полинома и выбираются значения узла. Затем, используя рекуррентные соотношения, можно либо получить набор сты- ковочных функций, либо вычислить непосредственно точки кривой для вывода их на экран. В графических пакетах интервалы между узлами часто ограничены значениями О или 1, что сокращает необходимые вычисления. Далее можно записать набор харак- теристических матриц и использовать его для расчета значений на сплайновой кривой без вычислений рекуррентных соотношений для каждой изображаемой точки кривой.
636 Глава 8. Представления трехмерных объектов Рис. 8.46. Прототип вертолета, разработан- ный и смоделированный Даниэлем Лангло- исом (Daniel Langlois) из SOFTIMAGE, Inc., Монреаль (Канада) с помощью 180 000 участков би-сплайновых поверхностей. Для визуализации сцены применялся расчет лу- чей, отображение шероховатости и построе- ние отражений (перепечатано с разрешения Silicon Graphics, Inc.) Рис. 8.47. Радиус-векторы вдоль участков кривой слева и справа узла uj 8.13. БИ-СПЛАЙНОВЫЕ ПОВЕРХНОСТИ Формулировка би-сплайновой поверхности подобна формулировке сплайнов Безье. Векторную точечную функцию на би-сплайновой поверхности можно получить, ис- пользуя декартово произведение стыковочных би-сплайновых функций вида Пи Пу р(п,ц) = 22 J2 рмАа(цЖд(4 (8-64) ки^~0 ку0 где векторные значения Pku,kv задают положения (пи + 1) на (nv + 1) контрольных точках. Би-сплайновые поверхности демонстрируют те же свойства, что и составляющие их би-сплайны. Поверхность можно построить по выбранным значениями парамет- ров степени du и dv, которые задают степени ортогональных полиномов поверхности равными du — 1 и dv — 1. Для каждого параметра поверхности и и v также выбирают- ся значения векторов узлов, которые определяют диапазон параметров стыковочных функций. Объект, смоделированный с помощью би-сплайновых поверхностей, пока- зан на рис. 8.46. 8.14. БЕТА-СПЛАЙНЫ Обобщением би-сплайнов являются бета-сплайны (/3-сплайны), которые формули- руются наложением условия геометрической непрерывности на первую и вторую производные по параметру. Параметры непрерывности бета-сплайнов называются параметрами в.
8.14. Бета-сплайны 637 Pi»1 Рис. 8.48. Влияние па- раметра /31 на форму бета-сплайна УСЛОВИЯ НЕПРЕРЫВНОСТИ БЕТА-СПЛАЙНОВ Для указанного вектора узлов слева и справа от узла Uj задаются участки сплайна с радиус-векторами Pj_i(u) и Pj(u) (рис. 8.47). Непрерывность нулевого порядка (позиционная непрерывность) G° в Uj осуществляется при выполнении следующего требования: Pj-l(w>) = (8-65) Непрерывность первого порядка (непрерывность единичной касательной) G1 обес- печивается выполнением требования “касательные векторы должны быть пропорци- ональны”: /3iP'_i(uj) = Р' (uj), (3i > 0. (8.66) Здесь первые производные по параметру пропорциональны, и единичные касатель- ные векторы непрерывны в узле. Непрерывность второго порядка (непрерывность вектора кривизны) G2 обеспе- чивается при условии, что £12Р^1Ы +&Р'-1Ы = Р"(иД (8.67) где параметру /% можно присваивать любое действительное значение, а /31 > 0. Век- тор кривизны дает меру величины изгиба кривой в точке Uj. Если /31 = 1 и /Зг = 0, бета-сплайны сводятся к би-сплайнам. Параметр /31 называется параметром смещения, поскольку он управляет асим- метрией кривой. При /31 > 1 кривая “придавлена” справа в направлениях единичных касательных векторов, выходящих из узлов. При 0 < /31 < 1 кривая сглажена слева. Влияние /31 на форму сплайновой кривой показано на рис. 8.48. Параметр /З2 называется параметром натяжения, поскольку он контролирует, насколько плотно или разреженно сплайн аппроксимирует контрольный график. При увеличении /Зг кривая приближается по форме к контрольному графику, как показано на рис. 8.49.
638 Глава 8. Представления трехмерных объектов КУБИЧЕСКОЕ ПЕРИОДИЧЕСКОЕ МАТРИЧНОЕ ПРЕДСТАВЛЕНИЕ БЕТА-СПЛАЙНОВ Налагая граничные условия бета-сплайна на кубический полином с равномерным вектором узлов, получим матричное представление периодического бета-сплайна: 1 wl 2(/32 +/З3 +/З2 +/31) -^(32 + 2(31 + 2(31) -2(/32 + /32 + /3i + 1) 3(/32 + 2/32) 2' 0 М/з = - , (8.68) 6 -wl 6(/3? -/31) 6/31 0 (32 + 4(/32 + /31) 2 0_ где J = /32 + 2/33 + 4/32 + 4/31 + 2. Матрица би-сплайна Мв получается при /3j = 1 и /32 = 0. Матрица натяжения би-сплайна Met (уравнение (8.59)) получается при = /з2 = у(1-г). 8.15. РАЦИОНАЛЬНЫЕ СПЛАЙНЫ Рациональная функция представляет собой просто отношение двух полиномов. Сле- довательно, рациональный сплайн — это отношение двух сплайновых функций. На- пример, рациональный би-сплайн можно описать радиус-вектором Z3fc=0 Y?k=0^kBk,d{u) (8.69) где — набор из п + 1 положений контрольных точек. Параметры — весовые ко- эффициенты контрольных точек. Чем больше значение определенного тем ближе кривая притягивается к контрольной точке р&, взвешенной этим параметром. Когда всем весовым коэффициентам будут присвоены значения 1, получим стандартный би-сплайн, поскольку в таком случае знаменатель в уравнении (8.69) — это просто сумма стыковочных функций, которая равна 1 (уравнение (8.54)).
8.15. Рациональные сплайны 639 Рациональные сплайны имеют два важных преимущества перед нерациональны- ми. Во-первых, они точно представляют кривые второго порядка (конические сече- ния), такие как окружности и эллипсы. Нерациональные сплайны (полиномы) могут только аппроксимировать конические сечения. Эта возможность позволяет графиче- ским пакетам моделировать все формы кривых с помощью одного представления (ра- циональных сплайнов), не требуя для обработки различных форм большой библиоте- ки криволинейных функций. Второе преимущество рациональных сплайнов заключа- ется в том, что они инвариантны относительно перспективной проекции (раздел 7.8). Это означает, что перспективное преобразование можно применять к контрольным точкам рациональной кривой, и получится правильная проекция кривой. С другой стороны, нерациональные сплайны, не инвариантны относительно перспективной проекции. Поэтому обычно в проектах графической разработки для построения ра- циональных би-сплайнов используются неравномерные представления вектора узлов. Данные сплайны называются “NURBS” {Nonuniform Rational B-splines — неравномер- ные рациональные би-сплайны). Рациональные сплайны представляются в однородных координатах, поскольку их знаменатель можно рассматривать как однородный коэффициент h в четырехмер- ном представлении контрольных точек. Следовательно, рациональный сплайн можно расценивать как проекцию четырехмерного нерационального сплайна в трехмерное пространство. Вообще, представление рациональными би-сплайнами выполняется с использо- ванием тех же процедур, что применяются для получения нерационального пред- ставления. Для данного набора контрольных точек, степени полинома, весовых коэф- фициентов и вектора узлов с помощью рекуррентных соотношений находятся стыко- вочные функции. Затем в какой-нибудь системе автоматизированного проектирования строится коническое сечение по заданным трем точкам на дуге. После этого опре- деляется представление рациональными сплайнами в однородных координатах, для чего вычисляются положения контрольных точек, которые дадут коническое сечение выбранного типа. В качестве примера описания конических сечений рациональными сплайнами ис- пользуем квадратный би-сплайн (d = 3), три контрольные точки и открытый вектор который представляет квадратный сплайн Безье. Затем весовым функциям присваи- ваются такие значения: Wo = w2 = 1 W1 = , 0 < г < 1, 1 - г (8.70)
640 Глава 8. Представления трехмерных объектов Рис. 8.50. Конические сечения, генерируемые с использовани- ем различных значений весово- го коэффициента рационального сплайна иц Рис. 8.51. Дуга окружности в первом квадранте плоско- сти ху и представление рациональными би-сплайнами выглядит так: РоДр,з(ц) + [г/(1 - г)]р!В1,з(ц) + Р2#2,з(ц) Во,з(и) + [г/(1 - г)]В11з(п) + в2>з(и) Затем можно получить различные конические сечения (рис. 8.50), используя следую- щие значения параметра г: г > 1/2, > 1 г = 1/2, г < 1/2, г = 0, = 1 ОД < 1 u>i = 0 участок гиперболы, участок параболы, участок эллипса, участок прямой линии.
8.16. Преобразование между сплайновыми представлениями 641 Чтобы, например, сгенерировать четверть дуги единичной окружности в первом квад- ранте плоскости ху (рис. 8.51), положим = cos</> и следующим образом выберем контрольные точки: РО = (0,1), Р1=(1,1), Р2 = (1,0). Полную окружность можно получить, сгенерировав участки в трех других квадран- тах с использованием схожего размещения контрольных точек. Полную окружность можно получить по участку в первом квадранте, используя геометрические преобра- зования на плоскости ху. Например, можно симметрично отобразить четверть дуги окружности относительно осей х и у и получить дуги в других квадрантах. Однородное представление единичной дуги окружности в первом квадранте плоскости ху имеет такой вид: Xh(u) Уь(и) Zh(u) h(u) 1 — u2 2u 0 1 + u2 (8.72) Данное однородное представление дает следующие параметрические уравнения окружности для первого квадранта: _ xh(u) _ 1 - и2 h(u) 1 + и2 ’ = Уь(и) = 2и h(u) 1 + tz2 (8.73) 8.16. ПРЕОБРАЗОВАНИЕ МЕЖДУ СПЛАЙНОВЫМИ ПРЕДСТАВЛЕНИЯМИ Иногда бывает удобно переключиться с одного сплайнового представления на другое. Например, представление Безье наиболее подходит для деления сплайновой кривой, а би-сплайны предлагают большую конструкционную гибкость. Таким образом, кривая может разрабатываться с помощью би-сплайновых участков, затем преобразовывать- ся в эквивалентное Безье-представление для отображения объекта с размещением точек на кривой с использованием рекурсивной процедуры деления. Предположим, что дано сплайновое описание объекта, которое можно выразить с помощью следующего произведения матриц: Р(и) — U • M^splinel ’ M-geoml 1 (8-74)
642 Глава 8. Представления трехмерных объектов где Mspiinei — матрица, характеризующая сплайновое представление, a MgeOmi — вектор-столбец геометрических условий (например, координат контрольных точек). Чтобы перейти ко второму представлению, характеризуемому сплайновой матрицей MSpiine2, необходимо определить матрицу геометрических условий MgeOm2, которая дает такую же векторную точечную функцию объекта. Следовательно, P(lf) = U • ]Mspline2 ‘ M-geom2 (8-75) ИЛИ U • M^spline2 ' M-geom2 = U • M^plinel ' M-geoml- (8.76) Вычисляя отсюда Mgeom2, получаем: Mgeom2 = MSpjjne2 • Mgplinel ’ Mgeomi = = M-sl,s2 ‘ M-geoml- (8.77) Следовательно, искомая матрица преобразования, которая переводит первое сплай- новое представление во второе, имеет такой вид: ^I.sl,,s2 — M~spline2 MSplinel- (8.78) Неравномерный би-сплайн нельзя описать общей сплайновой матрицей. Однако мож- но переупорядочить последовательность узлов, чтобы перевести представление в форме неравномерного би-сплайна в представление Безье. Затем матрицу Безье мож- но преобразовать в любую другую форму. В приведенном ниже примере рассчитывается матрица преобразования, пере- водящая периодическое представление кубическими би-сплайнами в представление кубическими кривыми Безье. ’-I 3 -3 Г -1 -1 3 -3 г 3-630 1 3-630 МВ’Вег = -3 3 0 0 ’ 6 -3 0 3 0 _ 1 0 0 0, _ 1 4 10 '1 4 1 О’ 0 4 2 0 0 2 4 0 0 14 1
8.17. Отображение сплайновых кривыхи поверхностей 643 Кроме того, матрица преобразования, переводящая представление кубическими кри- выми Безье в периодическое представление кубическими би-сплайнами, выгля- дит так: -1 _1 1 1 1 ~6 2 2 6 1 1 -1 0 MBez.B = 2 1 2 1 0 0 ~2 2 1 2 1 о _ 6 3 6 ’6 -7 2 О’ 0 2 -1 0 0 -1 2 0 0 2 -7 6 '-I 3 -3 Г 3-630 -3 3 0 0 10 0 0 (8.80) 8.17. ОТОБРАЖЕНИЕ СПЛАЙНОВЫХ КРИВЫХ И ПОВЕРХНОСТЕЙ Чтобы отобразить сплайновую кривую или поверхность, необходимо определить ко- ординаты точек кривой или поверхности, проектирующихся в пиксели устройства вывода на экран. Это означает, что нужно вычислить параметрические полиномиаль- ные сплайновые функции с определенным шагом в области определения функций. Для эффективного выполнения этих расчетов было разработано несколько методов. ПРАВИЛО ГОРНЕРА Простейшим методом расчета значения полинома (кроме прямого последовательного вычисления значения каждого члена) является правило Горнера (Homer’s rule), со- гласно которому вычисления определяются через последовательную факторизацию. Схема требует одного умножения и одного сложения на каждом этапе, причем поли- ном n-й степени обрабатывается за п шагов. Для иллюстрации правила Горнера предположим, что дано представление куби- ческими сплайнами, где координата х выражается следующим образом: х(и) = ахи? + bxv? + схи + dx, (8.81)
644 Глава 8. Представления трехмерных объектов также имеются аналогичные выражения для координат у и z. При конкретном значе- нии параметра и значение данного полинома вычисляется в следующем факторизо- ванном порядке: х(и) = [(ах и + bx)u + сх]и + dx. (8.82) Расчет каждого значения х требует трех умножений и трех сложений, поэтому, чтобы определить все координаты (х, у, z) на кривой кубического сплайна, требуется девять умножений и девять сложений. Чтобы сократить объем вычислений, необходимых в схеме Горнера, можно при- менить дополнительную факторизацию, что особенно актуально для полиномов вы- соких порядков (степени больше 3). Однако повторяющийся расчет координат точек в диапазоне изменения сплайновой функции может выполняться гораздо быстрее, если использовать правые разности или метод деления сплайна. РАСЧЕТ ПО ПРАВЫМ РАЗНОСТЯМ Быстрый метод вычисления значений полиномов заключается в рекурсивной генера- ции последовательных значений с помощью приращений ранее рассчитанных вели- чин, например, по следующей формуле: T:fc+1 = xk + Axk. (8.83) Таким образом, если на шаге известны инкремент и значение хк, можно получить следующее значение, просто прибавив к хк данный прирост. Прирост Дхк на каж- дом шаге называется правой разностью. При параметрическом представлении кривой правые разности находятся по интервалам, выбранным для параметра и. Если раз- делить общий диапазон и на подынтервалы фиксированного размера 5, тогда двумя последовательными положениями х будут хк = х(ик) и Zfc-i-i = T(rifc+i), где Ufc-i-i = ик 4- 6, А: = 0,1,2, ... (8.84) и uq = 0. В качестве иллюстрации данного метода рассмотрим полиномиальное представ- ление х(и) = ахи + Ьх для точек с координатами х на линейной сплайновой кривой. Две последовательные по координате х точки представляются следующим образом: хк — ах ик -|- Ьх, ’ (8.85) ^fc+1 — 4“ 4” bx.
8.17. Отображение сплайновых кривыхи поверхностей 645 Вычитая из первого уравнения второе, получаем правую разность: Ахк = Zfc+1 - xk = axS. (8.86) В данном случае правая разность постоянна. Для полиномов больших порядков правая разность сама является полиномом от параметра и. Степень данного полинома правой разности на единицу меньше степени исходного полинома. Для представления кубическими сплайнами, выраженного в уравнении (8.81), две последовательные точки с координатами х имеют следующее полиномиальное представление: Хк &х ^к ^к Сх ^к Т" ^хч 87) ах(ик И- д) И- Ьх(ик "Т Т" ^x(j^k Т" Т" dx. Теперь прямая разность вычисляется как Ахк = 3ax8 и2 + (Зат S2 + 2bx 8)ик + (ах J3 + bx 82 + сх 6) (8.88) и является квадратной функцией параметра ик. Поскольку Дхк — полиномиальная функция от и, ту же процедуру последовательного приращения можно использовать для получения последовательных значений Дхк. Следовательно, Aarfc+i = Ахк + A2a:fc, (8.89) где вторая правая разность является линейной функцией: A2a:fc = 6ах62ик + 6ах63 + 2ЬХ62. (8.90) Еще раз повторяя данную процедуру, можно записать A2^fc+1 = ^2Хк + (8.91) и получить третью правую разность в виде постоянного выражения Дзггд. = 6ах63. (8.92)
646 Глава 8. Представления трехмерных объектов Уравнения (8.83), (8.89), (8.91) и (8.92) описывают расчет точек кубической кри- вой с помощью приращений по правым разностям. Начиная с точки ио = 0 и двигаясь с постоянным шагом д, вычисляем исходные значения координаты х и первые две правые разности то — dx, Дт0 = ах<53 + Ьх<51 2 3 + сх<5, (8.93) = 6ах53 + 2ЬХ52. После того как данные исходные значения вычислены, расчет остальных последова- тельных значений координаты х требует только трех операций сложения. Метод правых разностей можно применить для определения точек на сплайно- вой кривой любой степени п. Все последовательные точки с координатами (х, у, z) вычисляются в цикле, содержащем Зп операций сложения. Для поверхностей инкре- ментные расчеты применяются к параметру и и параметру v. МЕТОДЫ ПОДРАЗДЕЛЕНИЯ Процедуры рекурсивного подразделения сплайнов используются для последователь- ного деления данного участка кривой пополам с увеличением на каждом шаге числа контрольных точек. Методы подразделения полезны при выводе на экран аппрок- симирующих сплайновых кривых, поскольку процесс подразделения можно продол- жать, пока график, построенный по контрольным точкам, не аппроксимирует траек- торию кривой. Затем контрольные точки можно изобразить как точки кривой. Другое применение подразделения — генерация большего числа контрольных точек для на- стройки формы кривой. Следовательно, общую форму кривой можно спроектировать с помощью нескольких контрольных точек, затем применить процедуру подразде- ления и получить дополнительные контрольные точки, используя которые идеально настраиваются небольшие участки кривой. Подразделение сплайна проще всего применяется к участкам кривой Безье, по- скольку кривая начинается в первой контрольной точке и заканчивается в послед- ней, параметр и всегда изменяется в диапазоне от 0 до 1, и легко определить, ка- кие контрольные точки “достаточно близки” к траектории кривой. Чтобы применить подразделение Безье к другим сплайновым представлениям, реализуется следующая последовательность операций. 1. Преобразовать текущее сплайновое представление в представление Безье. 2. Применить алгоритм подразделения Безье. 3. Преобразовать представление Безье в исходное сплайновое представление.
8.17. Отображение сплайновых кривыхи поверхностей 647 Р|2 Р13-Р2О р21 Р10 • • Р23 После деления Рис. 8.52. Подразделение кубического участ- ка кривой Безье на два сегмента с четырьмя контрольными точками каждый На рис. 8.52 показан первый этап рекурсивного подразделения кубической кри- вой Безье. Точки на кривой Безье описываются параметрической точечной функцией Р(м) при 0 < и < 1. На первом этапе подразделения используется средняя точка Р(0,5), делящая исходную кривую на два сегмента. Затем первый сегмент описыва- ется точечной функцией Pi(s), а второй — функцией Рг(£), где s = 2и t = 2и — 1 при 0,0 < и < 0, 5, при 0,5 < и < 1,0. (8.94) Каждый участок кривой имеет такое же число контрольных точек, что и исходная кривая. Кроме того, граничные условия (одинаковые положения и производные по параметру) на концах двух участков кривой должны согласовываться с положения- ми и значениями производных исходной кривой Р(н). Это дает четыре условия на каждый сегмент кривой, которые можно использовать для определения положений контрольных точек. В первом сегменте используются такие контрольные точки: Р1,0 = Ро, 1/ Pi,i = ^(po + pi), 1 ч (8-95) Р1,2 = -(po + 2pi +Р2), Р1,з = |(ро + 3pi + Зр2 + Рз). о На втором сегменте выбраны следующие контрольные точки: Р2,0 = |(Р0 + 3pi + Зр2 + Рз), О P2,1 = J(P.+2P2 + P3), (896) 1/ Р2,2 = з(Р2 +Рз), Р2,3 = РЗ-
648 Глава 8. Представления трехмерных объектов С помощью операций сложения и смещения (деления на 2) можно установить эф- фективный порядок вычисления нового набора контрольных точек: Р1,0 = Ро, 1/ Р1,1 = 2(Ро + Р1), Т= |(pi +р2), Р1,2 = ^(РМ + Т)’ Р2,з = Рз, (8.97) 1/ Р2,2 = 2(Р2 +Рз), Р2,1 = 2^Т + Р2-2)’ 1 Р2,0 = 2 (Р1,2 + Р2,1), Р1,3 = Р2,0- Предыдущие шаги можно повторять сколько угодно. Если подразделение проводит- ся для получения набора точек на экране дисплея, процедуру подразделения можно остановить, когда сегменты кривой станут достаточно малыми. Чтобы определить, когда это произойдет, можно для каждого сегмента проверять расстояние от первой контрольной точки до последней. Если расстояние “достаточно” мало, подразделение можно прекратить. Другая проверка заключается в измерении расстояния между со- седними парами контрольных точек. Или же подразделение можно остановить, когда набор контрольных точек в каждом сегменте выстроится примерно по прямой линии. Методы подразделения можно применить к кривым Безье любой степени. Поли- ном Безье степени п — 1 имеет следующие 2тг контрольных точек на обеих исходных сегментах кривой: Pl,fc = 2fc k = 0,1,2, ... ,n, /=Оп (8-98) Р2Л = ZL C(ri ~k,n~ »p>, >=fc где C(k,j) и C(n — k,n — j) — биномиальные коэффициенты. Методы подразделения можно применять непосредственно к неравномерным би- сплайнам, добавляя значения в вектор узлов. Однако в общем случае данные методы не настолько эффективны, как подразделение Безье.
8.18. Функции OpenGL аппроксимации сплайнами 649 8.18. ФУНКЦИИ OpenGL АППРОКСИМАЦИИ СПЛАЙНАМИ С помощью функций OpenGL можно выводить на экран сплайны Безье и би-сплайны, а также настроечные кривые сплайновых поверхностей. Корневая библиотека содер- жит функции Безье, a OpenGL Utility (GLU) имеет функции построения би-сплайнов и настроечных функций. Функции Безье часто реализованы на аппаратном уровне, а функции GLU позволяют работать с би-сплайнами. ФУНКЦИИ OpenGL СПЛАЙНОВ БЕЗЬЕ Задание параметров и активизация процедур отображения кривых выполняется с помощью следующих функций OpenGL. glMapl* (GL_MAP1_VERTEX_3, uMin, uMax, stride, nPts, *ctrlPts); glEnable (GL_MAP1_VERTEX_3); Обратная процедура выполняется с помощью такой команды. glDisable (GL_MAP1_VERTEX_3); Код-суффикс f или d, присоединенный к glMapl, указывает на использование данных с плавающей запятой (floating point) или двойной точности (double). Мини- мальное и максимальное значения параметра кривой и задаются в uMin и uMax, хотя эти значения для кривых Безье обычно равны 0 и 1 соответственно. Значения (числа с плавающей запятой) контрольных точек Безье в трехмерных декартовых координатах перечисляются в массиве ctrlPts, а число элементов в этом массиве задается параметром nPts как положительное целое число. Параметру stride при- сваивается целочисленное смещение, указывающее число элементов данных между началом одной точки в массиве ctrlPts и началом следующего списка координат. Для трехмерного списка контрольных точек задается stride = 3. Параметр stride может иметь большее значение, если контрольные точки задаются с использовани- ем четырехмерных однородных координат, или вместе с координатами указываются другие данные, например, коды цвета. Чтобы выразить положения контрольных то- чек в четырехмерных однородных координатах (.т, у, z, h), достаточно изменить значение stride и поменять символьную константу в glMapl и glEnable на GL_MAP1_VERTEX_4. Задав параметры Безье и активизируя процедуры генерации кривых, нужно вы- числить точки на пути сплайна и отобразить полученную кривую. Точки вдоль тра- ектории кривой рассчитываются с помощью функции glEvalCoordl* (uValue);
650 Глава 8. Представления трехмерных объектов Здесь параметру uValue присваивается некоторое значение из интервала от uMin до иМах. Код-суффикс этой функции может иметь значение f или d, кроме того, можно использовать код-суффикс v, указывающий, что значение этого аргу- мента дается в виде массива. Функция glEvalCoordl рассчитывает координаты с использованием уравнения (8.37) со значением параметра ц= lvalue -Urnin, (899) ^max Hmjn которое отображает uValue в интервал от 0 до 1. Когда функция glEvalCoordl обрабатывает значение параметра кривой и, она генерирует функцию glVertex3. Таким образом, чтобы получить кривую Безье, нужно последовательно вызывать функцию glEvalCoordl, дающую набор точек на кривой для использованных выбранных значений из диапазона от uMin до иМах. Соединяя эти точки прямыми отрезками, можно аппроксимировать сплайновую кри- вую ломаной линией. В качестве примера процедур OpenGL работы с кривыми Безье приведем код, в котором четыре контрольные точки из программы в разделе 8.10 используются для получения двухмерной кубической кривой Безье. В этом примере на кривой изобра- жается 50 точек, соединенных прямыми отрезками. Траектория кривой отображается как синяя ломаная линия, а контрольные точки выводятся на экран как красные точки размера 5 (рис. 8.53). GLfloat ctrlPts [4][3] = { {-40.0, 40.0, 0.0), {-10.0, 200.0, 0.0), {10.0, -200.0, 0.0), {40.0, 40.0, 0.0} }; glMaplf (GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, *ctrlPts); glEnable (GL_MAP1_VERTEX_3); GLint k; glColor3f (0.0, 0.0, 1.0); // Цвет линии выбран синим. glBegin (GL_LINE_STRIP); // Генерируется "кривая" Безье. for (k = 0; k <= 50; k++) glEvalCoordlf (GLfloat (k) / 50.0); glEnd ( ); glColor (1.0, 0.0, 0.0); // Цвет точек выбран красным. glPointSize (5.0); // Точки имеют размер 5,0. glBegin (GL_POINTS); // Контрольные точки выводятся на экран, for (к =0; к < 4; к++); glVertex3fv (&ctrlPts [к][0]); glEnd ( );
8.18. Функции OpenGL аппроксимации сплайнами 651 Рис. 8.53. Набор из четырех контрольных точек и соответствующая кривая Безье, отображенная с помощью процедур OpenGL в виде аппроксимирующей ломаной линии Хотя в предыдущем примере сплайновая кривая генерировалась с равномерно расположенными значениями параметра, можно использовать функцию glEval- Coordlf и получить любую расстановку значений параметра и. Обычно, однако, сплайновая кривая генерируется с равномерным шагом по параметру, и OpenGL пред- лагает следующие функции, которые можно использовать для получения равномерно расположенных значений параметра. glMapGridl* (n, ul, u2); glEvalMeshl (mode, nl, n2); Код-суффикс glMapGridl может иметь значение f или d. Параметр п задает целое число равномерных делений в диапазоне от ul до и2, а параметры nl и п2 задают целочисленный диапазон, соответствующий промежутку от ul и и2. Пара- метру mode присваивается значение GL_POINT или GL_LINE, в зависимости от
652 Глава 8. Представления трехмерных объектов того, требуется изобразить кривую с использованием дискретных точек или прямых отрезков. Если кривая отображается как ломаная линия, выход данных двух функций такой же, как выход приведенного ниже кода, за исключением того, что аргументу glEvalCoordl присваивается значение ul или и2, если к = 0 или к = п со- ответственно, чтобы избежать ошибок округления. Другими словами, при mode = GL_LINE указанные выше команды OpenGL эквивалентны следующему коду. glBegin (GL_LINE_STRIP); for (k = nl; k <= n2; k++) glEvalCoordlf (ul + k * (u2 - ul) / n) ; glEnd ( ); Таким образом, в предыдущем примере можно заменить блок кода, содержащий цикл генерации кривой Безье, следующими операторами. glColor3f (0.0, 0.0, 1.0); glMapGridlf (50, 0.0, 1.0); glEvalMeshl (GL_LINE, 0, 50); Используя функции glMapGridl и glEvalMeshl, можно разделить кривую на несколько сегментов и выбрать шаг по параметру (расположение значений параметра) каждого сегмента согласно его кривизне. Следовательно, сегмент с большим числом осцилляций может разбиваться на большее число интервалов, а для более пологого участка такие меры излишни. Вместо того чтобы отображать кривые Безье, можно использовать функцию glMapl и задать значения других типов данных с помощью семи символьных констант OpenGL. Символьная константа GL_MAP1_COLOR_4 в массиве ctrlPts позволяет задавать список из четырех элементов (красный, зеленый, синий, альфа- фактор). Затем можно сгенерировать линейно интерполированный набор цветов, ис- пользуемый в различных приложениях, причем данные сгенерированные коды цвета не меняют текущие цветовые настройки. Аналогично с помощью GL_MAP1_INDEX можно задать список значений из таблицы индексов цвета. При использовании сим- вольной константы GL_MAP1_NORMAL в массиве ctrlPts задается список трех- мерных векторов нормали к поверхностям. Остальные четыре символьные константы применяются при наличии информации о текстуре поверхности. Несколько функций glMapl можно активизировать одновременно, тогда для каждого разрешенного типа данных вызовы glEvalCoordl или glMapGridl и glEvalMeshl дают точки данных. Это позволяет генерировать комбинации коорди- натных точек, кодов цвета, векторов нормали к поверхности и данных, касающихся текстуры поверхности. Однако одновременно активизировать GL_MAP1_VERTEX_3 и GL_MAP1_VERTEX_4 нельзя, и в любой момент времени может быть активным только один генератор поверхностной текстуры.
8.18. Функции OpenGL аппроксимации сплайнами 653 ФУНКЦИИ OpenGL ПОВЕРХНОСТНЫХ СПЛАЙНОВ БЕЗЬЕ Активизация и спецификация параметров процедур OpenGL работы с поверхностями Безье выполняется с помощью таких команд. glMap2* (GL_MAP2_VERTEX_3, uMin, uMax, uStride, nuPts, vMin, vMax, vStride, nvPts, *ctrlPts); glEnable (GL_MAP2_VERTEX_3); К функции glMap2 присоединяется код-суффикс f или d, указывающий, какие данные используются — с плавающей запятой или двойной точности. Для поверхно- сти задаются минимальные и максимальные значения обоих параметров: unv. Трех- мерные декартовы координаты контрольных точек Безье перечислены в двухмерном массиве ctrlPts, а целочисленный размер массива задается параметрами nuPts и nvPts. Если контрольные точки должны задаваться четырехмерными однородны- ми координатами, вместо GL_MAP2_VERTEX_3 используется символьная константа GL_MAP2_VERTEX_4. Целочисленное смещение между началом записи с координа- тами контрольной точки Pjtk и координатами точки p_/+i fc указывается в uStride. Целочисленное смещение между началом записи с координатами контрольной точки Pjk и координатами точки р7-fc+i указывается в vStride. Это позволяет смешивать координатную информацию с другими данными. Процедуры формирования поверх- ности Безье отключаются командой glDisable GL_MAP2_VERTEX_3 Координаты точек на поверхности Безье можно вычислить следующим образом: glEvalCoord2* (uValue, vValue); или так: glEvalCoord2*v (uvArray); Параметру uValue присваивается некоторое значение из интервала от uMin до uMax, а параметру vValue присваивается значение из интервала от vMin до vMax. В векторной версии команды uvArray = (uValue, vValue). Код-суффикс указанных функций может быть равен f или d. Функция glEvalCoord2 вычисляет координаты точки с использованием уравнения (8.51) при следующих значениях параметров: uValue — uMin uValue — uMin u = -г-------v = —ст--------------——> (8.100) uMax — uMin uMax — uMin что отображает uValue и vValue в интервал от 0 до 1. Чтобы отобразить на экране поверхность Безье, многократно вызывается проце- дура glEvalCoord2, которая генерирует ряд функций glVertex3. Этот процесс
654 Глава 8. Представления трехмерных объектов подобен генерации сплайновой кривой, за исключением того, что функция имеет два параметра и и v. Например, используя приведенный ниже код, поверхность, опреде- ленную 16 контрольными точками, упорядоченными в сетку 4 на 4, можно отобразить как набор линий поверхности. Сдвиг между координатами точек в направлении и ра- вен 3, а сдвиг между координатами точек в направлении v — 12. Координаты всех точек задаются тремя значениями, причем координата у в каждой группе из четырех точек постоянна. GLfloat ctrlPts [4][4][3] = { { {-1.5, -1.5, 4.0}, {-0.5, -1.5, 2.0}, {-0.5, -1.5, -1.0}, { 1.5, -1.5, 2.0} }, { {-1.5, -0.5, 1.0}, {-0.5, -0.5, 3.0}, { 0.5, -0.5, 0.0}, { 1.5, -0.5, -1.0} }, { {-1.5, 0.5, 4.0}, {-0.5, 0.5, 0.0}, { 0.5, 0.5, 3.0}, { 1.5, 0.5, 4.0} }, { {-1.5, 1.5, -2.0}, {-0.5, 1.5, -2.0}, { 0.5, 1.5, 0.0}, { 1.5, 1.5, -1.0} } }; glMap2f (GL_MAP2_VERTEX_3, 0.0, 1.0, 3, 4, 0.0, 1.0, 12, 4, &ctrlPts[0][0][0]); glEnable (GL_MAP2_VERTEX_3); GLint k, j; glColor3f (0.0, 0.0, 1.0); for (k = 0; k <= 8; k++) { glBegin (GL_LINE_STRIP) ; /* Генерируются поверхностные линии Безье. */ for (j = 0; j <= 40; j++) glEvalCoord2f (GLfloat (j) / 40.0, GLfloat (k) / 8.0); glEnd ( ); glBegin (GL_LINE_STRIP); for (j = 0; j <= 40; j++) glEvalCoord2f (GLfloat (k) / 8.0, GLfloat (j) / 40.0); glEnd ( ); Равномерно размещенные значения параметров можно получить, не используя функцию glEvalCoord2, а применив команды glMapGrid2* (nu, ul, u2, nv, vl, v2) ; glEvalMesh2 (mode, nul, nu2, nvl, nv2); Суффикс-код glMapGrid2 снова равен f или d, а параметру mode может при- сваиваться значение GL_POINT, GL_LINE или GL_FILL. При вызове команды ге- нерируется двухмерная сетка точек с пи равномерно расположенными интервалами между ul и u2 и nv равномерно расположенными интервалами между vl и v2. Со-
8.18. Функции OpenGL аппроксимации сплайнами 655 ответствующий целочисленный диапазон параметра и — от nul до пи2, параметра v — от nvl до nv2. Для поверхности, которая отображается на экран как сетка ломаных линий, вы- ход glMapGrid2 и glEvalMesh2 аналогичен тому, что дает следующий фрагмент программы, кроме условий, которые предотвращают ошибки округления в началь- ных и конечных значениях переменных цикла. В начале цикла аргумент функции glEvalCoordl полагается равным (ul, vl). В конце цикла аргумент функции gl- EvalCoordl устанавливается равным (u2, v2). for (k = nul; k <= nu2; k++) { glBegin (GL_LINES); for (j « nvl; j <« nv2; j++) glEvalCoord2f (ul + k * (u2 - ul) / nu, vl + j * (v2 - vl) / nv); glEnd ( ); ) for (j = nvl; j <= nv2; j++) { glBegin (GL_LINES); for (k = nul; k <= nu2; k++) glEvalCoord2f (ul + k * (u2 - ul) / nu, vl + j * (v2 - vl) / nv); glEnd ( ); ) Таким образом, для поверхности, отображенной как набор закрашенных многоуголь- ных граней (mode = GL_FILL), выход процедур glMapGrid2 и glEvalMesh2 почти такой же, как и у следующего фрагмента программы, и отличается только условием отсутствия ошибки округления у начальных и конечных значений перемен- ных цикла. for (k = nul; к < nu2; к++) { glBegin (GL_QUAD_STRIP); for (j = nvl; j <= nv2; j ++) { glEvalCoord2f (ul + к * (u2 - ul) / nu, vl + j * (v2 - vl) / nv); glEvalCoord2f (ul + (k + 1) * (u2 - ul) / nu, vl + j * (v2 - vl) / nv); ) )
656 Глава 8. Представления трехмерных объектов Функцию д1Мар2 можно использовать для определения других типов данных, как это описывалось выше для функции glMapl. С этой целью используются та- кие символьные константы, как GL_MAP2_COLOR_4 и GL_MAP2_NORMAL. Кроме того, можно активизировать несколько функций д1Мар2 для генерации различных комбинаций данных. ФУНКЦИИ БИ-СПЛАЙНОВЫХ КРИВЫХ GLU Хотя би-сплайновые процедуры GLU называются функциями “NURBS” (неравномер- ные рациональные би-сплайны), их можно использовать для генерации би-сплайнов, не являющихся ни неравномерными, ни рациональными. Следовательно, эти про- цедуры GLU можно использовать для отображения полиномиальных би-сплайнов, имеющих равномерное расположение узлов. Кроме того, процедуры GLU можно использовать для получения сплайнов Безье (рациональных или нерациональных). Чтобы получить би-сплайн (или сплайн Безье), нужно определить имя сплайна, ак- тивизировать процедуру визуализации GLU, а затем определить параметры сплайна. Приведенный ниже код иллюстрирует стандартную последовательность вызовов функций при отображении би-сплайна. GLUnurbsObj *curveName; curveName = gluNewNurbsRenderer ( ); gluBeginCurve (curveName); gluNurbsCurve (curveName, nknots, *knotVector, stride, *ctrlPts, degParam, GL_MAP1_VERTEX_3); gluEndCurve (curveName); В первой строке кривой присваивается имя, затем для этой кривой вызываются про- цедуры визуализации би-сплайнов GLU с использованием команды gluNewNurb- sRenderer. Значение 0 присваивается параметру curveName, когда доступ- ной памяти не хватает для создания би-сплайна. Внутри пары gluBegin- Curve/gluEndCurve задаются параметры кривой с помощью функции gluNurb- sCurve. Это позволяет определять множественные участки кривой, и каждому участ- ку присваивается свое имя. Параметр knotvector (число в формате с плавающей запятой) определяет набор значений узлов, а целочисленный параметр nknots за- дает число элементов вектора узлов. Степень полинома равна degParam — 1. Значе- ния трехмерных координат контрольных точек перечисляются в параметре массива ctrlPts, который содержит nknots — degParam элементов. Наконец, целочислен- ный сдвиг между началами координат соседних точек в массиве ctrlPts задается целочисленным параметром stride. Если положения контрольных точек записа-
8.18. Функции OpenGL аппроксимации сплайнами 657 ны непрерывно (а не вставлены между данными других типов), значение stride устанавливается равным 3. Определенный би-сплайн уничтожается командой gluDeleteNurbsRenderer (curveName); В качестве примера использования процедур GLU для вывода на экран сплай- новой кривой приводится код, генерирующий кубический полином Безье. Чтобы по- лучить данную кубическую кривую, параметру степени присваивается значение 4. Используется четыре контрольные точки и выбирается восьмиэлементная открытая равномерная последовательность с четырьмя повторяющимися значениями на каж- дом конце. GLfloat knotVector [8] = (0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0}; GLfloat ctrlPts [4][3] = { (-4.0, 0.0, 0.0}, {-2.0, 8.0, 0.0}, {2.0, -8.0, 0.0}, {4.0, 0.0, 0.0} }; GLUnurbsObj *cubicBezCurve; cubicBezCurve = gluNewNurbsRenderer ( ); gluBeginCurve (cubicBezCurve); gluNurbsCurve (cubicBezCurve, 8, knotVector, 3, &CtrlPtS [0][0], 4, GL_MAP1_VERTEX_3); gluEndCurve(cubicBezCurve); Чтобы создать рациональный би-сплайн, символьная константа GL_MAP1_ VERTEX_3 заменяется константой GL_MAP1_VERTEX_4. Затем четырехмерные од- нородные координаты (х^, yh,^h, h) используются для задания контрольных точек, и получающееся в результате однородное деление дает искомую рациональную поли- номиальную форму. Кроме того, можно использовать функцию gluNurbsCurve и задать список кодов цвета, векторов нормали или свойств текстурных поверхностей, как это де- монстрировалось для функций glMapl и д1Мар2. В качестве последнего аргумента функции gluNurbsCurve можно использовать любую символьную константу, та- кую как GL_MAP1_COLOR_4 или GL_MAP1_NORMAL. Каждая функция вызывается внутри пары gluBeginCurve/gluEndCurve с двумя ограничениями: нельзя пе- речислять более одной функции для каждого типа данных, и необходимо включить ровно одну функцию генерации би-сплайна. При использовании процедур GLU би-сплайн автоматически делится на несколь- ко участков и отображается как ломаная линия. Однако можно задать множество опций визуализации би-сплайна, многократно вызывая следующую функцию GLU. gluNurbsProperty (splineName, property, value);
658 Глава 8. Представления трехмерных объектов Параметру splineName присваивается имя би-сплайна, параметру property присваивается символьная константа GLU, определяется свойство визуализации, ко- торое требуется задать, а параметру value присваивается либо численное значе- ние с плавающей запятой, либо символьная константа GLU, которая задает значе- ние выбранного свойства. После оператора gluNewNurbsRenderer можно задать несколько функций gluNurbsProperty. Множество свойств, которые можно за- дать с помощью функции gluNurbsProperty, включает параметры поверхности, как обсуждается в следующем разделе. ФУНКЦИИ GLU БИ-СПЛАЙНОВЫХ ПОВЕРХНОСТЕЙ Следующий фрагмент кода иллюстрирует стандартную последовательность вызовов функций для генерации би-сплайновой поверхности. GLUnurbsObj *surfName surfName = gluNewNurbsRenderer ( ); gluNurbsProperty (surfName, propertyl, valuel); gluNurbsProperty (surfName, property2, value2); gluNurbsProperty (surfName, property3, value3); gluBeginSurface (surfName); gluNurbsSurface (surfName, nuKnots, uKnotVector, nvKnots, vKnotVector, uStride, vStride, &ctrlPts [0][0][0], uDegParam, vDegParam, GL_MAP2_VERTEX_3) ; gluEndSurface (surfName); Вообще, операторы и параметры GLU, используемые для определения би-сплайновой поверхности, подобны операторам и параметрам би-сплайновой кривой. После вы- зова процедур визуализации би-сплайна с помощью команды gluNewNurbsRen- derer можно задать несколько дополнительных свойств поверхности. В таком случае параметры поверхности задаются с помощью вызова функции gluNurb- sSurface. Аналогично можно определить множественные поверхности с разны- ми именами-идентификаторами. Если доступной памяти не хватает для хранения би-сплайнового объекта, система возвращает в переменную surfName значение 0. Параметры uKnotVector и vKnotVector (величины с плавающей запятой) опре- деляют массивы значений узлов в параметрических направлениях и и v. Число эле- ментов в каждом векторе узлов задается параметрами nuKnots и nvKnots. Степень полинома по параметру и указывается как значение uDegParam — 1, а степень поли- нома по параметру v — как значение vDegParam — 1. Значения с плавающей запя- той трехмерных координат контрольных точек перечисляются в массиве ctrlPts,
8.18. Функции OpenGL аппроксимации сплайнами 659 который содержит (nuKnots — uDegParam) х (nvKnots — vDegParam) элементов. Целочисленный сдвиг между началами записей соседних контрольных точек в пара- метрическом направлении и задается целочисленным параметром uStride, а сдвиг в параметрическом направлении v задается целочисленным параметром vStride. Удаление сплайновой поверхности из памяти выполняется с помощью той же самой функции gluDeleteNurbsRenderer, что использовалась для би-сплайна. По умолчанию би-сплайновая поверхность автоматически отображается проце- дурами GLU как набор закрашенных многоугольников, но можно выбрать другие ва- рианты и параметры вывода на экран. Для би-сплайновой поверхности можно задать девять свойств, причем значение каждого свойства можно выбирать из нескольких возможных. В качестве примера присвоения свойств приведем код, в котором задается каркасное мозаичное (с помощью треугольных участков) изображение поверхности. gluNurbsProperty (surfName, GLU_NURBS_MODE, GLU_NURBS_TESSELLATOR); gluNurbsProperty (surfName, GLU_DISPLAY_MODE, GLU_OUTLINE_POLYGON) ; Процедура мозаичного представления GLU делит поверхность на набор треугольни- ков и отображает каждый треугольник в виде контура. Кроме того, данные треуголь- ные примитивы можно извлечь, используя функцию gluNurbsCallback. Други- ми значениями свойства GLU_DISPLAY_MODE являются GLU_OUTLINE_PATCH и GLU_FILL (значение по умолчанию). Используя значение GLU_OUTLINE_PATCH, также можно получить каркасное изображение, но при этом поверхность не делится на треугольные участки. Вместо этого подчеркиваются контуры исходной поверхно- сти, а также все заданные настроечные кривые. Единственное другое значение, ко- торое может присваиваться свойству GLU_NURBS_MODE — GLU_NURBS_RENDERER (значение по умолчанию), при установке которого объекты визуализируются так, что обратная связь с мозаичными данными недоступна. Число точек выборки на единицу длины задается свойствами GLU_U_STEP и GLU_V_STEP. По умолчанию значения обоих — 100. Чтобы задать частоту дискрети- зации и или V, также необходимо присвоить свойству GLU_SAMPLING_METHOD зна- чение GLU_DOMAIN_DI STANCE. Задавая свойство GLU_SAMPLING_METHOD, мож- но использовать несколько других значений, определяющих, как должно выполнять- ся мозаичное представление поверхности. Свойства GLU_SAMPLING_TOLERANCE и GLU_PARAMETRIC_TOLERANCE используются для установки максимального ша- га дискретизации. Задавая свойство GLU_CULLING со значением GL_TRUE, можно улучшить производительность визуализации, не выполняя мозаичное представление объектов, расположенных за объемом наблюдения. Значение по умолчанию функ- ции выборки GLU — GL_FALSE. Наконец, свойство GLU_AUTO_LOAD_MATRIX поз- воляет загружать с сервера OpenGL матрицы для преобразований проектирования, изменения точки наблюдения и окна просмотра, значение по умолчанию которого —
660 Глава 8. Представления трехмерных объектов GL_TRUE. В противном случае, если задать значение GL_FALSE, приложение должно само поддерживать указанные матрицы с использованием функции gluLoadSam- plingMatrices. Чтобы определить текущее значение свойства би-сплайна, используется следую- щая функция запроса. gluGetNurbsProperty (splineName, property, value); Для заданных splineName и property соответствующее значение возвраща- ется в параметр value. Если свойству GLU_AUTO_LOAD_MATRIX присвоено значение GL_FALSE, необ- ходимо вызвать функцию gluLoadSamplingMatrices (splineName, modelviewMat, projMat, viewport); Данная функция задает матрицу модельной проекции, проекционную матрицу и окно просмотра, которые будут использоваться процедурами дискретизации и отбора при обработке сплайнового объекта. Текущие матрицу вида модели и проекционную мат- рицу можно получить, вызвав функцию glGetFloatv, а текущее окно просмотра получается посредством вызова функции glGetlntegerv. Различные события, соотнесенные со сплайновыми объектами, обрабатываются с помощью функции gluNurbsCallback (splineName, event, fen); Параметру event присваивается символьная константа GLU, а параметр fen за- дает функцию, которая будет вызываться при наступлении события, соответству- ющего константе GLU. Например, если присвоить параметру event значение GLU_NURBS_ERROR, в случае ошибки будет вызываться функция fen. Другие со- бытия используются сплайновыми процедурами GLU для выдачи многоугольников OpenGL, сгенерированных в виде мозаичного представления. Символьная константа GL_NURBS_BEGIN указывает начало такого примитива, как отрезок, треугольник или четырехугольник, a GL_NURBS_END указывает конец примитива. Аргументом функ- ции, обозначающим начало примитива, является такая символьная константа, как GL_LINE_STRIP, GL_TRIANGLES или GL_QUAD_STRIP. Символьная константа GL_NURBS_VERTEX указывает, что поддерживается трехмерная информация о ко- ординатах и вызывается функция вершин. Существуют дополнительные константы, обозначающие другие данные, такие как коды цвета. Информационные значения функции gluNurbsCallback задаются следующим образом: gluNurbsCallbackData (splineName, dataValues); Параметру splineName присваивается имя сплайнового объекта, который представ- ляется в виде мозаики, а параметру dataValues присваивается список элементов данных.
8.18. Функции OpenGL аппроксимации сплайнами 661 ФУНКЦИИ GLU ОБРЕЗКИ ПОВЕРХНОСТИ Набор из одной или нескольких двухмерных обрезающих функций задается для би- сплайновой поверхности с помощью следующих операторов. gluBeginTrim (surfName); gluPwlCurve (surfName, nPts, *curvePts, stride, GLU_MAP1_TRIM_2); gluEndTrim (surfName); Параметр surfName — это имя би-сплайновой поверхности, которая будет обре- заться. Набор координат (значения с плавающей запятой) для обрезающей кривой задается в параметре массива curvePts, который содержит nPts координатных позиций. Целочисленный сдвиг между последовательными координатными позици- ями задается в параметре stride. Заданные координаты кривой используются для генерации кусочно-линейной обрезающей функции для би-сплайновой поверхности. Другими словами, сгенерированная обрезающая “кривая” — это ломаная линия. Ес- ли точки кривой задаются в трехмерном параметрическом пространстве (и, v, h), конечный аргумент в gluPwlCurve задается равным символьной константе GLU GLU_MAP1_TRIM_3. Кроме того, в качестве обрезающей кривой можно использовать одну или несколько функций gluNurbsCurve или построить обрезающие кривые, являю- щиеся комбинациями функций gluPwlCurve и gluNurbsCurve. Любая заданная обрезающая “кривая” GLU должна быть несамопересекающейся и замкнутой. В приведенном ниже коде иллюстрируются обрезающие функции GLU для куби- ческой поверхности Безье. Вначале задаются координаты самой внешней обрезаю- щей кривой. Эти точки задаются в направлении против часовой стрелки полностью вокруг единичного квадрата. Затем в два этапа задаются координаты самой внутрен- ней обрезающей кривой, и эти точки указываются по часовой стрелке. Кроме того, задаются векторы узлов для поверхности и первого внутреннего вырезаемого участ- ка кривой для получения кубических кривых Безье. Внутренняя и внешняя кривые обрезки показаны на рис. 8.54. GLUnurbsObj *bezSurface; GLfloat outerTrimPts [5][2] = { {0.0, 0.0}, {1.0, 0.0}, {1.0, 1.0}, {0.0, 1.0}, {0.0, 0.0} };
662 Глава 8. Представления трехмерных объектов 1,о т- 0,8 -- 0,2 -- Рис. 8.54. Внешняя кривая обрезки по пери- метру единичного квадрата задается в направ- лении против часовой стрелки, а внутренние участки кривой обрезки определяются в на- ----------1---1----1---1----1---1----1---1----1 правлении по часовой стрелке 0,0 0,2 0,4 0,6 0,8 GLfloat innerTrimPtsl [3][2] = { {0.25, 0.5), {0.5, 0.75), {0.75, 0.5} }; GLfloat innerTrimPts2 [4][2] = { {0.75, 0.5), {0.75, 0.25), {0.25, 0.25), {0.25, 0.5} }; GLfloat surfKnots [8] = (0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0); GLfloat trimCurveKnots [8] = (0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0); bezSurface = gluNewNurbsRenderer ( ); gluBeginSurface (bezSurface); gluNurbsSurface (bezSurface, 8, surfKnots, 8, surfKnots, 4*3, 3, &ctrlPts [0][0][0], 4, 4, GL_MAP2_VERTEX_3) ; gluBeginTrim (bezSurface); /* Внешняя обрезающая кривая (против часовой стрелки). */ gluPwlCurve (bezSurface, 5, bouterTrimPts [0][0], 2, GLU_MAP1_TRIM_2); gluEndTrim (bezSurface); gluBeginTrim (bezSurface); /* Участки внутренней обрезающей кривой * (по часовой стрелке). */ gluPwlCurve (bezSurface, 3, SinnerTrimPtsl [0][0], 2, GLU_MAP1_TRIM_2); gluNurbsCurve (bezSurface, 8, trimCurveKnots, 2, &innerTrimPts2 [0.eps][0.eps], 4, GLU_MAP1_TRIM_2): gluEndTrim (bezSurface); gluEndSurface (bezSurface);
8.19. Заметающее представление 663 ЗАМЕТАЮЩЕЕ ПРЕДСТАВЛЕНИЕ Пакеты объемного моделирования часто предлагают несколько методов построения. Заметающие представления полезны при создании трехмерных объектов с трансля- ционной, вращательной или другой симметрией. Такие объекты можно представить, задав двухмерный путь заметания, по которому данная форма проходит по обла- сти пространства. Набор таких двухмерных примитивов, как окружности и прямо- угольники, может предлагаться для заметающего представления как пункты меню. Существуют и другие методы получения двухмерных фигур, например, построение замкнутых сплайновых кривых и поперечных сечений объемных объектов. На рис. 8.55 иллюстрируется трансляционное заметание. Периодическая сплай- новая кривая на рис. 8.55, а определяет поперечное сечение объекта. Затем выпол- няется трансляционное заметание на заданное расстояние, для чего контрольные точки от ро до рз перемещаются по прямолинейной траектории, перпендикулярной плоскости поперечного сечения. Через определенные интервалы по этой траектории воспроизводится форма поперечного сечения и изображается набор связанных линий в направлении заметания, в результате чего получается каркасное представление, показанное на рис. 8.55, б. Ось вращения Рис. 8.55. Построение твердого тела с помощью трансляционного заметания. Трансляция контрольных точек перио- дической сплайновой кривой на пане- ли а дает твердое тело, изображенное на панели б, поверхность которого можно описать точечной функцией Р(и, г>) Рис. 8.56. Построение объемного тела с помощью вращательного заметания. Вра- щение контрольных точек периодической сплайновой кривой, изображенной на панели а, относительно данной оси вращения дает объемное тело, представленное на панели б, поверхность которого можно описать точечной функцией P(u, v)
664 Глава 8. Представления трехмерных объектов Рис. 8.57. Объединение двух объектов, показанных на панели а, дает новый составной объект, показанный на панели б а) 6) Пример формирования объекта с использованием вращательного заметания при- веден на рис. 8.56. На этот раз периодическое сплайновое поперечное сечение враща- ется вокруг заданной оси в плоскости поперечного сечения, в результате чего получа- ется каркасное представление, показанное на рис. 8.56, б. Для вращательного замета- ния можно выбрать любую ось. Если использовать ось вращения, перпендикулярную плоскости сплайнового поперечного сечения, показанного на рис. 8.56, а, получится двухмерная форма. Однако, если поперечное сечение, представленное на рисунке, имеет глубину, тогда один трехмерный объект используется для генерации другого. Вообще, построение с помощью заметания пространства можно определить с использованием любой траектории. Для вращательного заметания можно пройти по круговой траектории на любое угловое расстояние от 0 до 360°. Для некруговых траекторий можно задать функцию кривой, описывающую траекторию и путь, про- ходимый по ней. Кроме того, можно варьировать форму или размер поперечного сечения по траектории заметания, также можно изменять ориентацию поперечного сечения на пути заметания (при перемещении формы по области пространства). 8.20. МЕТОДЫ КОНСТРУКТИВНОЙ СТЕРЕОМЕТРИИ Другим методом объемного моделирования является построение нового объекта по двум трехмерным объектам с использованием операций над множествами. Данный метод моделирования, называемый конструктивной стереометрией (Constructive Solid Geometry — CSG), дает новый объект с помощью операции объединения, пере- сечения или вычитания, примененной к двум заданным телам. На рис. 8.57 и 8.58 показаны примеры создания новых форм с использовани- ем операций над множествами. На рис. 8.57, а блок и пирамида размещены рядом. Используя операцию логического сложения, можно получить комбинированный объ- ект, изображенный на рис. 8.57, б. На рис. 8.58, а показаны частично совмещенные блок и цилиндр. Применив операцию пересечения, получаем тело, изображенное на рис. 8.58, б. Используя операцию вычитания, можно получить тело, изображенное на рис. 8.58, в.
8.20. Методы конструктивной стереометрии 665 Рис. 8.58. Два накладывающихся объекта (панель а) можно объеди- нить либо в клиновидный объект (панель б) с использованием опера- ции пересечения, либо в модифици- рованную блочную форму (панель в) с помощью операции вычитания Рис. 8.59. Пример древовидного представле- ния построения объекта с помощью конструк- тивной стереометрии При использовании конструктивной стереометрии вначале дается исходный на- бор трехмерных объектов, называемых CSG-примитивами (параллелепипед, пирами- да, конус, сфера и, возможно, некоторые тела со сплайновыми поверхностями). При- митивы могут предлагаться пакетом CSG как выбор из меню, или же сами примити- вы могут формироваться с использованием методов заметания, построения сплайнов или других процедур моделирования. В интерактивном пакете CSG можно выбирать операцию (логического сложения, пересечения или вычитания) и перетягивать два примитива в положения в некоторой области пространства с целью формирования нового объекта. Этот новый объект можно затем объединить с одной из существую- щих форм для получения другого объекта. Описанный процесс может продолжаться, пока не будет получена искомая конечная форма объекта. Объект, построенный с помощью этой процедуры, представляется бинарным деревом, подобным изображен- ному на рис. 8.59.
666 Глава 8. Представления трехмерных объектов Рис. 8.60. Реализация операций конструктивной стереометрии с использованием схемы расчета луча Плоскость Плоскость зажигания Луч пикселя Операция Границы поверхности Объединение Пересечение Разность (obj2 —obj,) A, D С, В В, D Рис. 8.61. Определение границ поверхности вдоль луча пикселя Методы расчета луча широко используются для реализации операций конструк- тивной стереометрии, когда объекты описываются контурными представлениями. Чтобы применить расчет луча, определяются объекты, которые пересекаются набо- ром параллельных прямых, проходящих через плоскость ху по направлению оси z. Данная плоскость называется плоскостью зажигания, а каждый луч начинается в по- ложении пикселя, как показано на рис. 8.60. Затем точки пересечения каждого луча с поверхностями вычисляются и сортируются согласно расстоянию от плоскости зажи- гания. Далее с помощью заданных операций над множествами определяются границы поверхности сложного объекта. Пример определения границ поверхностей с помо- щью расчета луча для CSG-объекта приведен на рис. 8.61, где показаны поперечные сечения в плоскости yz двух объектов (блока и сферы) и траектория луча пикселя, перпендикулярного плоскости зажигания. После операции логического сложения но- вый объем является суммарной внутренней частью, занятой двумя объектами. После операции пересечения новый объем — это внутренняя область, общая для обоих объ- ектов. Наконец, операция вычитания отнимает одну внутреннюю часть объекта от другой в области пересечения двух объектов. Каждый CSG-примитив обычно определяется в локальных (модельных) коорди- натах. Соответствующие точки во внешней системе координат определяются с по- мощью матрицы модельного преобразования, используемой для наложения данного объекта на другой. Матрицы, обратные к модельным матрицам объектов, можно ис- пользовать для преобразования лучей пикселей в модельные координаты, где расчет точек пересечения с поверхностью выполняется для отдельных примитивов. Затем
8.20. Методы конструктивной стереометрии 667 Плоскость зажигания Рис. 8.62. Определение объема объекта вдоль луча пикселя для области пикселя Aij на плоскости зажигания точки пересечения с поверхностями двух совмещенных объектов сортируются со- гласно расстоянию от начала луча пикселя и используются для определения границ составного объекта согласно заданной операции над множествами. Данная процеду- ра повторяется для каждой пары объектов, которые нужно объединить в CSG-дерево искомого объекта. После того как CSG-объект спроектирован, для определения таких физических свойств, как объем и масса, используется схема расчета луча. Чтобы определить объ- ем объекта, плошадь каждого пикселя на плоскости зажигания аппроксимируется небольшим квадратом (рис. 8.62). Затем можно следующим образом аппроксимиро- вать объем Vij объекта для поперечного сечения с площадью по траектории луча от пикселя в положении (г, J): (8.101) где Azy — глубина объекта относительно луча, исходящего из положения (г, j). Если объект имеет внутренние отверстия, через Az^- обозначается сумма частей, лежащих между точками пересечения по лучу. Суммарный объем CSG-объекта аппроксимиру- ется как сумма отдельных объемов на траектории луча: (8.102) Для данной функции плотности объекта р(х, у, z) массу по лучу от точки (г, j) можно аппроксимировать интегралом TXlij ~ A{j I p{jXij -,yij, z'jdz, (8.103) где одномерный интеграл в зависимости от формы функции плотности часто можно оценить приближенно, не вычисляя. Затем общая масса CSG-объекта аппроксимиру- ется следующей суммой: (8.104)
668 Глава 8. Представления трехмерных объектов Рис. 8.63. Квадратная область на плоскости ху, разделенная на нуме- рованные квадранты, и соответству- ющий узел квадродерева с четырьмя элементами данных Квадрант 0 Квадрант I Квадрант 3 Квадрант 2 Область двухмерного пространства 0 1 2 3 Элементы данных в соответствующем узле квадродерева Подобные выражения можно получить для других физических свойств (центр масс и момент инерции). Приближенный расчет физических свойств можно улучшить, введя дополнительные лучи для подпикселей плоскости зажигания. Если формы объектов представлены октодеревьями, операции над множествами в процедурах CSG можно реализовать, сканируя древовидную структуру, описыва- ющую содержимое пространственных октантов. В данной процедуре, описанной в следующем разделе, в октантах и подоктантах единичного куба выполняется поиск областей, занятых двумя совмещаемыми объектами. 8.21. ОКТОДЕРЕВЬЯ В некоторых графических системах для представления объемных объектов исполь- зуются иерархические древовидные структуры, называемые октодеревьями (octrees). Представления в форме октодеревьев широко используются в сфере построения ме- дицинских изображений и других приложениях, требующих отображения попереч- ных сечений объектов. Древовидная структура организована так, что каждый узел соответствует области трехмерного пространства. Это представление объемных тел использует пространственную когерентность, чтобы снизить требования к памяти для хранения трехмерных объектов. Кроме того это представление удобно для хранения информации о внутренних областях объектов. Представление трехмерного объекта в форме октодерева является расширением подобной двухмерной схемы представления, называемыми кодированием в форме квадродерева (quadtree). Квадродеревья генерируются последовательным делением двухмерной области (обычно квадрата) на квадранты. Каждый узел квадродерева име- ет четыре элемента данных — по одному на каждый квадрант области (рис. 8.63). Если все точки квадранта имеют одинаковый цвет (однородный квадрант), этот цвет ука-
8.21. Октодеревья 669 0 1 3 — : Область двухмерного пространства Представление в виде квадродерева Рис. 8.64. Квадратная область плоскости ху с двумя уровнями де- ления на квадранты и соответству- ющее представление в форме квад- родерева Рис. 8.65. Представление в фор- ме октодерева квадратной области плоскости ху, содержащей одну цветную область на фоне другого цвета зывается в соответствующем элементе данных узла. Кроме того, в элементе данных устанавливается метка, определяющая, что квадрант однородный. Если, например, все точки в квадранте 2 на рис. 8.63 красного цвета, код красного цвета помеща- ется в элемент данных 2 этого узла. В противном случае квадрант неоднородный, и он делится на подквадранты, как показано на рис. 8.64. Элемент данных в узле, соответствующем квадранту 2, теперь помечает квадрант как неоднородный и хранит указатель на следующий узел квадродерева. В алгоритме генерации квадродерева проверяются коды цвета, присвоенные объ- ектам выбранной двухмерной области, и соответствующим образом устанавливаются узлы квадродерева. Если все квадранты исходного пространства имеют один цвет, квадродерево содержит только один узел. Для неоднородной области плоскости по- следовательное деление квадрантов продолжается до тех пор, пока однородными не станут все участки разделенной области. На рис. 8.65 показано представление в фор- ме квадродерева области, содержащей один участок сплошного цвета, отличающегося от равномерного цвета, заданного для других участков области. Кодирование в форме октодерева позволяет существенно сэкономить требуемую память, если в области пространства имеются большие одноцветные области, по- скольку один узел может представлять большую часть пространства. Кроме того, данную схему представления можно использовать для хранения кодов цвета пиксе- лей. Для области, содержащей 2п на 2п пикселей, представление в форме квадроде-
670 Глава 8. Представления трехмерных объектов Рис. 8.66. Куб, разделенный на нумерованные октанты, и соот- ветствующий узел октодерева с восемью элементами данных 0 1 2 3 4 5 6 7 Элементы данных в соответствующем узле октодерева рева содержит не более п уровней. Кроме того, каждый узел квадродерева имеет не больше четырех непосредственных потомков. Схема кодирования в форме октодерева делит область трехмерного пространства (обычно куб) на октанты и записывает восемь элементов данных в каждом узле дере- ва, как показано на рис. 8.66. Отдельные подобласти после конечного этапа разбиения трехмерного пространства называются элементами объема или векселями (voxels) по аналогии с пикселями прямоугольной области на экране дисплея. Вексель в пред- ставлении в форме октодерева хранит значения свойств для однородной подобласти пространства. Свойства объектов в трехмерной области пространства могут включать цвет, тип материала, плотность и другие физические характеристики. Например, в вы- бранной области пространства могут быть такие объекты, как скалы и деревья или ткани, кости и органы тела. Пустые области пространства представлены типом вексе- лей “void” (“пусто”). Как и для представления в форме квадродерева, неоднородный октант в области делится до тех пор, пока фрагменты не станут однородными. Для октодерева каждый узел может иметь от нуля до восьми непосредственных потомков. Алгоритмы генерации октодеревьев можно структурировать так, чтобы они при- нимали определения объектов в любой форме, например, многоугольной сетки, кри- волинейных участков поверхности или стереометрических конструкций. Октодерево одного объекта можно построить из ограждающего параллелепипеда, определяемого координатными границами объекта. Объемный объект, представленный в форме октодерева, можно подвергать раз- личным обработкам. Алгоритм выполнения операций над множествами можно при- менить к двум представлениям в форме октодерева для одной области пространства. При операции логического сложения новое октодерево строится с использованием узлов обоих входных октодеревьев. Чтобы для двух входных октодеревьев задать представление пересечения, строится новое дерево с использованием октантов, в ко- торых два объекта перекрываются. Подобным образом, при вычитании исследуются области, занятые одним объектом и не занятые другим.
8.23. Методы фрактальной геометрии 671 Разработано еще несколько алгоритмов обработки октодеревьев. Например, трех- мерные вращения выполняются путем преобразования пространственных областей, представленных занятыми октантами. Чтобы определить на сцене видимые объекты, можно вначале выяснить, заняты ли передние октанты. Данный процесс продолжа- ется до тех пор, пока все занятые октанты не будут определены по направлению наблюдения. Первый объект, обнаруженный по направлению наблюдения (через ок- танты пространства от переднего плана вглубь), является видимым, а информация относительно этого объекта может передаваться в представление в форме квадроде- рева с последующим отображением на экране. 8.22. BSP-ДЕРЕВЬЯ Данная схема представления подобна кодированию в форме октодерева, только в этом случае пространство на каждом этапе делится не на восемь, а на два участка. С по- мощью дерева бинарного разделения пространства (binary space-partitioning — BSP) на каждом этапе сцена делится на два участка плоскостью, которая может прохо- дить через любую точку и иметь любую ориентацию. В кодировании же с помощью октодерева сцена на каждом этапе делится тремя взаимно перпендикулярными плос- костями, параллельными декартовым координатным плоскостям. Адаптивное деление пространства с помощью BSP-деревьев может быть более эффективным, поскольку разрезающие плоскости располагаются где угодно и ори- ентированы как угодно согласно пространственному расположению объектов. Это может уменьшить глубину дерева, предоставляющего сцену, по сравнению с октоде- ревом, а следовательно, сократить время, необходимое для поиска на дереве. Кроме того, BSP-деревья полезны для определения видимых поверхностей при разделении пространства в алгоритмах построения хода лучей. 8.23. МЕТОДЫ ФРАКТАЛЬНОЙ ГЕОМЕТРИИ Во всех рассмотренных выше представлениях объектов используются методы евкли- довой геометрии; т.е. формы объектов описываются уравнениями. Данных методов достаточно для описания объектов производства, которые имеют гладкие поверхно- сти и правильные формы. Однако такие природные объекты, как горы и облака, имеют неправильные или фрагментированные особенности, и евклидовы методы не позволя- ют реалистично представить подобные объекты. Естественные объекты описываются методами фрактальной геометрии, где для моделирования объектов используются процедуры, а не уравнения. Как можно было ожидать, характеристики процедур- но определенных объектов достаточно отличаются от характеристик объектов, опи- санных уравнениями. Представления объектов средствами фрактальной геометрии
672 Глава 8. Представления трехмерных объектов Отдаленная гора Вид горы с более близкого расстояния Рис. 8.67. Зазубренный вид контура горы при различных уровнях увеличения широко применяются во многих областях для описания и объяснения особенностей природных явлений. В компьютерной графике фрактальные методы используются для генерации изображений естественных объектов и визуализации различных мате- матических и физических систем. Фрактальный объект имеет две базовые характеристики: бесконечное число де- талей в любой точке и определенное самоподобие частей объекта и общего изобра- жения объекта. Свойство самоподобия объекта может принимать различные формы в зависимости от выбранного представления фрактала. Фрактальный объект описы- вается процедурой, которая задает повторяющуюся операцию, проявляющую детали подчастей объекта. Природные объекты представляются процедурами, которые тео- ретически повторяются бесконечное число раз. Разумеется, графические изображения природных объектов строятся за конечное число шагов. Если увеличивать масштаб непрерывной евклидовой формы (все равно, насколь- ко сложной), со временем укрупненное изображение сгладится. Однако, если уве- личивать масштаб фрактального объекта, будет видно все больше и больше деталей без заметного сглаживания внешнего вида объекта. Контур горы на фоне неба будет иметь все ту же зазубренную форму при наблюдении со все более близкого рассто- яния (рис. 8.67). При приближении к горе становятся видимыми детали отдельных выступов скал и валунов. Если подойти еще ближе, станут видны сначала скалы, затем камни, затем песчинки. С каждым шагом контур становится все более искрив- ленным и изломанным. Если взять песчинки и положить их под микроскоп, можно увидеть, что данная детализация продолжается до молекулярного уровня. Подобные формы описывают побережья и края растений и облаков. Чтобы получить увеличенное изображение фрактала, можно выбрать участок фрактала и отобразить его в области наблюдения такого же размера, что и исходная, вмещающая весь объект. Затем для этой части объекта вызывается процедура постро- ения фрактала, и при этом уровне увеличения на экране видно большее число дета-
8.23. Методы фрактальной геометрии 673 лей. Если повторять этот процесс, будет отображаться все больше и больше деталей объекта. Поскольку процедурам построения присуща бесконечная детализация, фрак- тальный объект не имеет определенного размера. Отметим, однако, что при введении в описание объекта большего числа деталей, размеры увеличиваются бесконечно, но координатные границы объекта не выходят из конечной области пространства. Величину изменения детализации объекта можно охарактеризовать числом, име- нуемым размерностью фрактала. В отличие от евклидовых размеров это число не обязательно является целым. Фрактальные методы доказали свою полезность при моделировании огромного множества природных явлений. В графических приложениях фрактальные представ- ления используются для моделирования рельефа местности, облаков, воды, деревьев и другой растительной жизни, перьев, меха и различных поверхностных текстур, а иногда — для получения интересных узоров. В других дисциплинах фрактальные узоры применяются в построении распределения звезд, островов на реке и кратеров на Луне; колебании курсов на фондовой бирже; музыке; транспортном потоке; из- носе городского имущества; моделировании границ областей сходимости в методах численного анализа. ПРОЦЕДУРЫ ГЕНЕРАЦИИ ФРАКТАЛОВ Фрактальный объект генерируется многократным применением заданной функции преобразования к точкам области пространства. Если обозначить через Ро = (то, уо, zo) выбранную начальную точку, каждое повторное применение (итерация) функции преобразования F дает последовательные уровни детализации согласно сле- дующей формуле: Pi=F(P0), P2 = F(Pi), Р3 = Г(Р2), (8.105) Вообще, функцию преобразования можно применить к заданному набору точек или исходному набору таких примитивов, как прямые линии, кривые, закрашенные об- ласти или поверхности. Кроме того, можно использовать детерминированные или случайные процедуры. Функцию преобразования можно определить через геомет- рические преобразования (масштабирование, трансляция, вращение), или она может включать нелинейные преобразования координат и статистические параметры при- нятия решений.
674 Глава 8. Представления трехмерных объектов Хотя фрактальные объекты по определению содержат бесконечное число дета- лей, функция преобразования применяется конечное число раз, и, разумеется, объек- ты отображаются с конечными размерами. Процедурное представление переходит в “истинный” фрактал при увеличении числа преобразований и дает все большее число деталей. Детализация конечного графического изображения объекта зависит от чис- ла выполненных итераций и разрешения системы отображения. Изменения деталей, которые меньше размера пикселя, отобразить невозможно. Однако, чтобы получать изображения с большей детализацией, можно многократно увеличивать выбранные участки объекта. КЛАССИФИКАЦИЯ ФРАКТАЛОВ Самоподобные фракталы имеют части, которые являются копиями всего объекта в уменьшенном масштабе. Начиная с исходной формы подчасти объекта строятся пу- тем применения масштабного коэффициента s к общей форме. Для всех подчастей можно использовать один масштабный коэффициент s, или же для разных частей объекта можно использовать различные масштабные коэффициенты. Если, кроме то- го, применить случайные вариации к масштабированным подчастям, фрактал будет называться статистически самоподобным. В этом случае части имеют одинаковые статистические свойства. Статистически самоподобные фракталы широко использу- ются для моделирования деревьев, кустов и других растений. Самоаффинные фракталы имеют части, построенные с различными масштаб- ными коэффициентами sx, sy и sz по различным координатам. Кроме того, мож- но задействовать случайные колебания и получить статистически самоаффинные фракталы. Местность, вода и облака обычно моделируются именно статистически самоаффинными фракталами. Инвариантные фрактальные наборы формируются с использованием нелиней- ных преобразований. Данный класс фракталов включает такие фракталы бесконеч- ного возведения в квадрат, как множество Мандельброта (формируется с исполь- зованием функций возведения в квадрат в комплексном пространстве), и фракталы бесконечного обращения, построенные с использованием процедур инверсии. ФРАКТАЛЬНАЯ РАЗМЕРНОСТЬ Величину вариации структуры фрактального объекта можно описать числом D, на- зываемым размерностью фрактала и являющимся мерой шероховатости, или фраг- ментации, объекта. Более зазубренные объекты имеют большую фрактальную размер- ность. Один метод генерации фрактального объекта заключается в задании интерак- тивной процедуры, использующей выбранное значение D. Другой подход состоит в определении фрактальной размерности по искомым свойствам объекта, хотя в об- щем случае фрактальную размерность бывает трудно рассчитать. Методы расчета
8.23. Методы фрактальной геометрии 675 а) Рис. 8.68. Деление единичного отрез- ка (панель а), единичного квадрата (панель б) и единичного куба (па- нель в). Евклидов размер обозначен De, а масштабный коэффициент для каждого объекта равен s = | D основываются на концепциях размерности, разработанных в различных разделах математики, в частности, топологии. Формула для фрактальной размерности самоподобного фрактала, построенного с единственным скалярным коэффициентом з, выводится по аналогии с делением евклидового объекта. На рис. 8.68 показана связь между масштабным коэффициен- том s и числом подчастей п при делении единичного отрезка, единичного квадрата и единичного куба. При $ — единичный отрезок (рис. 8.68, а) делится на две равные подчасти. При том же масштабном коэффициенте квадрат, изображенный на рис. 8.68, б, делится на четыре равные подчасти, а куб, представленный на рис. 8.68, в, делится на восемь частей равного объема. Для всех указанных объектов отношение между числом подчастей и масштабным коэффициентом равно n-sDe = 1. По анало- гии с евклидовыми объектами фрактальная размерность D самоподобных объектов вычисляется из следующего соотношения: nsD = 1. (8.106)
676 Глава 8. Представления трехмерных объектов Выражая из этого уравнения фрактальную размерность самоподобия D, получаем: D = In п ln(l/s)’ (8.107) Для самоподобного фрактала, построенного с несколькими масштабными коэффици- ентами, фрактальная размерность самоподобия находится из неявного соотношения п Es^ = 1’ <8108) /с—1 где Sf. — масштабный коэффициент подчасти к. На рис. 8.68 изображено деление простых форм (отрезка, квадрата и куба). Если бы формы были сложнее, включали кривые линии и объекты с неплоскими поверх- ? ностями, определение структуры и свойств подчастей было бы сложнее. Для общих форм объектов можно использовать методы топологического покрытия, аппрокси- мирующие подчасти объекта простыми формами. Поделенную кривую, например, можно аппроксимировать прямыми отрезками, а разделенную сплайновую поверх- ность — небольшими квадратами или прямоугольниками. Для аппроксимации дета- лей объекта, разделенного на множество мелких частей, можно использовать такие покрывающие формы, как окружности, сферы и цилиндры. Методы покрытия широ- ко используются в математике для определения таких геометрических свойств, как длина, площадь, объем сложных объектов, через суммирование свойств набора мень- ших покрывающих объектов. Кроме того, методы покрытия можно использовать для определения фрактальной размерности D некоторых объектов. Концепции топологического покрытия изначально использовались для распро- t странения геометрических свойств на нестандартные формы. Расширение методов покрытия с использованием окружностей или сфер привело к возникновению по- нятия размерности Хаусдорфа-Безиковича, или дробной размерности. Размерность Хаусдорфа-Безиковича можно использовать в качестве фрактальной размерности некоторых объектов, но в общем случае вычислить ее трудно. Более распространена оценка фрактальной размерности объекта с помощью методов покрытия клетка- ми (box-covering methods) с использованием прямоугольников или параллелепипе- дов. Понятие покрытия клетками иллюстрируется на рис. 8.69. Здесь область внутри большой неправильной границы можно аппроксимировать суммой областей малень- ких покрывающих прямоугольников. При применении методов покрытия клетками вначале определяются координат- ные границы объекта, затем объект делится на несколько маленьких клеток с ис- пользованием данных масштабных коэффициентов. Число клеток п, необходимое для покрытия объекта, называется размером в клетках (box dimension), и п связа- но с фрактальной размерностью D. Статистически самоподобные объекты с одним
8.23. Методы фрактальной геометрии 677 Рис. 8.69. Покрытие квадратиками объекта неправильной формы масштабным коэффициентом s можно покрыть квадратами или кубами. Затем подсчи- тывается число п покрывающих клеток и с помощью уравнения (8.107) оценивается фрактальная размерность. Самоаффинные объекты покрываются не квадратными, а прямоугольными клетками, поскольку в разных направлениях используются различ- ные масштабные коэффициенты. В этом случае фрактальная размерность оценивается с использованием числа клеток п и параметров аффинного преобразования. Фрактальная размерность объекта всегда больше соответствующей евклидовой размерности (или топологической размерности), которая является просто наимень- шим числом параметров, необходимых для задания объекта. Евклидова кривая одно- мерна, поскольку точку на ней можно определить одним параметром и. Евклидова поверхность двухмерна, и на ней используются параметры поверхности миг. На- конец, евклидово тело, которое требует три параметра для задания всех координат, является трехмерным. Размерность фрактальной кривой D, целиком лежащей в двухмерной плоскости, больше 1 (евклидовой размерности кривой). Чем ближе D к 1, тем глаже фракталь- ная кривая. Если D = 2, имеем кривую Пеано', т.е. “кривая” полностью заполняет конечную область двухмерного пространства. При 2 < D < 3 кривая самопересека- ется, и область плоскости покрывается кривой бесконечное число раз. Фрактальные кривые можно использовать для моделирования таких природных объектов, как бе- реговая линия. Фрактальная размерность пространственных фрактальных кривых (которые не лежат целиком в одной плоскости) D также больше 1, но при D, превышающем 2, кривая может не самопересекаться. Кривая, которая заполняет объем пространства, имеет размерность D = 3, а самопересекающаяся пространственная кривая имеет размерность D > 3. Размерность фрактальных поверхностей обычно принадлежит диапазону 2 < D < 3. Если D = 3, “поверхность” заполняет область пространства. Если D > 3, имеется перекрывающееся покрытие пространства. С помощью фрактальных поверх- ностей обычно моделируются местность, облака и вода. Размерность фрактального тела обычно принадлежит диапазону 3 < D < 4. При D > 4 имеем самонакладывающийся объект. Фрактальные тела могут использовать- ся, например, для моделирования таких свойств облаков, как плотность водяного пара или температура в области пространства.
678 Глава 8. Представления трехмерных объектов ГЕОМЕТРИЧЕСКОЕ ПОСТРОЕНИЕ ДЕТЕРМИНИРОВАННЫХ САМОПОДОБНЫХ ФРАКТАЛОВ Чтобы геометрически построить детерминированный (неслучайный) самоподобный фрактал, нужно начать с данной геометрической формы, называемой инициатором. Подчасти инициатора затем заменяются шаблоном, именуемым генератором. Например, если использовать инициатор и генератор, показанные на рис. 8.70, можно построить “снежинку”, или кривую Коха, показанную на рис. 8.71. Каж- дый отрезок инициатора заменяется шаблоном-генератором, состоящим из четырех Генератор Рис. 8.71. Первые три итерации процес- са генерации кривой Коха
8.23. Методы фрактальной геометрии 679 Длина сегмента = I Длина =1 Рис. 8.72. Длина каждого участка кривой Коха увели- чивается на каждом этапе в | раза, тог- да как длины пря- мых отрезков уменьшаются на | Длина сегмента = 1/V7 D= 1,129 а) Длина сегмента = 1/4 D= 1,500 б) Длина сегмента = 1/6 D= 1,613 в) Рис. 8.73. Генераторы само- подобных фрактальных кон- струкций (кривых) и соответ- ствующие фрактальные раз- мерности Длина сегмента= 1/8 D« 1,333 Длина сегмента = 1/3 D = 0,631 Длина сегмента = 1/8 D = 1,333 Рис. 8.74. Генераторы фракта- лов с несколькими несвязан- ными частями отрезков равной длины. Затем генератор масштабируется и заменяет отрезки мо- дифицированного инициатора, повторяя данный процесс несколько раз. Масштаб- ный коэффициент на каждом шаге равен поэтому фрактальная размерность равна D = 1п4/1пЗ « 1,2619. Кроме того, длина каждого отрезка инициатора увеличи- вается на каждом шаге в | раза, поэтому длина фрактальной кривой стремится к бесконечности при добавлении к ней новых деталей (рис. 8.72). На рис. 8.73 иллю- стрируются другие генераторы, которые можно использовать для построения само- подобных фрактальных кривых. Генераторы, показанные на рис. 8.73, бив, содержат больше деталей, чем генератор кривой Коха, и их фрактальная размерность больше. Кроме того, можно использовать генераторы с несколькими несвязанными ком- понентами. Несколько примеров составных генераторов приведено на рис. 8.74. Дан- ные шаблоны можно объединять со случайными колебаниями для моделирования различных природных объектов, имеющих несколько несвязанных частей, таких как острова, расположенные возле береговой линии.
680 Глава 8. Представления трехмерных объектов Рис. 8.76. Самоподобное построение папоротника (перепечатано с разре- шения Питера Оппенгей- мера (Peter Oppenheimer), Computer Graphics Lab, Нью-Йоркский техноло- гический институт) Рис. 8.75. Применение этого генератора к краям равностороннего треугольника дает “снежинкоподобную” кривую Пеано Генератор, показанный на рис. 8.75, содержит отрезки различной длины, а при построении фрактальной кривой используется несколько масштабных коэффициен- тов. Следовательно, фрактальная размерность получаемой кривой определяется из уравнения (8.108). С помощью методов геометрического построения самоподобных фигур можно изображать деревья и другую растительность. Контур каждой ветви папоротника, изображенной на рис. 8.76, а является масштабированной версией общей формы па- поротника. На рис. 8.76, б папоротник визуализирован полностью с изгибом каждой ветви. В качестве примера самоподобной фрактальной конструкции поверхностей трех- мерного объекта масштабируем правильный тетраэдр, показанный на рис. 8.77, с коэффициентом |, затем поместим масштабированный объект на каждую из четы- рех граней исходного тетраэдра, которая при этом преобразуется в шесть меньших граней, а площадь поверхности грани увеличится в | раза. Фрактальная размерность полученной поверхности равна D = « 2, 58496, In 2 что классифицируется как довольно фрагментированная поверхность.
8.23. Методы фрактальной геометрии 681 Рис. 8.77. Масштабирование тетраэдра, показанного на панели а, с коэффициентом | и размещение масштабированной версии на одной грани исходного тетраэдра дает фрак- тальную структуру, показанную на панели б Рис. 8.78. Самоподобные трехмерные фрак- талы, сформированные генераторами, ко- торые вычитают подчасти инициатора (пе- репечатано с разрешения Джона Хар- та (John Hart), факультет информати- ки, Иллинойский университет в Урбана- Шампейн) Рис. 8.79. Модификация “снежинки” со случайным смещением средней точки Другой путь создания самоподобных фрактальных объектов заключается в разме- щении отверстий в данном инициаторе вместо увеличения площади поверхности. На рис. 8.78 показано несколько примеров фрактальных объектов, построенных таким образом.
682 Глава 8. Представления трехмерных объектов Рис. 8.80. Случайная самоподобная конструкция жилок упавшего листа (перепечатано с разрешения Питера Оппенгеймера, Computer Graphics Lab, Нью-Йоркский технологический институт) Рис. 8.81. Моделирование сцены с использованием нескольких экземпляров объекта. Фрактальные листья присоединены к деревьям в случайным образом преобразованных положениях, и для созда- ния лесополосы используется несколько повернутых и масштабированных экземпляров деревьев. Трава смоделирована множественными экземплярами зеленых конусов (перепечатано с разрешения Джона Харта, факультет информатики, Иллинойский университет в Урбана-Шампейн) ГЕОМЕТРИЧЕСКОЕ ПОСТРОЕНИЕ СТАТИСТИЧЕСКИ САМОПОДОБНЫХ ФРАКТАЛОВ Чтобы сделать геометрическую структуру самоподобного фрактала изменчивой, мож- но на каждом шаге случайным образом выбирать генератор из меню шаблонов. Кроме того, построить самоподобный фрактал можно, вычисляя координатные смещения с небольшими случайными вариациями. Например, на рис. 8.79 при создании слу- чайного узора “снежинка” использовалась функция распределения вероятности для вычисления на каждом шаге переменных смещений средней точки.
8.23. Методы фрактальной геометрии 683 Рис. 8.82. Фрактальный лес, создан- ный множественными экземплярами ли- стьев, хвойных иголок, травы и древес- ной коры (перепечатано с разрешения Джона Харта, факультет информати- ки, Иллинойский университет в Урбана- Шампейн) Рис. 8.83. Моделирование ветвей де- рева со спиральными, винтовыми и случайными изгибами (перепечатано с разрешения Питера Оппенгеймера, Computer Graphics Lab, Нью-Йоркский технологический институт) Другой пример этого метода показан на рис. 8.80. Случайные параметры масшта- бирования и направления ветвления используются на этом изображении для модели- рования жилок листа. После того как фрактальный объект создан, сцену можно моделировать с исполь- зованием нескольких преобразованных экземпляров объекта. На рис. 8.81 иллюстри- руется размещение экземпляров со случайным вращением фрактального дерева. На рис. 8.82 с использованием различных случайных преобразований изображен фрак- тальный лес. Чтобы смоделировать сучковатые и деформированные ветви некоторых деревьев, можно применить функции кручения, а также масштабирование для создания слу- чайных самоподобных ветвей. Данный метод иллюстрируется на рис. 8.83. Начав с конического цилиндра (слева на рисунке), можно с помощью преобразований полу- чить (слева направо) спираль, винтовую ветку и случайный скрученный шаблон. Де- рево, смоделированное со случайными функциями кручения, показано на рис. 8.84. Ветка дерева на этом изображении смоделирована с использованием отображения
684 Глава 8. Представления трехмерных объектов Рис. 8.84. Три ветки, смоделированные со случайными отклонениями (перепечатано с разрешения Питера Оппенгеймера, Computer Graphics Lab, Нью-Йоркский технологиче- ский институт) шероховатости и фрактальных броуновских изменений в узоре шишечек. Методы генерации фрактальных броуновских кривых рассмотрены в следующем разделе, а методы отображения шероховатости изучаются в разделе 10.17. МЕТОДЫ ПОСТРОЕНИЯ АФФИННЫХ ФРАКТАЛОВ Высоко реалистичные представления местности и других природных объектов мож- но получить с использованием аффинных фрактальных методов, моделирующих эле- менты объекта фрактальным броуновским движением. Это является расширением стандартного броуновского движения, разновидности “случайного блуждания”, кото- рое описывает неопределенное зигзагообразное движение частиц в газе или другой текучей среде. На рис. 8.85 иллюстрируется траектория случайного блуждания в плоскости ху. Начиная с данного положения в случайном направлении генерируется прямой отрезок случайной длины. Затем из конца этой первой линии строится другой случайный отрезок, и данный процесс продолжается заданное число раз. Фракталь- ное броуновское движение получается прибавлением дополнительного параметра к статистическому распределению, описывающему броуновское движение. Данный до- полнительный параметр задает фрактальную размерность траектории “движения”. Для моделирования фрактальной кривой можно использовать одну фракталь- ную броуновскую траекторию. Имея двухмерный массив случайных дробных бро- уновских возвышений над сеткой “нулевой плоскости”, можно смоделировать по- Рис. 8.85. Пример броуновского движения (случайного блуждания) на плоскости ху
8.23. Методы фрактальной геометрии 685 Рис. 8.86. Планета, построенная с ис- пользованием броуновского движения, наблюдаемая с поверхности планеты, построенной с использованием фрак- тального броуновского движения с до- бавленными кратерами на заднем плане (перепечатано с разрешения Р. В. Вос- са (R. V. Voss) и Б. Б. Мандельброта из книги Benoit В. Mandelbrot, The Fractal Geometry of Nature (W. H. Freeman and Co., New York, 1983» верхность горы, соединив возвышения в виде набора многоугольных участков. Если случайные возвышения генерируются на поверхности сферы, можно смоделировать горы, долины и океаны планеты. На рис. 8.86 броуновское движение использовалось для создания вариаций высот на поверхности планеты. Здесь отметки высот обозна- чены в цвете так, что наиболее низкие точки изображены синим (океаны), а наиболее высокие (снег на горах) — белым. Дробное броуновское движение использовалось для создания элементов ландшафта на заднем плане. Кратеры созданы со случай- ными диаметрами и случайными положениями с помощью аффинных фрактальных процедур, которые близко описывают распределение наблюдаемых кратеров, остро- вов на реках, дождевых узоров и других подобных систем объектов. Меняя фрактальную размерность в расчете броуновского движения, можно ва- рьировать неровности элементов ландшафта. Значения фрактальной размерности по- рядка D « 2,15 дают реалистичные изображения гор, а большие (около 3) можно использовать для создания необычных внеземных ландшафтов. Рассчитанные возвы- шения также масштабируются, чтобы углубить долины и увеличить высоту горных пиков. Некоторые особенности ландшафта, которые можно смоделировать с помо- щью фрактальных процедур, представлены на рис. 8.87. Сцена, смоделированная с фрактальными облаками на фоне фрактальной горы, показана на рис. 8.88. МЕТОДЫ СЛУЧАЙНОГО СМЕЩЕНИЯ СРЕДНЕЙ ТОЧКИ Расчеты фрактального броуновского движения являются трудоемким процессом, по- скольку координаты возвышения поверхности над уровнем моря (“нулевой плоско- стью”) рассчитываются с помощью ряда Фурье — суммы синусоидальных и коси- нусоидальных слагаемых. Обычно, правда, используются методы быстрого преобра-
686 Гпава 8. Представления трехмерных объектов в) Рис. 8.87. Вариации элементов ландшафта, смоделированные с использованием дробного броуновского движения (перепечатано с разрешения Р. Восса и Б. Мандельброта из книги Benoit В. Mandelbrot, The Fractal Geometry of Nature (W. H. Freeman and Co., New York, 1983) (панель а); Кена Масгрейва (Ken Musgrave) и Б. Мандельброта, факультет математики и информатики, Йельский университет) (панели бив) зования Фурье (БПФ), но генерация сцен с фрактальными горами все еще является медленным процессом. Поэтому для аппроксимации представлений ландшафтов и других природных явлений через фрактальное броуновское движение были разрабо- таны более быстрые методы случайного смещения средней точки, подобные методам случайного смещения, используемым в геометрических построениях. Первоначаль- но эти методы использовались для генерации анимационных последовательностей для научно-фантастических фильмов, включающих неземные пейзажи. В настоящее время методы смещения средней точки широко используются во многих других при- ложениях компьютерной графики, включая анимацию для телерекламы. Хотя методы случайного смещения средней точки быстрее расчетов фрактально- го броуновского движения, они дают менее реалистичные особенности ландшафта. На рис. 8.89 метод смещения средней точки использован для генерации траектории случайного блуждания на плоскости ху. Начиная с прямого отрезка, рассчитывается
8.23. Методы фрактальной геометрии 687 Рис. 8.88. Смоделированная сцена с фрактальными облаками и горами (перепечатано с разрешения Кена Масгрейва и Б. Мандельброта, факуль- тет математики и информатики, Йельский университет) Рис. 8.89. Случайное сме- щение средней точки пря- мого отрезка смещенное значение у средней точки линии — среднее значений конечных точек по у плюс случайное смещение: ymid = |[у(а) + У(Ь)] + г. (8.109) Чтобы аппроксимировать фрактальное броуновское движение, выберем значение г из гауссова распределения со средним 0 и дисперсией, пропорциональной |(b — а) |2fI, где /7 = 2 — 7), а 7) > 1 — фрактальная размерность. Случайное смещение можно получить и иначе — взяв г = srg\b — а|, где параметр s — выбранный коэффици- ент шероховатости поверхности, a rg — значение гауссовой случайной переменной со средним 0 и дисперсией 1. Для получения этих значений может использоваться поиск в таблице. Затем процесс повторяется путем расчета смещенного значения у средних точек каждой половины деленной линии. Деление продолжается, пока не будет получено определенное число сегментов или пока длины участков поделенной линии не станут меньше некоторого заданного значения. На каждом шаге значе- ние случайной переменной г уменьшается, поскольку оно пропорционально ширине |Ь - а| разделяемого участка линии. Фрактальная кривая, полученная описанным методом, изображена на рис. 8.90. Элементы ландшафта генерируются путем применения процедур случайного сме- щения средней точки к прямоугольной нулевой плоскости (рис. 8.91). Вначале значе- ние возвышения z присваивается всем четырем углам (a, b, с, d на рис. 8.91) нулевой плоскости. Затем нулевая плоскость делится в средней точке каждой стороны, и по-
688 Глава 8. Представления трехмерных объектов Рис. 8.90. Траектория случайного блуждания, сгенерированная из прямо- го отрезка за четыре итерации процедуры случайного смещения средней точки У b а Рис. 8.91. При расчете возвышений местности прямоугольная нулевая плоскость (панель а) делится на четыре равных участка (панель б) на первом шаге процедуры слу- чайного смещения средней точки б) б) Нулевая плоскость а) с х d лучается пять новых точек сетки: е, f, g, h и m. Возвышения в средних точках е, f, g и h краев нулевой плоскости можно рассчитать как среднее возвышение ближайших двух вершин плюс случайный сдвиг. Например, возвышение zc в средней точке е вычисляется по вершинам а и Ь, а возвышение в средней точке f вычисляется по вершинам b и с: ^е — (-2а -|- Z(,)/2 + Ге, Zf — (zb + Z^l^l + Гу. Случайные значения ге и ту можно получить из гауссова распределения со средним О и дисперсией, пропорциональной шагу сетки в степени 2Н, где Н — 3 — D и D > 2. Большие значения фрактальной размерности поверхности D дают более изрезанные ландшафты, тогда как меньшие генерируют более сглаженные местности. Кроме того, случайные смещения для гауссовой переменной со средним 0 и дисперсией 1 можно вычислить как произведения коэффициента шероховатости поверхности, шага сетки и параметра поиска в таблице. Возвышение zm средней точки m нулевой плоскости можно вычислить, используя точки eng или точки f и h. Кроме того, zm можно
8.23. Методы фрактальной геометрии 689 Рис. 8.92. Генерация особенностей рельефа: восемь участков поверхно- сти, сформированных на нулевой плоскости, на первом шаге процедуры случайного смещения средней точки вычислить, используя присвоенные четырем углам нулевой плоскости возвышения и случайное смещение: — (-^а 4“ Ч -2С + 2^)/4 + Гто. Данный процесс повторяется для всех четырех новых участков сетки на каждом шаге, пока шаг сетки не станет меньше заданного значения. При генерации возвышений можно сформировать треугольные участки поверхно- сти местности. На рис. 8.92 показано восемь участков поверхности, которые можно построить на первом этапе деления. При каждой итерации треугольники последо- вательно делятся на меньшие плоские участки. Когда процесс деления завершен, участки визуализируются с использованием выбранных положений источников све- та, значений других параметров освещения и выбранных цветов и поверхностных текстур местности. С помощью метода случайного смещения средней точки можно генерировать дру- гие компоненты сцены, кроме рельефа. Например, те же методы можно использовать для получения деталей волн на воде или узоров облаков над нулевой плоскостью. УПРАВЛЕНИЕ ТОПОГРАФИЕЙ ЛАНДШАФТА Чтобы управлять расположением пиков и долин на фрактальной сцене, смоделиро- ванной методом смещения средней точки, можно ограничить рассчитанные высоты определенными интервалами на различных участках нулевой плоскости. Для это- го на нулевой плоскости задается набор контрольных поверхностей, как показано на рис. 8.93. Затем вычисляется случайное возвышение в каждой средней точке отрезков сетки на нулевой плоскости, которое зависит от разности контрольного возвышения и среднего возвышения, рассчитанного для этой точки. Описанная процедура ограничи- вает возвышения заданным интервалом возвышения над контрольной поверхностью. Контрольные поверхности можно использовать для моделирования существую- щих особенностей рельефа в Скалистых горах (или любом другом регионе), строя плоские грани с использованием возвышений в контурном изображении определен- ной области. Или же можно задать возвышения вершин контрольных многоуголь- ников и разработать собственные особенности рельефа. Кроме того, контрольные поверхности могут иметь любую форму. С плоскостями легче работать, но сфериче- ские поверхности или другие криволинейные формы использовать также реально.
690 Гпава 8. Представления трехмерных объектов Рис. 8.93. Контрольные поверхности над нулевой плоскостью Рис. 8.94. Проекция треугольной контурной на сетку нулевой плоскости Применим метод случайного смещения средней точки для расчета возвышений сетки, но теперь выберем случайные значения из гауссова распределения, где сред- нее р и среднеквадратическое отклонение ст являются функциями контрольных воз- вышений. Искомые значения р и ст предполагаются пропорциональными разности рассчитанного среднего возвышения и предопределенного контрольного возвышения в каждой точке сетки. Например, для точки сетки е на рис. 8.91 среднеквадратическое отклонение задается следующим образом: Ре — ZC^ (^а ”1” О"е — где zce — контрольное возвышение точки нулевой плоскости е, а 0 < s < 1 - масштабный коэффициент. Такие небольшие значения з, как з < 0,1, теснее связы- вают полученный рельеф с огибающей местностью, а большие значения з разрешают большие флуктуации высоты местности. Чтобы определить значения контрольных возвышений над плоскостью контроль- ной поверхности, вначале определяют значения параметров плоскости А,В,Си D. Для любой точки (х, у) на нулевой плоскости возвышение над плоскостью, содержа- щей этот контрольный многоугольник, определяется следующим образом: zc = (—Ах — By — D}/С.
8.23. Методы фрактальной геометрии 691 Рис. 8.95. Сложная сцена, смоделирован- ная методом случайного смещения сред- ней точки с использованием плоских кон- трольных поверхностей над нулевой по- верхностью. Элементы рельефа, воды и облаков визуализировались отдельно, за- тем объединялись в сложное изображение (перепечатано с разрешения Энга-Киата Коха (Eng-Kiat Koh), Encentuate, 1пс„ Ку- пертино, Калифорния) Затем для расчета контрольных возвышений над точками сетки нулевой плоскости можно использовать методы последовательного приращения. Чтобы эффективно про- вести необходимые расчеты, нулевая плоскость делится на меньшую сетку точек ху, и каждая многоугольная контрольная поверхность проектируется на нулевую плос- кость, как показано на рис. 8.94. По этой проекции определяется, какие точки сетки находятся под каждым контрольным многоугольником. Здесь могут использоваться процедуры, подобные операциям заполнения (закрашивания) области на строке раз- вертки. Следовательно, для каждой “строки развертки” у на сетке нулевой плоскости, которая пересекает края многоугольника, рассчитываются пересечения со строкой развертки и определяется, какие точки сетки находятся внутри проекции контрольно- го многоугольника. Расчет контрольных возвышений в этих точках сетки выполняется с помощью последовательных приращений: 2Cj+ij = zcitj - Лх(А/С), zcitj+i = zcij - Ду(В/С), (8.110) где Дж и Ду — шаги сетки в направлениях ж и у. Данная процедура выполняется осо- бенно быстро, когда для обработки точек сетки контрольной плоскости применяются параллельные векторные методы. На рис. 8.95 показана сцена, где для структурирования поверхностей земли, воды и облаков над нулевой плоскостью использовались контрольные плоскости. Затем для сглаживания краев многоугольников и обеспечения подходящих цветов поверхности использовались алгоритмы визуализации поверхностей. ФРАКТАЛЫ МНОГОКРАТНОГО ВОЗВЕДЕНИЯ В КВАДРАТ Другой метод генерации фрактальных объектов заключается в многократном приме- нении к точкам комплексного пространства функции преобразования. В двух измере- ниях комплексное число можно представить как z = х + iy, где ж и у — действитель-
692 Глава 8. Представления трехмерных объектов Рис. 8.97. Единичная окружность на комплексной плоскости. Нефрак- тальная комплексная функция возведения в квадрат f (z) = z2 пере- мещает точки, находящиеся внутри окружности, к началу координат, и удаляет от окружности точки, находящиеся вне ее. Любая исходная точка, находившаяся на окружности, остается на ней ные числа иг2 = —1. В трех- и четырехмерном пространствах точки представляются кватернионами. Комплексной функцией возведения в квадрат f(z) называется функ- ция, включающая расчет г2, и некоторые такие функции можно использовать для генерации фрактальных форм. В зависимости от исходной точки, выбранной для итерации, многократное при- менение функции возведения в квадрат даст один из трех возможных выходов (рис. 8.96). • Преобразованная точка может уходить на бесконечность. • Преобразованная точка может сходиться к конечной граничной точке, называемой аттрактором. • Преобразованная точка остается на границе некоторой области. Например, нефрактальная операция возведения в квадрат / (г) = г2 на комплексной плоскости преобразовывает точки согласно их положению относительно единичной окружности (рис. 8.97). Любая точка z, амплитуда которой |г| больше 1, преобра- зовывается в последовательность точек, уходящих на бесконечность. Точка |г| < 1 при преобразованиях приближается к началу координат. Точки, изначально распо- ложенные на окружности (|z| = 1), остаются на окружности. Хотя преобразование
8.23. Методы фрактальной геометрии 693 Рис. 8.98. Локализация фрактальной граничной кривой с использова- нием обратной функции возведения в квадрат z = f-1(z') z2 не порождает фрактал, некоторые комплексные операции возведения в квадрат генерируют фрактальную кривую на границе между точками, которые стремятся к бесконечности, и точками, стремящимися к конечному пределу. Замкнутая фракталь- ная граница, сгенерированная с помощью операции возведения в квадрат, называется множеством Жулиа (Julia set). Вообще, классифицировать фрактальную границу функции возведения в квад- рат можно, проверив поведение выбранных точек. Если точка преобразуется так, что она либо уходит на бесконечность, либо сходится к точке-аттрактору, можно по- пробовать использовать соседнюю точку. Данный процесс повторяется до тех пор, пока не будет найдена точка на границе фрактала. Затем итерации преобразования бесконечного возведения в квадрат выявляют форму фрактала. Для простых преоб- разований на комплексной плоскости наиболее быстрым является метод локализации точек фрактальной кривой с использованием функции обратного преобразования. Ис- ходная точка, выбранная внутри или снаружи кривой, будет затем сходиться к точке на фрактальной кривой (рис. 8.98). “Богатой на фракталы” функцией является преобразование возведения в квадрат: У =/(z) = Az(l - z), (8.111) где А — комплексная постоянная. При такой функции для локализации фрактальной кривой можно использовать метод обратного преобразования. Итак, вначале члены переупорядочиваются, чтобы получить следующее квадратное уравнение: z2 - z + z'/А = 0. (8.112) Обратное преобразование описывается квадратной формулой: z = T\z') = hl ± 0 - (4z')/A). (8.113) it Используя комплексную арифметику, данное уравнение решается для действительной и мнимой частей z\ /|D| + Re(D)\ х = Re(z) = - I 1 ± у ------------- 1 , 4 (8.114)
694 Гпава 8. Представления трехмерных объектов а) б) Рис. 8.99. Две фрактальные кривые, сгенерированные с помощью обратной функции /(z) = Az(l — z) процедурой self SqTransf: a) A = 3; 6) A = 2 + i. На каждой кривой изображено 10 000 точек 1 /|D| - Re(D) у = Im(z) = ±-у------------, где дискриминант квадратного уравнения равен D = 1 — (4г')/А. Перед тем как изображать фрактальную кривую, можно рассчитать и отбросить несколько исходных значений хну (скажем, 10). Кроме того, поскольку данная функция дает два возмож- ных положения преобразованных точек (х, у), можно случайным образом выбрать знак “плюс” или “минус” на каждом шаге итерации, при условии, что Im(Z9) > 0. Если Im(7?) < 0, два возможных положения находятся во втором и четвертом квад- рантах. В этом случае хну должны иметь противоположные знаки. В приведенной ниже программе реализована описанная функция возведения в квадрат, а на рис. 8.99 приведены два варианта получающихся кривых. ♦include <GL/glut.h> ♦include <stdlib.h> ♦include <math.h> /* Задается исходный размер окна на экране дисплея. */ GLsizei winWidth = 600, winHeight= 600; /* Задаются координатные границы на комплексной плоскости. */ GLfloat xComplexMin = -0.25, xComplexMax = 1.25; GLfloat yComplexMin = -0.75, yComplexMax = 0.75; struct complexNum { GLfloat x, y;
8.23. Методы фрактальной геометрии 695 void init (void) { /* Задается белый цвет окна. */ glClearColor (1.0, 1.0, 1.0, 0.0); } void plotPoint (complexNum z) { glBegin (GL_POINTS); glVertex2f (z.x, z.y); glEnd ( ); } void solveQuadraticEq (complexNum lambda, complexNum * z) { GLfloat lambdaMagSq, discrMag; complexNum discr; static complexNum fourOverLambda = { 0.0, 0.0 }; static GLboolean firstPoint = true; if (firstPoint) { /* Вычисляется комплексное число: 4,0, деленное на лямбда. */ lambdaMagSq = lambda.х * lambda.х + lambda.у * lambda.у; fourOverLambda.x = 4.0 * lambda.х / lambdaMagSq; fourOverLambda.у = -4.0 * lambda.у / lambdaMagSq; firstPoint = false; } discr.x = 1.0 - (z->x * fourOverLambda.x - z—>y * fourOverLambda.y); discr.у = z->x * fourOverLambda.у + z->y * fourOverLambda.x; discrMag = sqrt (discr.x * discr.x + discr.у * discr.у); /* Обновляется z, проверяется, чтобы квадратный корень не * извлекался из отрицательного числа. */ if (discrMag + discr.х < 0) z->x = 0; else z->x = sqrt ((discrMag + discr.x) / 2.0); if (discrMag - discr.x < 0) z->y = 0; else z->y =0.5 * sqrt ((discrMag - discr.x) / 2.0); /* Для половины точек используется отрицательный корень, * точка помещается в квадрант 3. */ if (rand ( ) < RAND_MAX / 2) { z->x = -z->x; z—>y = -z->y; }
696 Гпава 8. Представления трехмерных объектов /* Если мнимая часть дискриминанта отрицательна, точка * должна лежать в квадранте 2 или 4, поэтому знак х * меняется на противоположный. */ if (discr.y < 0) z->x = -z->x; /* Вычисляется действительная часть z. */ z->x = 0.5 * (1 - z->x); } void selfSqTransf (complexNum lambda, complexNum z, GLint numPoints) { GLint k; /* Пропускается несколько первых точек. */ for (k = 0; k < 10; k++) solveQuadraticEq (lambda, &z); /* Изображается заданное число преобразованных точек. */ for (k = 0; k < numPoints; k++) { solveQuadraticEq (lambda, &z); plotPoint (z); } } { GLint numPoints = 10000; /* Задается число отображаемых точек. */ complexNum lambda = 3.0, 0.0 ; /* Задается комплексное значение лямбда. */ complexNum z0 = 1.5, 0.4 ; /* Задается исходная точка на комплексной плоскости. */ glClear (GL_COLOR_BUFFER_BIT); /* Очищается окно на экране дисплея. */ glColor3f (0.0, 0.0, 1.0); /* Цвет точек выбран синим. */ selfSqTransf (lambda, z0, numPoints); glFlush ( ); } { /* Характеристическое отношение поддерживается равным 1,0, * предполагается, что ширина комплексного окна равна * его высоте. */ glViewport (0, 0, newHeight, newHeight); glMatrixMode (GL_PROJECTION); glLoadldentity ( ); gluOrtho2D (xComplexMin, xComplexMax, yComplexMin, yComplexMax); glClear (GL_COLOR_BUFFER_BIT); }
8.23. Методы фрактальной геометрии 697 void displayFcn (void) void winReshapeFcn (GLint newWidth, GLint newHeight) void main (int argc, char** argv) { glutlnit (&argc, argv); glutlnitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutlnitWindowPosition (50, 50); glutlnitWindowSize (winWidth, winHeight); glutCreateWindow ("Self-Squaring Fractal"); init ( ) ; glutDisplayFunc (displayFcn); glutReshapeFunc (winReshapeFcn); glutMainLoop ( ); } Трехмерный график в переменных х, у и X функции бесконечного возведения в квадрат /(z) = Az(l — z), где |Л| = 1, представлен на рис. 8.100. Каждое поперечное сечение данного графика — это фрактальная кривая на комплексной плоскости. Рис. 8.100. Функция /(z) = Az(l —z), изображенная в трех измерениях с нормированными значениями А вдоль вертикальной оси (перепечатано с разре- шения Алана Нортона (Alan Norton), IBM Research)
698 Гпава 8. Представления трехмерных объектов Окно Рис. 8.101. Отображение из прямоугольной области в цветные пиксели окна на экране дисплея Другой операцией возведения в квадрат, дающей разнообразные фрактальные формы, является слегка видоизмененное преобразование z2. В этом случае фрактал — это граничная область вокруг набора комплексных значений z, которые не расходятся при преобразовании возведения в квадрат 2 = ^_1+го * = 1,2,3, ... (8115> Итак, вначале на комплексной плоскости выбирается точка z, затем вычисляется преобразованная точка г2 + z. На следующем шаге данная преобразованная точка возводится в квадрат и прибавляется к исходному значению z. Данная процедура повторяется до тех пор, пока мы не сможем определить, сходится или расходится данное преобразование. Математики давно знают о необычных свойствах подобных функций возведения в квадрат, но эти функции трудно анализировать без помощи вычислительных средств. Разработка цифровых компьютеров позволила изобразить границу сходимости преоб- разования (8.115) в зависимости от линейного параметра. С увеличением возможно- стей цифровых вычислительных средств стали возможны дальнейшие графические исследования свойств данной функции. Впоследствии, используя более сложные ме- тоды компьютерной графики, Бенуа Мандельброт (Benoit Mandelbrot) досконально изучил эту функцию, и набор точек, которые не сходятся при преобразовании (8.115) стал называться множеством Мандельброта. Чтобы реализовать преобразование (8.115), вначале выбирается прямоугольная область на комплексной плоскости. Затем точки этой области отображаются в цветные положения пикселей окна на экране дисплея (рис. 8.101). Цвета пикселей выбирают- ся согласно скорости сходимости соответствующей точки на комплексной плоскости при преобразовании (8.115). Если модуль комплексного числа больше 2, оно быстро сойдется при многократном возведении в квадрат. Следовательно, можно задать цикл для повтора операции возведения в квадрат, пока либо модуль комплексного чис-
8.23. Методы фрактальной геометрии 699 Ряс. 8.102. Фрактальные границы изображения, полученного с помощью преобразования (8.115). На панели а показано начальное изображение множества Мандельброта (черные области) и окружающих его областей. На панелях б-е последовательно увеличиваются изображения области, обозначеииой на предыдущем рисунке белым квадратиком. Чтобы улучшить изображаемые узоры, на каждом шаге выбираются различные комбинации цветов (перепечатано с разрешения Брайана Эванса (Brian Evans), Университет Вандербильта) ла не превысит 2, либо не пройдет заданное число итераций. Максимальное число итераций зависит от требуемой степени детализации и числа точек, которое плани- руется отобразить. Данное значение часто выбирается между 100 и 1 000, хотя для ускорения расчетов могут использоваться и меньшие значения. Однако в таком слу- чае возможна потеря деталей на границе (множество Жулиа) области сходимости. В конце цикла выбирается код цвета согласно числу итераций, выполненных циклом. Например, пиксель можно раскрасить черным, если счетчик итераций имеет макси- мальное значение (несходящаяся точка), и красным — если счетчик итераций близок к 0. Затем можно выбирать другие коды цвета согласно значению счетчика итераций из интервала от 0 до максимального значения. Выбирая различные схемы цветово- го кодирования и различные участки комплексной плоскости, можно сгенерировать множество эффектных изображений для мест в окрестности фрактальной границы, которая охватывает несходящиеся точки. Один выбор цветового кодирования поло- жений пикселей в области вокруг множества Мандельброта показан на рис. 8.102, а.
700 Гпава 8. Представления трехмерных объектов Реализация преобразования (8.115) для отображения набора сходящихся точек и его границ представлена в следующей программе. Основная часть области сходимо- сти содержится в следующей области комплексной плоскости. —2,00 < Re(z) < 0,50 -1,20 < Im(z) < 1,20 Детали на границе множества Мандельброта можно исследовать, так выбирая по- следовательно уменьшающиеся прямоугольные области на комплексной плоскости, чтобы можно было увеличивать масштаб выбранных областей экрана. На рис. 8.102 показано цветное изображение фигуры вокруг области сходимости и ряд последова- тельно увеличенных изображений, иллюстрирующих некоторые интересные особен- ности данного преобразования возведения в квадрат. ♦include <GL/glut.h> /* Задается исходный размер окна на экране дисплея. */ GLsizei winWidth = 500, winHeight = 500; /* Задаются границы прямоугольной области на комплексной * плоскости. */ GLfloat xComplexMin = -2.00, xComplexMax = 0.50; GLfloat yComplexMin = -1.25, yComplexMax = 1.25; GLfloat complexwidth = xComplexMax - xComplexMin; GLfloat complexHeight = yComplexMax - yComplexMin; class complexNUm { public: GLfloat x, y; 1; struct color { GLfloat r, g, b; }; void init (void) ( /* Задается белый цвет окна на экране дисплея. */ glClearColor (1.0, 1.0, 1.0, 0.0); } void plotPoint (complexNum z) { glBegin (GL_POINTS); glVertex2f (z.x, z.y); glEnd ( ); }
8.23. Методы фрактальной геометрии 701 /* Вычисляется квадрат комплексного числа. */ complexNum complexsquare (complexNum z) { complexNum zSquare; zSquare.x = z.x * z.x - z.y * z.y; zSquare. у = 2 * z.x * z.y; return zSquare; } GLint mandelSqTransf (complexNum zO, GLint maxlter) { complexNum z " zO; GLint count = 0; /* Выход, если z * z > 4. */ while ((z.x * z.x + z.y * z.y <= 4.0) && (count < maxlter)) { z = complexsquare (z); z.x += zO.x; z.y += zO.y; count++; } return count; } void mandelbrot (GLint nx, GLint ny, GLint maxlter) { complexNum z, zlncr; color ptColor; GLint iterCount; zlncr.x = complexwidth I GLfloat (nx); zlncr.у = complexHeight / GLfloat (ny); for (z.x = xComplexMin; z.x < xComplexMax; z.x += zlncr.x) for (z.y = yComplexMin; z.y < yComplexMax; z.y += zlncr.y) { iterCount = mandelSqTransf (z, maxlter); if (iterCount >= maxlter) /* Цвет точек выбирается черным. */ ptColor.r = ptColor.g = ptColor.b = 0.0; else if (iterCount > (maxlter / 8)) { /* Цвет точек выбирается оранжевым. */ ptColor.r = 1.0; ptColor.g = 0.5; ptColor.b = 0.0; }
702 Гпава 8. Представления трехмерных объектов else if (iterCount > (maxlter /10)) { /* Цвет точек выбирается красным. */ ptColor.r = 1.0; ptColor.g = ptColor.b = 0.0; } else if (iterCount > (maxlter /20)) { /* Цвет точек выбирается темно-синим. */ ptColor.b = 0.5; ptColor.r = ptColor.g = 0.0; } else if (iterCount > (maxlter / 40)) { /* Цвет точек выбирается желтым. */ ptColor.r = ptColor.g = 1.0; ptColor.b = 0.0; } else if (iterCount > (maxlter / 100)) { /* Цвет точек выбирается темно-зеленым. */ ptColor.r = ptColor.b = 0.0; ptColor.g = 0.3; } else ( /* Цвет точек выбирается голубым. */ ptColor.r = 0.0; ptColor.g = ptColor.b = 1.0; } /* Изображается цветная точка. */ glColor3f (ptColor.r, ptColor.g, ptColor.b); plotPoint (z); } void displayFcn (void) { /* Задается число делений по x и у и максимальное * число итераций. */ GLint пх = 1000, пу = 1000, maxlter = 1000; glClear (GL_COLOR_BUFFER_BIT); /* Очищается окно на экране дисплея. */ mandelbrot (пх, пу, maxlter); glFlush ( );
8.23. Методы фрактальной геометрии 703 void winReshapeFcn (GLint newWidth, GLint newHeight) { /* Характеристическое отношение равно 1, * предполагается, что complexwidth = complexHeight. */ glViewport (0, 0, newHeight, newHeight); glMatrixMode (GL_PROJECTION); glLoadldentity ( ); gluOrtho2D (xComplexMin, xComplexMax, yComplexMin, yComplexMax); glClear (GL_COLOR_BUFFER_BIT); } void main (int argc, char** argv) { glutlnit (&argc, argv); glutlnitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutlnitWindowPosition (50, 50); glutlnitWindowSize (winWidth, winHeight); glutCreateWindow ("Множество Мандельброта"); init ( ) ; glutDisplayFunc (displayFcn); glutReshapeFunc (winReshapeFcn); glutMainLoop ( ); } Преобразования комплексных функций, подобные тому, что представлено в урав- нении (8.111), можно расширить так, чтобы они давали фрактальные поверхности и фрактальные тела. Методы генерации таких объектов используют кватернионные представления (приложение А) для преобразования точек в трех- и четырехмерном пространстве. Кватернион имеет четыре компонента, один действительный и три мнимых. Кватернион можно представить в следующей форме, как расширение кон- цепции числа на комплексной плоскости: q = s + ia + jb + kc, (8.116) где г2 = j2 — k2 = — 1. Действительный компонент s также называется скалярной частью кватерниона, а мнимые компоненты называются векторной частью кватер- ниона v = (а, Ь, с). Используя правила умножения и сложения кватернионов, рассмотренные в прило- жении А, функции многократного возведения в квадрат и другие итеративные методы можно применить к генерации поверхностей фрактальных объектов. Стандартной яв- ляется процедура проверки точек комплексного пространства, пока не определится граница между сходящейся и несходящейся группами точек. Например, если вначале определить положение несходящихся (внутренних) точек, затем с помощью проверки соседних точек находятся расходящиеся (внешние) точки. Затем предыдущая внут-
704 Гпава 8. Представления трехмерных объектов Рис. 8.103. Трехмерные проекции четырехмерных фракталов, сгенерированных кватернионной функ- цией многократного возведения в квадрат /(q) = А</(1 — д') с использованием: а) А = 1,475 + 0,9061г; б) А = —0,57 + г (перепечатано с разрешения Алана Нортона, IBM Research) Рис. 8.104. Трехмерная проекция четырех- мерного объекта, сгенерированного кватер- нионной функцией многократного возведе- ния в квадрат f(g) = q2 — 1 (перепечатано с разрешения Алана Нортона, IBM Research) ренняя точка вычисляется как точка граничной поверхности. После этого проверяют- ся соседи этой точки поверхности, и делятся на внутренние (сходящиеся) и внешние (расходящиеся). Любая внутренняя точка, которая соседствует с внешней точкой, принадлежит поверхности. Подобным образом процедура проходит по фрактальной границе, не удаляясь от поверхности. При генерации четырехмерных фракталов трех- мерные сечения проектируются на двухмерную поверхность монитора. Процедуры генерации фракталов с многократным возведением в квадрат в четы- рехмерном пространстве требуют значительного времени для вычисления итераци- онной функции и проверки точек на сходимость. Каждую точку поверхности можно представить маленьким кубом, обозначающим внутренние и внешние границы по- верхности. Выход подобных программ для трехмерных проекций фрактала обычно содержит более миллиона вершин таких кубов. При отображении фрактального объ- екта применяются модели освещения, с помощью которых определяется цвет каждого куба поверхности. Также применяются методы детектирования видимых поверхно- стей, поэтому отображаются только видимые поверхности объекта. На рис. 8.103 и 8.104 приведены примеры трехмерных проекций четырехмерных фракталов, полу- ченных многократным возведением в квадрат.
8.23. Методы фрактальной геометрии 705 Рис. 8.105. Инверсия точки Р в точку Р' внутри окружности радиуса г САМООБРАТНЫЕ ФРАКТАЛЫ Для создания фрактальных форм можно использовать различные геометрические преобразования инверсии. Как и ранее, вначале берется исходный набор точек, а затем многократно применяются нелинейные операции инверсии для преобразования исходных точек в фрактал. В качестве примера рассмотрим двухмерное преобразование инверсии относи- тельно окружности радиуса г с центром в точке Рс = [хс, ус). Точка Р вне окружно- сти инвертируется в точку Р' внутри окружности (рис. 8.105) с помощью преобразо- вания (РДЧ(РД^) = г2, (8.117) где Р и Р' лежат на прямой линии, проходящей через центр окружности Рс. Можно также использовать уравнение (8.117) для преобразования точек внутри окружности. Некоторые внутренние точки переходят во внешние, а некоторые — во внутренние. Если координаты двух точек обозначить Р = (х,у) и Р' = (х',у'), уравне- ние (8.117) можно записать следующим образом: [(ж - хсу + {у - ус)2]1/2[(гг' - хс)2 + (у' - ус)2]1/2 = г2. Кроме того, поскольку две точки лежат на прямой, проходящей через центр окруж- ности, можно записать (у — у^)/{х — хс) = [у' — ус)/(х' - хс). Следовательно, координаты преобразованной точки Р' равны х' = х +_____А*-А_________ , +______Ау - Ус)______ [х - Хс)2 + (у - Ус)2 ’ {X - Хс)2 + (у - Ус)2 Итак, точки вне окружности отображаются в точки внутри окружности, а бесконечно удаленные точки (±оо) переходят в центр окружности. И наоборот, точки вблизи центра окружности отображаются в удаленные точки вне окружности. При удале- нии от центра окружности точки отображаются во внешние положения, близкие к
706 Глава 8. Представления трехмерных объектов Рис. 8.106. Инверсия окружности, которая не проходит через центр ба- зовой окружности периметру. Внутренние точки, близкие к периметру, переходят во внутренние точки, близкие к центру окружности. Например, внешние значения х из диапазона от г до +оо отображаются в значения х' из диапазона от до 0 (здесь и далее считается, что центр окружности совпадает с началом координат, (жс, ус) = (0,0)). Внутренние значения х из диапазона от до 0 отображаются в значения х' от г до +оо, а внут- ренние значения х из диапазона от до г переходят в значения из диапазона от г до . Подобные результаты получаются для отрицательных значений х. Описанное преобразование можно применять к таким различным объектам, как прямые линии, окружности или эллипсы. Прямая линия, проходящая через центр окружности, инвариантна относительно инверсии: она отображается сама в себя. Однако прямая линия, которая не проходит через центр окружности, преобразуется в окружность, периметр которой содержит центральную точку Рс. Наконец, любая окружность, которая проходит через центр базовой окружности, при инверсии пере- ходит в прямую линию, не проходящую через центр окружности. Если окружность не пересекает центр базовой окружности, она переходит в другую окружность, как по- казано на рис. 8.106. Другим инвариантом относительно инверсии является преобра- зование окружности, ортогональной базовой окружности, т.е. такой, что касательные двух окружностей перпендикулярны в точках пересечения. Чтобы с помощью описанного преобразования инверсии получать различные фрактальные формы, нужно начать с набора окружностей и многократно применить преобразование инверсии, используя различные базовые окружности. Аналогично инверсию окружностей можно выполнять относительно набора прямых линий. По- хожие методы инверсии можно разработать и для других двухмерных форм. Кроме того, можно обобщить данную процедуру на сферы или другие трехмерные объекты. Рис. 8.107. Четыре прави- ла геометрической подста- новки для деления и измене- ния формы равностороннего треугольника Правило 1 Правило 2 /\ Правило 3 Правило 4
8.24. Гоамматики форм и другие процедурные методы 707 8.24. ГРАММАТИКИ ФОРМ И ДРУГИЕ ПРОЦЕДУРНЫЕ МЕТОДЫ Разработано множество других процедурных методов проектирования форм объек- тов или уровней детализации поверхности. Грамматикой форм называется набор правил производства (продукций), которые можно применить к исходным объектам для повышения детализации, не нарушая гармонии исходной формы. Можно приме- нять преобразования для чередования геометрии (формы) объекта или использовать правила преобразования для добавления деталей к цветовой палитре или текстуре поверхности. Имея данный набор продукций, разработчик форм может экспериментировать, на каждом этапе применяя различные правила преобразования данного исходного объекта в конечную структуру. На рис. 8.107 показано четыре правила геометриче- ской подстановки для изменения треугольных форм. Геометрические преобразова- ния, соответствующие данным правилам, можно выразить алгоритмически на основе входного изображения, нарисованного редактором продукций. Следовательно, каж- дую продукцию можно описать графически, указав исходную и конечную формы. Для реализации продукций можно использовать пакет Mathematica или какой-нибудь язык программирования с графическими возможностями. Применение геометрических подстановок, указанных на рис. 8.107, иллюстриру- ется на рис. 8.108, где фигура на рис. 8.108, г получена из исходного треугольника, Рис. 8.108. Равносторонний треугольник (панель а) преоб- разуется в (панель б) с исполь- зованием правил подстановки 1 и 2, указанных на рис. 8.107. Затем используется правило 3, и форма (панель б) переходит в форму (панель в), которая, в свою очередь, становится формой (панель г) с помощью правила 4 (перепечатано с разрешения Эндрю Гласснера (Andrew Glassner), Xerox PARC (Palo Alto Research Center — Исследовательский центр в Пало-Альто). © 1992)
708 Глава 8. Представления трехмерных объектов Рис. 8.109. Форма, созданная с помощью правил геометриче- ской подстановки (изменения треугольных форм) (перепеча- тано с разрешения Эндрю Гласснера, Xerox PARC. © 1992) Рис. 8.110. Форма, созданная с помощью правил геометриче- ской подстановки для призм. В качестве исходной формы ис- пользовалась змейка Рубика (перепечатано с разрешения Энд- рю Гласснера, Xerox PARC. © 1992) показанного на рис. 8.108, а, с помощью последовательного применения четырех пра- вил. На рис. 8.109 показана другая форма, созданная с помощью правил подстановки треугольников. Трехмерные формы и детали поверхности преобразовываются с помощью похо- жих операций. На рис. 8.110 показан результат геометрических подстановок, при- мененных к многограннику. В качестве исходной формы при построении объектов, показанных на рис. 8.111, использовался икосаэдр (многогранник с 20 гранями). Гео- метрические подстановки применялись к плоским гранями икосаэдра, а полученные вершины многоугольников проектировались на поверхность описанной сферы. Другой набор продукций для описания форм объектов называется L- грамматиками или графталами (graftal). Данные правила обычно используются для генерации изображений растений. Например, топологию дерева можно описать ство- лом с присоединенными ветвями и листьями. Затем дерево можно смоделировать с помощью правил, обеспечив соединение ветвей и листьев с отдельными ветвями. Затем дается геометрическое описание, для чего структуры объекта размещаются в определенных точках. На рис. 8.112 изображена сцена, содержащая различные кусты и деревья, постро- енная с помощью коммерческого пакета генерации растений. В данном пакете для генерации форм растений используются законы ботаники.
8.24. Гоамматики форм и другие процедурные методы 709 Рис. 8.111. Формы, созданные на поверхности сферы с использованием правил подстановки треугольников на гранях икосаэдра с последующим проектировани- ем результата на поверхность сферы (перепечатано с разрешения Эндрю Гласснера. Xerox PARC. © 1992) Рис. 8.112. Реалистичная сцена, полученная с помощью пакета TDI-AMAP, который позволяет гене- рировать более 100 разновидностей растений и деревьев с использованием процедур, основанных на законах ботаники (перепечатано с разрешения Thomson Digital Image)
710 Глава 8. Представления трехмерных объектов 8.25. СИСТЕМЫ МНОГИХ ЧАСТИЦ В некоторых приложениях часто полезно описать один или несколько объектов с ис- пользованием набора несоединенных частей, называемых системой многих частиц (многочастичной системой). Данный подход можно использовать для описания объек- тов с определенной текучестью, которые меняются со временем из-за течения, схода лавины, разбрызгивания, расширения или взрыва. Объектами с такими характери- стиками являются облака, дым, огонь, фейерверки, водопады и распылители воды. Системы многих частиц используются, например, для моделирования взрывов планет и распространения стены огня из-за “изначальных бомб” в фильме Звездный путь-2: гнев хана. Кроме того, методы систем многих частиц используются для моделирова- ния других типов объектов, включая заросли травы. В типичном приложении система частиц определяется в некоторой области про- странства, а затем применяются случайные процессы, чтобы варьировать параметры системы во времени. Данные параметры системы включают траекторию движения от- дельных частиц, а также их цвет и форму. В некоторый случайно выбранный момент времени каждая частица удаляется. Формы частиц можно описать маленькими сферами, эллипсоидами или паралле- лепипедами, которые случайно меняются со временем. Кроме того, можно случайно выбирать прозрачность, цвет и движение частиц. Траектории движения частиц можно описать кинематически или определить с помощью сил (например, гравитации). Траектория движения каждой частицы изображается определенным цветом. На- пример, узор фейерверка можно отобразить, случайным образом генерируя частицы в сферической области пространства и позволяя им радиально удаляться от центра сферы, как показано на рис. 8.113. Траектории частиц могут кодироваться цветом, например, от красного к желтому для имитации температуры взрывающихся частиц. Реалистичные изображения зарослей травы также можно смоделировать “траектори- ей частиц” (рис. 8.114), которые “выстреливаются” из земли и падают на нее из-за гравитации. В этом случае траектории частиц могут начинаться в коническом цилин- дре и кодироваться цветом от зеленого до желтого. На рис. 8.115 показано, как с помощью системы многих частиц моделируется водопад. Частицы воды падают с фиксированной высоты, отклоняются препятстви- ем, а затем разбрызгиваются с земли. Чтобы различать траектории частиц на разных этапах, используется несколько цветов. Пример имитации разрушения объекта приве- ден на рис. 8.116. Объект слева распадается на набор частиц, показанных справа. На рис. 8.117 приведена сложная сцена, сформированная с помощью нескольких пред- ставлений: трава, полученная с использованием систем многих частиц, фрактальные горы, также применялось наложение текстуры и другие процедуры визуализации поверхностей.
8.25. Системы многих частиц 711 Рис. 8.113. Моделирование фейерверка как системы многих частиц, которые ра- диально удаляются от центра сферы Рис. 8.114. Моделирование зарослей травы части- цами, выстреливаемыми вверх в коническом ци- линдре. Траектории частиц являются параболиче- скими из-за направленной вниз силы тяжести Рис. 8.115. Моделирование пове- дения водопада, падающего на ка- мень (окружность). Капли воды от- клоняются камнем, а затем отска- кивают от земли (перепечатано с разрешения М. Брукса (М. Brooks) и Т. Л. Дж. Говарда (Т. L. J. Howard), факультет информатики, Манче- стерский университет)
712 Глава 8. Представления трехмерных объектов Рис. 8.116. Объект, распадающийся на облако ча- стиц (перепечатано с разрешения Autodesk, Inc.) Рис. 8.117. Сцена Road to Point Reyes, на которой изображены трава (система многих частиц), горы (фракталы) и поверхности с наложенной текстурой (перепечатано с разрешения Pixar. © 1983)
8.26. Физическое моделирование 713 Рис. 8.118. Двухмерная пружинная сеть, построенная из пружин оди- наковой жесткости к Рис. 8.119. Внешняя сила Fx, действующая на один конец пружины, другой конец которой жестко закреплен 8.26. ФИЗИЧЕСКОЕ МОДЕЛИРОВАНИЕ Такой нежесткий объект, как веревка, ткань или мягкий резиновый мяч, можно пред- ставить методами физического моделирования, которые описывают поведение объекта через взаимодействие внешних и внутренних сил. Чтобы, например, точно описать форму махрового полотенца, наброшенного на спинку стула, нужно рассмотреть вли- яние стула на петли ткани и взаимодействие нитей ткани. Общим методом моделирования нежестких объектов является аппроксимация объекта сетью точечных узлов, соединенных гибкими связями. Одним простым со- единительным звеном является пружина. На рис. 8.118 показан участок двухмерной пружинной сети, которую можно использовать для аппроксимации поведения мах- рового полотенца. Подобные пружинные сети можно задавать и в трех измерениях, чтобы моделировать резиновый мяч или кусок желе. Для моделирования однородно- го объекта можно использовать идентичные пружины по всей сети. Если требуется, чтобы объект имел разные свойства в разных направлениях, можно использовать пружины с разными свойствами. Когда на пружинную сеть действует внешняя сила, величина растяжения или сжатия отдельных пружин зависит от заданных значений жесткости пружины к. Горизонтальное смещение х положения узла под влиянием силы Fx иллюстри- руется на рис. 8.119. Если пружина не слишком натянута, величину смещения х от положения равновесия можно близко аппроксимировать законом Гука'. Fs — —Fx = — kx, (8.119)
714 Глава 8. Представления трехмерных объектов Рис. 8.120. Моделирование гибкого поведе- ния банановой кожуры с помощью пружин- ной сетки (перепечатано с разрешения Дэви- да Лейдло (David Laidlaw), Джона Снайдера (John Snyder), Адама Вудбэри (Adam Wood- bury) и Алана Барра (Alan Barr), Computer Graphics Lab, Калифорнийский технологиче- ский институт. © 1992) где Fs — равная по величине и противоположная по направлению сила сопротивления пружины. Данное соотношение справедливо и для горизонтального сжатия пружи- ны на величину х, также можно записать аналогичные формулы для смещений и компонентов силы в направлениях у и z. Если объекты абсолютно гибкие, они возвращаются к первоначальной конфигу- рации при снятии внешнего воздействия. Однако, если нужно смоделировать замазку или любой другой деформируемый материал, нужно модифицировать характеристи- ки пружины так, чтобы она не возвращалась в исходное состояние при исчезновении внешних сил. При этом объект можно деформировать каким-то другим способом с помощью другого набора приложенных сил. Связь узлов можно моделировать не только пружинами — чтобы определить фор- му объекта при воздействии внешних сил, используются эластичные материалы и минимизируется энергия деформации. Данный метод позволяет лучше смоделиро- вать одежду, а для описания поведения различных тканей разработаны разные функ- ции энергии. Чтобы смоделировать нежесткий объект, вначале задаются действующие на него внешние силы. Затем рассматривается распространение сил по сети, представляю- щей объект. Это дает систему уравнений, решение которой определяет смещение узлов сети. На рис. 8.120 показана кожура банана, смоделированная пружинной сетью, а сце- на на рис. 8.121 является примером моделирования тканей с использованием функций энергии, также на одну ткань на этом рисунке наложен текстурный узор. Подбирая параметры сети с использованием функций энергии, можно моделировать различ- ные типы тканей. На рис. 8.122 иллюстрируются модели хлопковых, шерстяных и полиэфирных материалов, наброшенных на стол. Методы физического моделирования также применяются в анимации для более точного описания траекторий движения. В прошлом в анимации часто использова-
8.27. Визуализация наборов данных 715 Рис. 8.121. Моделирование гибкого поведе- ния ткани, наброшенной на мебель, с ис- пользованием минимизации функции энер- гии (перепечатано с разрешения Джин Гре- гер (Gene Greger) и Дэвида Брина (David Breen), Design Research Center, Политехни- ческий институт Ренсселау. © 1992) Рис. 8.122. Моделирование характеристик различных тканей — а) хлопок; б) шерсть; в) кримплен - с использованием минимизации функции энергии. (Перепечатано с разрешения Дэвида Брина и Дональда Хауса (Donald House), Design Research Center, Политехнический институт Ренсселау. © 1992) лись сплайновые траектории и кинематика, а параметры движения основывались только на положении и скорости. Физическое моделирование описывает движение с помощью динамических уравнений, включающих силы и ускорения. Анимирован- ные представления, основанные на уравнениях динамики, дают более реалистичное давление, чем представления, основанные на уравнениях кинематики. 8.27. ВИЗУАЛИЗАЦИЯ НАБОРОВ ДАННЫХ Использование методов компьютерной графики в помощь научному и инженерному анализу называется научной визуализацией. Это включает в себя визуализацию на- боров данных и процессов, которые трудно или невозможно проанализировать без помощи графических методов. Например, визуализация необходима для интерпрета- ции выхода таких источников данных, как компьютерные мониторы, датчики спут- ников и космические корабли, радиотелескопы и медицинские сканеры. Миллионы
716 Глава 8. Представления трехмерных объектов Рис. 8.123. Финансовый трехмерный график, на котором показан потенциал роста акций во время краха фондовой биржи в октябре 1987 года. Красным обозначены большие прибыли, и из графика видно, что при крахе наиболее выгодны медленно растущие акции (перепечатано с раз- решения Энга-Киата Коха, Институт информационных технологий, Сингапур и Encentuate, Inc., Купертино, Ка- лифорния) информационных точек часто генерируются при численном решении задач компью- терного моделирования и получаются с приборов наблюдения. Тенденции и связи бывает трудно определить, просто просматривая необработанные данные. Визуали- зация полезна при анализе процессов, требующих большого периода времени или скрытых (например, квантово-механические явления и эффекты специальной теории относительности, порождаемые объектами, движущимися с околосветовыми скоро- стями). В научной визуализации методы компьютерной графики, обработки изоб- ражений, компьютерного зрения и других областей используются для визуального отображения, улучшения и обработки информации. Подобные методы, используемые в коммерческой, промышленной и других ненаучных областях, иногда называются бизнес-визу ализацией. Наборы данных классифицируются согласно их пространственному распределе- нию и типу данных. Значения двухмерных наборов данных распределены по поверх- ности, а значения трехмерных — по внутренней части куба, сферы или некоторой другой области пространства. Данные могут принадлежать к типу скалярных, век- торных, тензорных и многомерных. ВИЗУАЛЬНОЕ ПРЕДСТАВЛЕНИЕ СКАЛЯРНЫХ ПОЛЕЙ Скалярной называется величина, имеющая одно значение. Наборы скалярных данных содержат значения, которые могут быть распределены во времени и по пространству, кроме того, элементы данных могут также быть функциями других скалярных пара- метров. В качестве примеров физических скалярных величин можно привести энер- гию, плотность, массу, температуру, давление, электрический заряд, электрическое сопротивление, отражательную способность, частоту и содержание воды. Распространенным методом визуализации наборов скалярных данных является использование графиков или диаграмм, демонстрирующих распределение элементов данных как функции других параметров, таких как положение и время. Если данные распределены по поверхности, их элементы можно изобразить как вертикальные по- лоски, растущие с поверхности, или же можно другим способом интерполировать элементы данных в выбранных точках поверхности. Чтобы различать значения набо-
8.27. Визуализация наборов данных 717 Рис. 8.124. Правильная двухмерная сетка с элементами данных в местах пересечения линий сетки. Линии по координате х имеют по- стоянный шаг Дх, а по у сетка идет с постоянным шагом Ду, причем шаги по координатам х и у могут различаться Рис. 8.125. Траектория изолинии по пяти ячейкам сетки ра скалярных данных, также используют псевдоцветные методы. Методы цветового кодирования можно объединять с использованием графиков и диаграмм. Чтобы пред- ставить набор скалярных данных с цветовым кодированием, выбирается диапазон цветов, и диапазон элементов данных отображается в диапазон цветов. Например, синий цвет можно сопоставить с наименьшим скалярным значением, а красный — с наибольшим. На рис. 8.123 приведен пример трехмерного изображения с цветовым кодированием. Данные, представленные с цветовым кодированием, иногда требуют внимательного изучения, поскольку определенные комбинации цветов могут приве- сти к неверной интерпретации данных. Контурные графики (или графики в горизонталях) используются для изображе- ния изолиний (линий постоянного значения) набора скалярных данных, распределен- ных по поверхности. Изолинии размещены с некоторым постоянным интервалом и демонстрируют диапазон и изменение элементов данных в области пространства. Ти- пичной сферой применения контурных графиков является изображение возвышений над нулевой плоскостью. Обычно методы представления в горизонталях применяют- ся к набору элементов данных, распределенных по правильной сетке, как показано на рис. 8.124. Правильные сетки имеют равномерно расположенные координатные ли- нии сетки, а в узлах сетки расположены элементы данных. Численные решения ком- пьютерных модельных задач обычно дают данные, распределенные на правильной сетке, тогда как данные наблюдения часто расположены нерегулярно. Для различных типов нерегулярных сеток разработано несколько методов контурного представления, но обычно нерегулярные распределения данных просто переводятся на регулярные сетки. В двухмерном контурном алгоритме изолинии прослеживаются от ячейки к
718 Глава 8. Представления трехмерных объектов Рис. 8.126. Графики в горизонталях с цветовым кодированием трех наборов данных, занимаю- щих одну область плоскости ху (перепечатано с разрешения Национального центра суперкомпью- терных приложений, Иллинойский университет в Урбана-Шампейн) Рис. 8.127. Графики в горизонталях с цветовым кодированием на поверхности области пространства, имеющей форму огрызка яблока (перепечатано с разреше- ния Грега Нильсона (Greg Nielson), фа- культет информатики и инженерии. Уни- верситет Аризоны) ячейке сетки с проверкой четырех углов сетки, чтобы определить, какие стороны ячеек пересекаются определенной изолинией. Изолинии обычно изображаются как прямые отрезки вдоль каждой ячейки, как показано на рис. 8.125. Иногда изоли- нии изображаются с помощью сплайновых кривых, но аппроксимация сплайнами может привести к противоречиям и ложной интерпретации набора данных. Напри- мер, две сплайновые изолинии могут пересекаться, или криволинейные траектории изолиний могут не быть истинным показателем тенденций набора данных, поскольку элементы данных известны только в углах ячеек. Пакеты изображения в горизонталях могут позволять интерактивную подгонку изолиний для исправления противоречий. На рис. 8.126 приведен пример трех накладывающихся графиков в горизонталях с цветовым кодированием на плоскости ху, а на рис. 8.127 показаны горизонтали и цветовое кодирование пространства неправильной формы.
8.27. Визуализация наборов данных 719 Рис. 8.128. Поперечные сечения трехмерного набора данных (перепечатано с разрешения Spyglass, Inc.) Рис. 8.129. Изоповерхноеть, сгенерирован- ная по значениям содержания воды, полу- ченным из численной модели грозы (пере- печатано с разрешения Боба Вильгельмсона (Bob Wilhelmson), факультет атмосферных наук, и Национального центра суперкомпью- терных приложений, Иллинойский универси- тет в Урбана-Шампейн) Для трехмерных скалярных полей данных можно взять поперечные сечения и изобразить двухмерные распределения данных на сечениях. Можно либо исполь- зовать цветовое кодирование значений данных сечений, либо отобразить изолинии. Пакеты визуализации обычно предлагают процедуру сечения, которая позволяет рас- полагать плоскость поперечного сечения под любым углом к объекту. На рис. 8.128 показано изображение, сгенерированное коммерческим пакетом нахождения сечений. Вместо поиска двухмерных поперечных сечений, можно изобразить одну или несколько изоповерхностей, представляющих собой просто трехмерные графики в го- ризонталях (рис. 8.129). При отображении двух накладывающихся изоповерхностей внешняя поверхность делается прозрачной, чтобы можно было видеть форму обе- их изоповерхностей. Построение изоповерхности подобно изображению изолиний, только в этом случае есть трехмерные ячейки сетки, и нужно проверять элементы данных в восьми углах ячейки, чтобы определить положение участков изоповерх- ности. На рис. 8.130 приведено несколько примеров пересечений изоповерхностей с ячейками сетки. Изоповерхности обычно моделируются с помощью треугольных се- ток, затем для отображения конечной формы применяются алгоритмы визуализации поверхностей.
720 Глава 8. Представления трехмерных объектов Рис. 8.130. Пересечение изоповерхностей с ячейками сетки, смоделированное треугольными участками Рис. 8.131. Объемная визуали- зация правильной декартовой сетки данных с использовани- ем расчета луча для изучения внутренних значений данных Плоскость пикселя Рис. 8.132. Объемная визуализация набора данных, представляющего сердце собаки, по- лученная цветным изображением для каждо- го пикселя расстояния до максимального зна- чения векселя (перепечатано с разрешения Патрика Моргана (Patrick Moran) и Клинто- на Поттера (Clinton Potter), Национальный центр суперкомпьютерных приложений. Ил- линойский университет в Урбана-Шампейн) j jn^ie t ;; ь/////// ; О М> 100 14 200 ’$•! 100 J5O I' Другим методом визуализации трехмерного набора данных является объемная визуализация, которая иногда дает изображения, похожие на рентгеновские снимки. Внутренняя информация о наборе данных проектируется на экран с использованием методов расчета луча, описанных в разделе 8.20. Вдоль траектории луча от каж- дого пикселя экрана (рис. 8.131) элементы данных исследуются и кодируются для отображения. Часто элементы данных в точках сетки усредняются, так что для каж- дого вокселя пространства данных хранится одно значение. Как кодируются данные
8.27. Визуализация наборов данных 721 Рис. 8.133. Представление стрелочками векторного поля с изображенными по- перечными сечениями (перепечатано с разрешения Национального центра супер- компьютерных приложений, Иллинойский университет в Урбана-Шампейн} для отображения — зависит от приложения. Сейсмические данные, например, часто исследуются на максимум и минимум вдоль каждого луча. Затем значения можно представить с цветовым кодированием, чтобы отобразить информацию о ширине ин- тервала и минимальном значении. В медицинских приложениях элементами данных являются коэффициенты непрозрачности из диапазона от 0 (ткани) до 1 (кости). Ко- сти полностью непрозрачные, тогда как ткани в какой-то степени прозрачны (слабая непрозрачность). Вдоль каждого луча суммируются коэффициенты непрозрачности, пока сумма не станет больше или равной 1, или пока луч не выйдет за последний элемент трехмерной сетки данных. Накопленное значение непрозрачности затем ко- дируется и отображается как цветной пиксель или как полутоновое значение. На рис. 8.132 показана объемная визуализация медицинского набора данных, описыва- ющего структуру сердца собаки. В данной объемной визуализации с цветовым ко- дированием изображен график расстояния до максимального значения вокселя вдоль каждого луча пикселя. ВИЗУАЛЬНОЕ ПРЕДСТАВЛЕНИЕ ВЕКТОРНЫХ ПОЛЕЙ Векторная величина V в трехмерном пространстве имеет три скалярных значения (14, К/) Vz), по одному на каждое координатное направление, а двухмерный вектор имеет два компонента (Vx,Vy). Другой способ описания векторной величины — за- дать ее модуль | V| и ее направление как единичный вектор и. Векторные величины, как и скалярные, могут быть функциями положения, времени и других парамет- ров. В качестве примеров физических векторных величин можно привести скорость, ускорение, силу, электрический ток, а также электрические, магнитные и гравитаци- онные поля.
722 Глава 8. Представления трехмерных объектов Рис. 8.134. Представление набора векторных дан- ных силовыми линиями Рис. 8.135. Визуализация воздушного потока вокруг цилиндра с полусферической крыш- кой, немного наклоненной относительно на- правления поступающего потока воздуха (перепечатано с разрешения М. Джеральд- Ямасаки (М. Gerald-Yamasaki), Дж. Хьюилт- квиста (J. Huiltquist) и Сэма Юзлтона (Sam Uselton), NASA Ames Research Center) Чтобы визуализировать векторное поле, можно, например, изобразить все ин- формационные точки в виде маленьких стрелок, указывающих направление и модуль вектора. Данный метод чаще всего дополняется изображением поперечных сечений, как показано на рис. 8.133, поскольку тенденции данных трудно увидеть в трех- мерной области, заполненной накладывающимися стрелочками. Модули векторных значений можно представить, варьируя длины стрелочек, или же можно изобразить одним цветом стрелочки одинакового размера. Векторные значения можно также представить, изобразив силовые линии, или линии потока векторного поля. Силовые линии широко используются для изображе- ния электрических, магнитных и гравитационных полей. Модуль векторных значений обозначается расстоянием между силовыми линиями, а направление поля представ- ляется касательными силовых линий, как показано на рис. 8.134. Пример графика векторного поля в линиях потока показан на рис. 8.135. Линии потока можно изоб- ражать широкими стрелками, особенно при наличии вихревых эффектов. Соответ- ствующий пример приведен на рис. 8.136, где изображены вихревые потоки внутри грозы. Если требуется анимировать поток жидкости, поведение векторного поля мож- но визуализировать, отследив частицы по направлению потока. Пример визуализации векторного поля с использованием линий потока и частиц приведен на рис. 8.137.
8.27. Визуализация наборов данных 723 Рис. 8.136. Заверяющийся поток воздуха, визуализированный с широкими линиями по- тока внутри прозрачного изоповерхностного графика грома (перепечатано с разрешения Боба Вильгельмсона, факультет атмосфер- ных наук, и Национального центра суперком- пьютерных приложений, Иллинойский уни- верситет в Урбана-Шампейн) Рис. 8.137. Схема потока воздуха, визуали- зированная с использованием линий потока и движения частиц внутри прозрачного изо- поверхностного графика грозы. Поднимаю- щиеся вверх сферические частицы изобра- жены оранжевым, падающие — синим (пере- печатано с разрешения Боба Вильгельмсо- на, факультет атмосферных наук, и Нацио- нального центра суперкомпьютерных прило- жений, Иллинойский университет в Урбана- Шампейн) Иногда отображаются только модули векторных величин. Часто так поступают, когда в одной точке нужно отобразить несколько величин, либо когда направления незначительно меняются в области пространства, либо если векторные направления не так важны. ВИЗУАЛЬНОЕ ПРЕДСТАВЛЕНИЕ ТЕНЗОРНЫХ ПОЛЕЙ Тензорная величина в трехмерном пространстве имеет девять компонентов, и ее мож- но представить матрицей 3 на 3. В действительности данное представление использу- ется для тензора второго порядка, а в некоторых приложениях встречаются тензоры более высоких порядков, особенно в задачах общей теории относительности. В каче- стве примеров физических тензоров второго порядка можно привести напряжение и деформацию в материале под воздействием внешних сил, проводимость (или сопро-
724 Глава 8. Представления трехмерных объектов Рис. 8.138. Представление тензоров на- пряжения и деформации эллиптическим диском и стрелкой над поверхностью де- формируемого материала (перепечатано с разрешения Боба Хабера (Bob Haber), Национальный центр суперкомпьютер- ных приложений, Иллинойский универси- тет в Урбана-Шампейн) тивление) электрического проводника, и метрический тензор, описывающий свой- ства определенного координатного пространства. Тензор напряжения, например, в декартовых координатах можно представить следующим образом: <^Х &ху &xz &УХ ву &ZX azy (8.120) Тензорные величины часто встречаются в анизотропных материалах, которые имеют разные свойства в различных направлениях. Элементы х, ху и xz тензора проводимо- сти, например, описывают вклады компонентов электрического поля в направлениях х, у и z в ток в направлении х. Обычно физические тензорные величины симметрич- ные, и тензор имеет только шесть различных значений. Например, компоненты ху и ух тензора напряжения имеют одинаковые значения. Схемы визуализации, позволяющие представить все шесть компонентов симмет- ричной тензорной величины второго порядка, основаны на разработке форм, име- ющих шесть параметров. Одно такое графическое представление тензора показано на рис. 8.138. Три диагональных элемента тензора используются для отображения модуля и направления стрелочки, а три недиагональных элемента применяются для задания формы и цвета эллиптического диска. Вместо того, чтобы пытаться визуализировать все шесть компонентов симметрич- ной тензорной величины, можно свести тензор до вектора или скаляра. Используя векторное представление, можно просто отобразить значения диагональных элемен- тов тензора. Кроме того, применяя операции сжатия тензора, можно получить ска- лярное представление. Например, тензоры напряжения и деформации можно сжать до скалярной плотности энергии деформации, изображенной точками в материале, подверженном внешнему воздействию (рис. 8.139).
8.27. Визуализация наборов данных 725 Рис. 8.139. Представление тензоров напря- жения и деформации графиком плотности энергии деформации на схеме распростра- нения трещины на поверхности деформи- руемого материала (перепечатано с разре- шения Боба Хабера, Национальный центр суперкомпьютерных приложений, Иллиной- ский университет в Урбана-Шампейн) Рис. 8.140. Один кадр из анимированной визуализации нестационарного многомер- ного поля данных с использованием гли- фов. Клинообразная часть глифа указы- вает направление векторной величины в каждой точке (перепечатано с разреше- ния Национального центра суперкомпью- терных приложений. Иллинойский уни- верситет в Урбана-Шампейн) ВИЗУАЛЬНОЕ ПРЕДСТАВЛЕНИЕ МНОГОМЕРНЫХ ПОЛЕЙ ДАННЫХ В некоторых приложениях может потребоваться представить несколько элементов данных в каждой точке сетки некоторой области пространства. Такие данные часто содержат смесь скалярных, векторных и тензорных значений. В качестве примера приведем данные о потоке жидкости, которые включают скорость потока, темпера- туру и плотность в каждой трехмерной точке. Следовательно, в каждой точке нужно отобразить пять скалярных величин. Задача похожа на изображение тензорного поля. Метод изображения многомерных полей данных заключается в построении гра- фических объектов, иногда называемых глифами (glyph), которые имеют несколько частей. Каждая часть глифа представляет конкретную физическую величину. Размер и цвет каждой части можно использовать для отображения информации о скаляр- ных величинах. Чтобы указать направленную информацию векторного поля, можно использовать клин, конус или любой другой указатель — часть глифа, представля- ющую вектор. Пример визуализации многомерного поля данных с использованием структуры-глифа в выбранных точках сетки приведен на рис. 8.140.
726 Глава 8. Представления трехмерных объектов 8.28. РЕЗЮМЕ Для моделирования множества объектов и материалов, которые может потребоваться изобразить на компьютерной сцене, разработан ряд представлений. В большинстве случаев трехмерное представление объекта визуализируется программным пакетом как стандартный графический объект, поверхности которого изображаются как мно- гоугольная сетка. Функции отображения таких распространенных поверхностей второго порядка, как сферы и эллипсоиды, часто встроены в графические пакеты. Расширения по- верхностей второго порядка (квадрик), называемые суперквадриками, предлагают дополнительные параметры для создания множества форм объектов. Для описания нежестких, гибких криволинейных поверхностей можно использовать каплевидные объекты для создания форм как комбинаций гауссовых “шишечек”. Наиболее широко используемыми методами в приложениях автоматизированного проектирования являются представления через сплайны — кусочно-непрерывные по- линомиальные функции. Сплайновая кривая или поверхность определяется набором контрольных точек и граничными условиями на стыках сплайнов. Линии, соеди- няющие последовательность контрольных точек, формируют контрольный граф, и все контрольные точки находятся внутри выпуклой оболочки сплайнового объекта. Граничные условия можно задать, используя параметрические или геометрические производные, и в большинстве сплайновых представлений используются парамет- рические граничные условия. В отличие от аппроксимирующих интерполирующие сплайны соединяют все контрольные точки. Сплайновую поверхность можно описать как декартово произведение двух полиномов. В интерполирующем представлении (эрмитовы, фундаментальные и сплайны Коханека-Бартелса) широко используются кубические полиномы. Сплайны Безье дают простой и мощный метод аппроксимации для описания кривых линий и поверхностей, однако степень полинома здесь опреде- ляется числом контрольных точек, кроме того, сложно реализовать локальный кон- троль за формой кривой. Би-сплайны, частным случаем которых являются сплайны Безье, служат более функциональным аппроксимирующим представлением, но они требуют задания вектора узлов. Бета-сплайны являются обобщением би-сплайнов, заданным с геометрическими граничными условиями. Кроме того, есть рациональ- ные сплайны — отношение двух сплайновых представлений. Рациональные сплайны можно использовать для описания поверхностей второго порядка, и они инвариантны относительно перспективного проектирования. Рациональные би-сплайны с неравно- мерным вектором узлов обычно называются NURBS (non-uniform, rational B-spline). Чтобы определить координаты точек на сплайновой кривой или поверхности, можно использовать правые разности или методы деления.
8.28. Резюме 727 В число других методов проектирования входит заметающее представление, ме- тоды конструктивной стереометрии, методы октодеревьев и BSP-деревьев. Заметаю- щее представление формируется трансляцией или вращением двухмерной формы в области пространства. Методы конструктивной стереометрии объединяют несколько трехмерных форм с использованием операций над множествами: логического сложе- ния, вычитания и пересечения. В методах октодеревьев и BSP-деревьев используются методы деления пространства. Представления фрактальной геометрии дают очень эффективные методы описа- ния природных явлений. Эти методы можно использовать для моделирования ланд- шафта, деревьев, кустов, воды и облаков и генерации необычных графических узоров. Фрактальный объект можно описать с помощью процедуры построения и фракталь- ной размерности. Процедуры построения фракталов включают геометрические по- строения, методы смещения средней точки, операции многократного возведения в квадрат в комплексном пространстве и преобразования инверсии. Другими проце- дурными методами построения представлений объектов с использованием правил преобразования являются грамматики форм и графталы. Такие текучие объекты, как облака, дым, огонь, вода и взрывающиеся вещи, можно смоделировать системой многих частиц. С помощью данного представления объект описывается набором частиц и правилами, управляющими движением частиц. Методы физического моделирования можно использовать для описания характе- ристик таких гибких объектов, как веревка, резина или ткань. Данная схема пред- ставляет материал сеткой пружиноподобных участков и вычисляет деформации с использованием сил, действующих на объект. Техники визуализации используют методы компьютерной графики для анализа наборов данных, которые могут включать скалярные, векторные и тензорные значе- ния в различных комбинациях. Данные могут представлять с использованием цвето- вого кодирования или отображения объектов различной формы. Многоугольные грани поверхности стандартного графического объекта можно задать в OpenGL, используя функции многоугольных, треугольных или четырехуголь- ных примитивов. Кроме того, существуют процедуры GLUT для отображения пяти правильных многогранников. Сферы, конусы и другие объекты с поверхностями вто- рого порядка можно отобразить с помощью функций GLUT и GLU, также существует процедура GLUT для генерации заварочного чайника с кубическими поверхностями. Корневая библиотека OpenGL содержит функции создания сплайнов Безье, а функции GLU подходят для задания би-сплайнов и обрезающих кривых сплайновых поверхно- стей. Многоугольные, квадратические, кубические и сплайновые функции OpenGL, рассмотренные в данной главе, сведены в табл. 8.1-8.4.
728 Глава 8. Представления трехмерных объектов ТАБЛИЦА 8.1. Резюме по функциям многогранников в OpenGL Функция Описание glutWireTetrahedron Отображает каркасную треугольную пирамиду (тет- раэдр) glutSolidTetrahedron Отображает тетраэдр с затененными поверхностями glutWireCube Отображает каркасный куб glutSolidCube Отображает куб с затененными поверхностями glutWireOctahedron Отображает каркасный октаэдр glutSolidOctahedron Отображает октаэдр с затененными поверхностями glutWireDodecahedron Отображает каркасный додекаэдр glutSolidDodecahedron Отображает додекаэдр с затененными поверхностями glutWirelcosahedron Отображает каркасный икосаэдр glutSolidlcosahedron Отображает икосаэдр с затененными поверхностями ТАБЛИЦА 8.2. Резюме пс OpenGL > функциям поверхностей второго и третьего порядка в Функция Описание glutWireSphere glutSolidSphere glutWireCone glutSolidCone glutWireTorus glutSolidTorus glutWireTeapot glutSolidTeapot gluNewQuadric gluQuadricDrawStyle gluSphere Отображает каркасную сферу GLUT Отображает сферу GLUT с затененными поверхностями Отображает каркасный конус GLUT Отображает конус GLUT с затененными поверхностями Отображает каркасный тор GLUT с круговым попереч- ным сечением Отображает тор GLUT с круговым поперечным сечением с затененными поверхностями Отображает каркасный чайник GLUT Отображает чайник GLUT с затененными поверхностями Активизирует процедуру квадратичной визуализации GLU объекта, имя которого было определено в объявле- нии GLUquadricObj *nameOfObject; Выбирает режим отображения для предопределенного имени объекта GLU Отображает сферу GLU
8.28. Резюме 729 Окончание табл. 8.2 Функция Описание gluCylinder Отображает конус, цилиндр или конический ци- линдр GLU gluDisk Отображает плоское круговое кольцо или объемный диск GLU gluPartialDisk Отображает участок плоского кругового кольца или объемного диска GLU gluDeleteQuadric gluQuadricOrientation Удаляет объект второго порядка GLU Определяет внутреннюю и внешнюю ориентацию объекта второго порядка GLU gluQuadri cNormals Задает, как должны генерироваться векторы норма- ли к поверхности объекта второго порядка GLU gluQuadricCallback Задает функцию обратного вызова по ошибке для объекта второго порядка GLU ТАБЛИЦА 8.3. Резюме по функциям Безье в OpenGL Функция Описание glMapl Задает параметры отображения, кодов цвета и тому подобного кривой Безье и активизирует эти процедуры с использованием glEnable glEvalCoordl glMapGridl Вычисляет координаты точки на кривой Безье Задает число равномерно расположенных делений между двумя параметрами кривой Безье glEvalMeshl Задает режим отображения и целочисленный диапазон изобра- жения кривой Безье glMap2 Задает параметры отображения, кодов цвета и тому подобного кривой Безье и активизирует эти процедуры с использованием glEnable glEvalCoord2 glMapGrid2 Рассчитывает координаты точки на поверхности Безье Задает двухмерную сетку равномерно расположенных делений на поверхности Безье glEvalMesh2 Задает режим отображения и целочисленный диапазон для двух- мерной сетки на поверхности Безье
730 Глава 8. Представления трехмерных объектов ТАБЛИЦА 8.4. Резюме по би-сплайновым функциям в OpenGL Функция Описание gluNewNurbs Renderer Активизирует процедуру визуализации GLU би-сплайна для объекта, имя которого определено с помощью объявления GLUnurbsObj *bsplineName gluBeginCurve Начинает присвоение значений параметров для заданной би- сплайновой кривой с одним или несколькими участками gluEndCurve gluNurbsCurve Указывает конец задания параметров би-сплайновой кривой Задает значения параметров именованного участка би- сплайновой кривой gluDeleteNurbs Renderer gluNurbsProperty gluGetNurbs Property gluBeginSurface Удаляет заданную би-сплайновую кривую Задает параметры визуализации заданного би-сплайна Определяет текущее значение заданного свойства определен- ного би-сплайна Начинает присвоение значений параметров заданной би- сплайновой поверхности с одним или несколькими участками gluEndSurface Указывает конец заданий параметров би-сплайновой поверх- ности gluNurbsSurface Задает значения параметров именованного участка би- сплайновой поверхности gluLoadSampling Matrices Задает матрицы преобразования точки наблюдения и геомет- рических преобразований, которые будут использоваться при дискретизации, и вызывает процедуры би-сплайна gluNurbsCallback Задает функцию обратного вызова для заданного би-сплайна и соответствующего события gluNurbs CallbackData Задает элементы данных, которые будут передаваться функ- ции обратного вызова по событию gluBeginTrim Начинает присвоение значений параметров обрезающей функции для би-сплайновой поверхности gluEndTrim gluPwlCurve Указывает конец задания параметров обрезающей кривой Задает значения параметров обрезающей кривой для би- сплайновой поверхности
Упражнения 731 ЛИТЕРАТУРА Подробное обсуждение суперквадрик содержится в статье [15]. Больше информации по моделиро- ванию каплевидных объектов можно найти в публикации [31]. Модель меташариков обсуждается в работе [234]; модель мягкого объекта — в [404]. Источниками информации по параметрическим кривым и представлениям поверхности явля- ются работы [16, 17, 22, 93, 159, 179, 226, 258, 289]. Алгоритмы использования квадро- и октодеревьев описаны в [48, 82, 407]. В статье [133] представлены методы В SP-дерева, а в работе [281] обсуждаются методы объемного моделирования. Более подробную информацию о фрактальных представлениях можно найти в [13, 100, 144, 180, 207, 208, 237, 253, 254]. Методы моделирования различных природных явлений описаны в [101, 102]. Грамматики форм представлены в статье [123], а системы многих частиц обсуждаются в [278]. Методы физического моделирования изложены в книге [19]. Общее введение в алгоритмы визуализации дается в статье [148]. Дополнительную информа- цию по определенным методам визуализации можно найти в [84, 105, 199, 232, 233, 295, 296, 363]. Руководство по визуальному отображению информации предлагается в цикле работ [359-361]. Методы программирования для различных представлений можно изучить по сборникам [8, 122, 151, 176, 244]. Дополнительные примеры программ для сплайнов Безье, би-сплайнам и функциям обрезающих кривых OpenGL содержатся в [400]. В монографии [174] обсуждаются функции GLUT отображения многогранников, поверхностей второго порядка и чайника, разработанного в Универ- ситете Юты. Наконец, полный перечень функций OpenGL корневой библиотеки и GLU представлен в справочнике [320]. 1 УПРАЖНЕНИЯ 8.1. Напишите алгоритм преобразования данной сферы в мозаичный объект с многогранной поверхностью. 8.2. Напишите алгоритм представления данного эллипсоида многоугольной сеткой. 8.3. Напишите алгоритм представления данного цилиндра сеткой многоугольников. 8.4. Напишите алгоритм представления данного суперэллипсоида сеткой многоугольников. 8.5. Напишите алгоритм представления объекта-меташарика сеткой многоугольников. 8.6. Напишите процедуру отображения двухмерного фундаментального сплайна для данного набора контрольных точек на плоскости ху. 8.7. Напишите процедуру отображения двухмерной кривой Коханека-Бартелса для данного вход- ного набора контрольных точек на плоскости ху. 8.8. Что такое стыковочные функции для кривых Безье при трех контрольных точках, заданных на плоскости ху? Изобразите все функции и определите минимальные и максимальные значения стыковочных функций. 8.9. Чем являются стыковочные функции для кривых Безье при пяти контрольных точках, задан- ных на плоскости ху? Изобразите все функции и определите минимальное и максимальное значения стыковочных функций. 8.10. Переработайте программу, приведенную в разделе 8.10, чтобы она отображала кубическую кривую Безье при любом данном наборе из четырех контрольных точек на плоскости ху. 8.11. Измените программу, приведенную в разделе 8.10, чтобы она отображала кривую Безье степени п — 1 для данного набора из п входных контрольных точек на плоскости ху.
732 Глава 8. Представления трехмерных объектов 8.12. Дополните программу OpenGL, приведенную в разделе 8.18, чтобы она могла отобразить кубическую кривую Безье для любого данного набора из четырех контрольных точек на плоскости ху. 8.13. Измените программу OpenGL из раздела 8.18, чтобы она могла вывести на экран простран- ственную кривую Безье для любого данного набора из четырех контрольных точек в про- странстве xyz. Для отображения кривой используйте ортогональную проекцию; параметры наблюдения должны вводиться. 8.14. Напишите процедуру, которую можно использовать для вычерчивания двухмерной кривой Безье, имеющей кусочную непрерывность первого порядка. Число и положение контроль- ных точек для каждого участка кривой вводятся пользователем. 8.15. Напишите процедуру, которую можно использовать для вычерчивания двухмерной кривой Безье, кусочно-непрерывной в С2. Число и положение контрольных точек каждого участка вводятся пользователем. 8.16. Модифицируйте программу из раздела 8.10, чтобы она отображала кубическую кривую Безье для данного набора из четырех контрольных точек на плоскости ху, используя для расчета точек кривой метод деления. 8.17. Измените программу, приведенную в разделе 8.10, чтобы она могла выводить на экран кубическую кривую Безье для данного набора из четырех контрольных точек на плоскости ху, используя для расчета точек кривой правые разности. 8.18. Какими являются стыковочные функции двухмерного равномерного периодического би- сплайна с d = 5? 8.19. Какими являются стыковочные функции двухмерного равномерного периодического би- сплайна с d = 6? 8.20. Модифицируйте программу из раздела 8.10, чтобы она отображала двухмерный равномер- ный периодический би-сплайн для данного набора контрольных точек, используя для расчета точек кривой правые разности. 8.21. Измените программу из предыдущего примера, чтобы она отображала би-сплайн с исполь- зованием функций OpenGL. 8.22. Напишите процедуру вывода на экран любого заданного конического сечения на плоскости ху, используя представление рациональными би-сплайнами. 8.23. Напишите процедуру вывода на экран любого заданного конического сечения на плоскости ху, используя представление рациональными би-сплайнами. 8.24. Разработайте алгоритм расчета вектора нормали к поверхности Безье в данной точке Р(и, г). 8.25. Выведите выражения для расчета правых разностей для данной кривой второго порядка. 8.26. Выведите выражения для расчета правых разностей для данной кривой третьего порядка. 8.27. Напишите процедуры генерации описания трехмерного объекта по входным параметрам, которые определяют объект через трансляционное заметание двухмерной формой. 8.28. Напишите процедуры генерации описания трехмерного объекта по входным параметрам, которые определяют объект через вращательное заметание двухмерной формой. 8.29. Придумайте алгоритм генерации трехмерных объектов в виде комбинации таких трехмер- ных примитивов, как куб и сфера, используя методы конструктивной блочной геометрии. 8.30. Модифицируйте алгоритм из предыдущего упражнения, чтобы формы-примитивы опреде- лялись в структуре-октодереве. 8.31. Разработайте схему кодирования двухмерной сцены представлением в форме квадродерева.
Упражнения 733 8.32. Разработайте алгоритм преобразования представления в форме квадродерева в пиксельные значения буфера кадров. 8.33. Напишите процедуру преобразования описания трехмерного объекта в форме сетки много- угольников в октодерево. 8.34. Используя метод случайного смещения средней точки, напишите процедуру формирования контура горы, начиная с горизонтальной линии на плоскости ху. 8.35. Напишите процедуру расчета возвышений над нулевой плоскостью, используя метод слу- чайного смещения средней точки, для данного набора возвышений над нулевой плоскостью. 8.36. Напишите программу отображения фрактальной снежинки (кривой Коха) для данного числа итераций. 8.37. Напишите программу генерации фрактальной кривой для заданного числа итераций с ис- пользованием генератора из представленных на рис. 8.73 или 8.74. Чему равна фрактальная размерность кривой? 8.38. Напишите программу генерации фрактальной кривой с использованием функции много- кратного возведения в квадрат /(z) = z2 + А, где комплексная константа А вводится поль- зователем. 8.39. Напишите программу генерации фрактальной кривой с использованием функции много- кратного возведения в квадрат f (z) = i(z2 + 1), где i = 8.40. Модифицируйте программу из примера в разделе 8.23, чтобы можно было использовать до- полнительные уровни цвета при отображении граничных областей в окрестности множества Мандельброта. 8.41. Измените программу из предыдущего примера, чтобы она позволяла пользователю вводить цвета и уровни цвета. 8.42. Модифицируйте программу из предыдущего примера, чтобы можно было выбирать и выво- дить на экран любую прямоугольную ограниченную область (область увеличения) в окрест- ности множества Мандельброта. 8.43. Напишите процедуру реализации инверсии относительно центра симметрии (уравне- ние (8.118)) для заданных окружности и набора точек. 8.44. Придумайте набор правил геометрической подстановки для изменения формы равносторон- него треугольника. 8.45. Напишите для предыдущего упражнения программу, выводящую на экран этапы последо- вательного преобразования формы треугольника. 8.46. Напишите программу моделирования и вывода на экран взрывающейся сферы на плоскости ху, используя систему многих частиц. 8.47. Модифицируйте программу из предыдущего упражнения, чтобы на экране взрывалась хло- пушка (цилиндр). 8.48. Придумайте процедуру моделирования маленького прямоугольного участка одежды в виде сетки идентичных пружин. 8.49. Напишите процедуру визуализации двухмерного скалярного набора данных с использова- нием псевдоцветного представления. 8.50. Напишите процедуру визуализации двухмерного скалярного набора данных с использова- нием горизонталей. 8.51. Напишите процедуру визуализации двухмерного векторного набора данных с представ- лением векторных значений стрелками. Используйте стрелки фиксированного размера с различным цветовым кодированием.
BA 9 Методы исследования видимых поверхностей Ландшафт, изображенный средствами компьютерной графики (перепечатано с разрешения Thomson Digital Image, Inc.)
9.1. Классификация алгоритмов исследования 9.10. Метод расчета лучей видимых поверхностей 9.11. Сравнение методов исследования 9.2. Детектирование невидимых поверхностей видимых поверхностей 9.3. Метод буфера глубины 9.12. Криволинейные поверхности 9.4. Метод А-буфера 9.13. Методы определения видимости для 9.5. Метод строк развертки каркасных изображений 9.6. Метод сортировки по глубине 9.14. Функции OpenGL исследования видимых 9.7. Метод BSP-дерева поверхностей 9.8. Метод деления области 9.15. Резюме 9.9. Методы октодеревьев п ри создании реалистичных графических изображений важно определить, что видно на сцене с выбранной точки наблюдения. Чтобы ответить на этот вопрос, можно использовать один из существующих подходов, кро- ме того, для различных типов приложений разработаны многочисленные алгоритмы эффективного выявления и отображения видимых объектов. Одни методы требуют больше памяти, другие — больше времени на обработку, а третьи применимы только к объектам конкретных типов. Выбор метода для определенного приложения может зависеть от таких факторов, как сложность сцены, тип отображаемых объек- тов, доступное оборудование, и от того, статическими или анимированными будут объекты. Все подобные алгоритмы называются методами исследования видимых по- верхностей. Иногда реализуемый процесс именуется устранением скрытых поверх- ностей, хотя разница между выявлением видимых поверхностей и устранением неви- димых может быть значительной. На каркасном изображении, например, устранять невидимые последовательности не нужно, достаточно отобразить их с пунктирными границами или некоторым иным способом, сохраняя информацию о форме.
736 Глава 9. Методы исследования видимых поверхностей 9.1. КЛАССИФИКАЦИЯ АЛГОРИТМОВ ИССЛЕДОВАНИЯ ВИДИМЫХ ПОВЕРХНОСТЕЙ Алгоритмы исследования видимых поверхностей классифицируют согласно тому, что в них фигурирует — определения объектов или их спроектированные образы. Данные подходы называются методами пространства объектов и пространства изображе- ний соответственно. В методах первого класса объекты и части объектов сравнива- ются друг с другом в контексте предложенного определения сцены, и в результате некоторые поверхности помечаются как видимые. В алгоритмах пространства изоб- ражений видимость определяется для каждого положения пикселя на плоскости про- екции. В большинстве алгоритмов выявления видимых поверхностей используются методы пространства изображений, хотя в некоторых случаях для локализации види- мых поверхностей можно эффективно использовать методы пространства объектов. В алгоритмах отображения линий, например, для идентификации видимых линий каркасных изображений обычно используются методы пространства объектов, хо- тя исследовать видимые линии можно с помощью многих алгоритмов определения видимых поверхностей в пространстве изображений. Базовые подходы, принятые в различных алгоритмах выявления видимых поверх- ностей, могут довольно значительно отличаться, однако в большинстве для улучше- ния производительности используются методы сортировки и когерентности. Сорти- ровка облегчает сравнение по глубине, упорядочивая отдельные поверхности на сцене согласно их расстоянию от плоскости наблюдения. Методы когерентности построены на регулярности структур на сцене. Отдельная строка развертки очень часто содер- жит интервалы (серии) пикселей постоянной интенсивности, кроме того, структура строки развертки зачастую сохраняется при переходе к следующей строке. Кадры с анимацией, например, изменяются только в окрестности движущихся объектов. Кроме того, между объектами на сцене часто можно установить постоянные связи. 9.2. ДЕТЕКТИРОВАНИЕ НЕВИДИМЫХ ПОВЕРХНОСТЕЙ Быстрый и простой метод пространства объектов для локализации невидимых граней многогранника основан на проверках невидимых поверхностей, рассмотренных в разделе 3.15. Итак, точка (х, у, z) расположена за многоугольной поверхностью, если Ах + By + Cz + D < О, (9.1) где А, В, С и D — параметры плоскости многоугольника. Если эта точка находится вдоль линии обзора поверхности, мы (наблюдатели) смотрим на заднюю часть мно- гоугольника. Следовательно, для обнаружения задних граней можно использовать точку наблюдения.
9.2. Детектирование невидимых поверхностей 737 Рис. 9.1. Вектор нормали к поверхности N и вектор на- правления наблюдения Vvicw Рис. 9.2. Многоугольная поверхность с параметром плос- кости С < 0 в правосторонней системе координат иден- тифицируется как задняя грань, если направление наблю- дения совпадает с отрицательным направлением оси z„ Проверку невидимых (задних) граней можно упростить, рассмотрев направление вектора нормали N к многоугольной поверхности. Если Vview — вектор направле- ния наблюдения от положения камеры, как показано на рис. 9.1, то многоугольник является задней гранью, если Vview • N > 0. (9.2) Более того, если описания объекта преобразованы в координаты проекции, а направ- ление наблюдения параллельно оси zv, требуется рассмотреть только компонент z вектора нормали N. В правосторонней системе координат, в которой направление наблюдения сов- падает с отрицательным направлением оси zv (рис. 9.2), многоугольник является невидимой гранью, если компонент z (С) его вектора нормали N удовлетворяет со- отношению С < 0. Кроме того, ни одна грань, нормаль которой имеет компонент z С = 0, не видна, поскольку направление наблюдения является касательным к много- угольнику. Следовательно, в общем случае любой многоугольник можно пометить как невидимую грань, если компонент z его вектора нормали удовлетворяет неравенству С < 0. (9.3) Подобные методы можно использовать и в пакетах, в которых наблюдение ведется в левосторонней системе координат. В данных пакетах параметры плоскости А, В, С и D вычисляются по координатам вершин многоугольника, заданным в направлении по часовой стрелке (вместо направления против часовой стрелки, используемого в пра- восторонней системе). Отметим, что проверка согласно неравенству (9.1) корректна и для точек, расположенных за многоугольником. Кроме того, векторы нормалей неви- димых граней направлены от точки наблюдения. Когда направление наблюдения сов- падает с положительным направлением оси zv, они определяются условием С > 0.
738 Глава 9. Методы исследования видимых поверхностей Рис. 9.3. Наблюдение выпуклого многоугольника, одна грань которого ча- стично скрыта другими гранями объекта Исследуя параметр С для различных плоских поверхностей, описывающих объ- ект, можно непосредственно выявить все невидимые грани. Для одного выпуклого многогранника, например, пирамиды, изображенной на рис. 9.2, данная проверка определяет все скрытые поверхности на сцене, поскольку любая поверхность явля- ется либо полностью видимой, либо полностью невидимой. Кроме того, если сцена содержит только неперекрывающиеся выпуклые многоугольники, то с помощью ме- тода определения невидимых граней снова выявляются все скрытые поверхности. Для других объектов, таких как вогнутый многоугольник, изображенный на рис. 9.3, необходимо больше проверок, чтобы определить наличие граней, полно- стью или частично загороженных другими гранями. Стоит ожидать, что обычная сцена будет содержать объекты, накладывающиеся вдоль линии наблюдения, поэто- му придется определить, где наблюдаемые объекты частично или полностью скрыты другими объектами. Вообще, хороший алгоритм удаления невидимых граней должен отсеивать около половины многоугольных поверхностей на сцене. 9.3. МЕТОД БУФЕРА ГЛУБИНЫ Распространенным подходом к выявлению видимых поверхностей в пространстве изображений является метод буфера глубины, в котором для каждого положения пик- селя на плоскости проекции сравниваются значения глубин поверхностей на сцене. Каждая поверхность сцены обрабатывается отдельно, при этом рассматриваются все положения пикселей. Алгоритм обычно применяется к сценам, содержащим толь- ко многоугольные поверхности, поскольку для них глубины можно вычислить очень быстро, и метод легко реализовать. Однако те же процедуры применяются и к неплос- ким поверхностям. Данный подход определения видимых поверхностей также часто называется z-буфером, поскольку глубина объекта обычно измеряется по оси z си- стемы наблюдения. На рис. 9.4 показаны три поверхности с разным расстоянием по линии орто- графической проекции от точки (х,у). Данные поверхности можно исследовать в любом порядке. При обработке каждой поверхности ее глубина от плоскости на-
9.3. Метод буфера глубины 739 Рис. 9.4. В один пиксель плоскости наблюдения (х, у) проектируются три точки накладываю- щихся поверхностей. Наименьшее значение глубины имеет видимая поверхность Si блюдения сравнивается с глубинами ранее обработанных поверхностей. Если по- верхность ближе к точке наблюдения, чем все ранее обработанные поверхности, ее цвет рассчитывается и записывается вместе с глубиной. После завершения обработки всех поверхностей набор записанных цветов поверхности определяет видимые по- верхности на сцене. Отметим, что алгоритм буфера глубины обычно реализуется в нормированных координатах, так что значения глубины меняются от 0 возле ближней плоскости отсечения (плоскость наблюдения) до 1 возле дальней. Как следует из названия метода, требуется две области буфера. При обработке поверхности глубины для каждой точки (х, у) записываются в буфере глубины, а в буфере кадров хранится код цвета каждого пикселя. Изначально все позиции в буфере глубины имеют значения 1 (максимальная глубина), а буфер кадров (буфер регене- рации) инициализируется с цветом фона. Затем обрабатываются все поверхности, перечисленные в таблицах многоугольников, по одной строке развертки за раз, и при этом для каждого пикселя (х, у) рассчитывается глубина, которая затем сравнивается со значением, ранее записанным в буфере кадров для данного пикселя. Если рассчи- танная глубина меньше значения, записанного в буфере глубины, в него записывается новое значение. Далее цвет поверхности в данной точке вычисляется и помещается в позицию буфера кадра, соответствующую этому пикселю. Этапы обработки с использованием буфера глубины сведены в приведенном ни- же алгоритме, где предполагается, что значения глубины нормированы в промежу- ток 0-1, причем плоскости наблюдения соответствует глубина 0. Данный алгоритм можно также применить для любого диапазона глубин, что позволяют некоторые графические пакеты.
740 Глава 9. Методы исследования видимых поверхностей Алгоритм буфера глубины 1. Инициализировать буфер глубины и буфер кадров так, чтобы для всех по- зиций буфера(х,у) depthBuff (х, у) = 1.0, frameBuff (х, у) = backgndColor. 2. Обработать по одному все многоугольники сцены. • Для каждого положения пикселя (ж, у), в которое проектируется мно- гоугольник, вычислить глубину z (если она неизвестна). • Если z < depthBuff (х, у), вычислить цвет поверхности в этой точке и положить depthBuff (х, у) = z, frameBuff (х, у) = surfColor (х, у). После обработки всех поверхностей буфер глубины содержит значения глу- бин для видимых поверхностей, а буфер кадров — соответствующие коды цвета для этих поверхностей. По глубинам вершин любого многоугольника на сцене можно вычислить глуби- ну любой другой точки плоскости, на которой расположен данный многоугольник. Глубина точки поверхности (х, у) вычисляется из уравнения плоскости: —Ах - By — D г =--------—у------. (9.4) О Для любой строки развертки (рис. 9.5) соседнее горизонтальное положение х вдоль строки отличается от текущего на ±1, а вертикальные значения у соседних строк раз- вертки отличаются на ±1. Если глубина точки (х, у) определена и равна z, то глубина z' следующей точки (х + 1, у) вдоль строки развертки получается из уравнения (9.4): i С/ или > ? = г - (9.6) i О ; Отношение —А/С постоянно для каждой поверхности, так что последовательные значения глубин вдоль строки развертки находятся из предыдущих с помощью про- стой операции сложения.
9.3. Метод буфера глубины 741 Обработка пикселей слева направо вдоль каждой строки развертки начинается с расчета глубины левого края многоугольника, пересекающего эту строку развертки (рис. 9.6). Затем для каждого последующего положения вдоль строки развертки с помощью уравнения (9.6) рассчитывается значение глубины. Алгоритм буфера глубины можно реализовать, начиная с верхней вершины мно- гоугольника. Затем значения координат х рекурсивно вычисляются вниз по левой стороне многоугольника. Значение х начальной точки в каждой строке развертки вычисляется из начального (краевого) значения х в предыдущей строке развертки: где т — наклон этой стороны (рис. 9.7). Значения глубины вниз по этому краю вычисляются рекурсивно: Рис. 9.5. Для точки (х,у) на строке развертки следующая точка вдоль строки имеет координаты (х + 1, у), а точка, расположенная непосред- ственно под данной, — координаты (х,у - 1) Пересечение с левым краем Верхняя строка развертки Строка развертки у Нижняя строка развертки Рис. 9.6. Строки раз- вертки, пересекающие многоугольную поверх- ность --------------------------- 'W -------------н------------- х х Строка развертки у Строка развертки у — 1 Рис. 9.7. Точки пересечения вдоль левого края многоуголь- ника в последовательных стро- ках развертки
742 Глава 9. Методы исследования видимых поверхностей Ajm + В (9.7) При нисходящей обработке вертикальной стороны крутизна (наклон) равна бесконеч- ности, и рекурсивные вычисления сводятся к формуле Альтернативный подход — использовать для определения начальных значений х вдоль сторон для каждой строки развертки метод средней точки или разновидность алгорит- ма Брезенхема. Кроме того, описанный метод можно применить и к криволинейным поверхностям, определяя глубину и цвет в каждой точке проекции поверхности. Для многоугольных поверхностей метод буфера глубины очень легко реализо- вать, не сортируя поверхности сцены. В то же время, он требует наличия второго буфера в дополнение к буферу регенерации. Система с разрешением 1280 на 1024, например, потребует свыше 1,3 миллионов позиций в буфере глубины, причем каждая позиция должна содержать достаточное число битов для представления необходимо- го разрешения по глубине. Один путь снижения требований к памяти — обрабатывать по одному сегменту на сцене, используя меньший буфер глубины. После заверше- ния обработки наблюдаемого участка буфер повторно используется для обработки следующего участка. Кроме того, стандартный алгоритм буфера глубины часто выполняет ненужные вычисления. Поскольку объекты обрабатываются в произвольном порядке, может вычисляться цвет точки поверхности, которая позднее окажется невидимой. Чтобы свести эту проблему к минимуму, некоторые графические пакеты позволяют пользо- вателю выравнивать диапазон глубин перед проверкой поверхностей. Это дает воз- можность, например, исключать из проверок глубин удаленные объекты. Исполь- зуя это, можно даже исключить объекты, расположенные очень близко к плоскости проекции. В заключение отметим, что в сложных системах компьютерной графики алгоритм буфера глубины обычно реализован на аппаратном уровне. 9.4. МЕТОД А-БУФЕРА Расширением метода буфера глубины является процедура A-буфера (в названии ис- пользована противоположная от z буква алфавита, а выше говорилось, что z пред- ставляет глубину). Данное расширение — это метод с защитой от наложения, усред- нением по области и выявлением видимых поверхностей, разработанный Lucasfilm Studios для системы визуализации поверхностей REYES (“Renders Everything Уои Ever Saw” — “Визуализирует все, что вы видите”). Область буфера для данной про- цедуры называется буфером накопления, поскольку в ней в дополнение к значениям глубин хранятся различные данные о поверхности.
9.4. Метод A-буфера 743 RGB-данные и другая информация Рис. 9.8. Для наблюдения непрозрачной по- верхности через прозрачную следует ввести несколько цветов и смешать их Глубина > О б) Рис. 9.9. Два возможных представления информации о поверхности для пикселя в A-буфере. Если в пиксель проектируется одна поверхность, глубина, цвет и другая информация, касающаяся ее, за- писывается так, как показано на панели а. Если на пиксель накладывается несколько поверхностей, соответствующий список данных записывается так, как показано на панели б Недостаток метода буфера глубины заключается в том, что он определяет только одну видимую поверхность в каждом пикселе. Другими словами, он работает только с непрозрачными поверхностями и не может накапливать коды цветов для нескольких поверхностей, а это необходимо, если нужно отобразить прозрачную поверхность (рис. 9.8). Метод A-буфера так расширяет алгоритм буфера глубины, чтобы каждая позиция в буфере могла соответствовать целому списку поверхностей. Это позволяет вычислить цвет пикселя как комбинацию цветов различных поверхностей при расчете прозрачности или защиты от наложения. Каждая позиция в A-буфере имеет два поля. • Поле глубины: здесь хранится действительное значение (положительное, от- рицательное или нуль). • Поле данных о поверхности: здесь находятся данные о поверхности или указатель. Если поле глубины неотрицательное, число, записанное в этой позиции, — это глубина поверхности, проектирующейся в соответствующую область пикселя. Следующее за ним поле данных о поверхности содержит такую информацию, как цвет поверхности для этой точки и процент охвата пикселя (рис. 9.9, а). Если поле глубины для позиции
744 Глава 9. Методы исследования видимых поверхностей в A-буфере отрицательно, значит, цвет пикселя определяется вкладами нескольких поверхностей. Следующее за ним поле цвета содержит указатель на связанный список данных о поверхности, как показано на рис. 9.9, б. Информация о поверхности в А- буфере включает следующее: • значения интенсивностей RGB-компонентов; • параметр непрозрачности (процент прозрачности); • глубина; • процент охвата площади; • идентификатор поверхности; • другие параметры, требуемые при визуализации поверхности. Схему исследования видимых поверхностей в A-буфере можно реализовать с по- мощью методов, подобных представленным для алгоритма буфера глубины. Чтобы определить, какую часть площади пикселя вдоль отдельных строк развертки зани- мает поверхность, следует обработать все строки развертки. Поверхности делятся на многоугольную сетку и обрезаются по границам пикселей. Используя параметры прозрачности и процент охвата поверхности, алгоритмы визуализации рассчитывают цвет каждого пикселя как среднее вкладов перекрывающихся поверхностей. 9.5. МЕТОД СТРОК РАЗВЕРТКИ Данный метод пространства изображений предназначен для выявления видимых ком- понентов поверхностей и сравнения глубин вдоль различных строк развертки на сцене. При обработке каждой строки развертки исследуются все проекции много- угольных поверхностей, пересекающих данную строку, и определяется, какая из них видима. Вдоль каждой строки развертки рассчитывается глубина, а по ней в каждом пикселе определяется, какая поверхность расположена ближе всего к плоскости на- блюдения. Когда для пикселя определена видимая поверхность, ее цвет вводится в буфер кадров. Поверхности обрабатываются с использованием информации, записанной в таб- лицах многоугольников (раздел 3.15). Координаты конечных точек всех линий на сцене, обратных наклонов каждой линии и указателей в таблицу граней поверхно- стей, определяющих поверхности, ограничиваемые каждой линией, записаны в таб- лице сторон. Таблица граней поверхностей содержит коэффициенты плоскости, свой- ства материалов поверхности, другие данные, касающиеся поверхности, и, возможно, ссылки на таблицу сторон. Чтобы облегчить поиск поверхностей, пересекаемых дан- ной строкой развертки, для каждой строки развертки при обработке формируется активный список сторон. В этом списке в порядке увеличения х записаны стороны, которые пересекаются с данной строкой развертки. Кроме того, для каждой поверх-
9.5. Метод строк развертки 745 Рис. 9.10. Строки разверт- ки, пересекающие проек- цию на плоскость наблюде- ния двух поверхностей Si и 5г- Пунктиром показаны границы невидимых участ- ков поверхности ности определяется метка (flag), которая устанавливается в положение “включено” или “выключено” и указывает, где располагается точка строки развертки — внутри или снаружи поверхности. Положения пикселей вдоль каждой строки развертки об- рабатываются слева направо. В крайне слева точке пересечения с плоской проекцией выпуклого многоугольника метка поверхности включается; в крайней справа точке пересечения вдоль строки развертки она выключается. Для вогнутого многоугольника пересечения со строками развертки также можно сортировать слева направо, а метку поверхности “включать” между парой пересечений. Метод строк развертки иллюстрируется на рис. 9.10. Активный список для строки развертки 1 содержит информацию из таблицы сторон, касающуюся сторон АВ, ВС, ЕН и FG. Для положений вдоль этой строки развертки между сторонами АВ и ВС отмечена только поверхность Si. Следовательно, глубины вычислять не требуется, и коды цвета определяются по свойствам и условиям освещенности поверхности Si. Аналогично между сторонами ЕН и FG в состоянии “включено” находится только метка поверхности S^- В остальные точки вдоль строки развертки 1 поверхности не проектируются, так что цвет соответствующих пикселей совпадает с цветом фона, и его можно загрузить в буфер кадров при инициализации. Для строк развертки 2 и 3 на рис. 9.10 активный список сторон содержит сто- роны AD, ЕН, ВС и FG. Вдоль строки 2 от стороны AD до стороны ЕН включена только метка поверхности Si. Однако между сторонами ЕН и ВС включены метки обеих поверхностей. Следовательно, при обработке грани ЕН необходимо вычислить глубину, используя коэффициенты плоскостей двух поверхностей. В нашем примере предполагается, что глубина поверхности Si меньше глубины поверхности S2. Сле- довательно, пикселям строки развертки присваивается цвет поверхности Si, пока мы не придем к границе ВС. Затем метка поверхности Si выключается, и до самого края FG записываются цвета поверхности S2. Больше никаких расчетов глубины не тре- буется, поскольку предполагается, что поверхность S2 остается позади поверхности Si после того, как их связь по глубине определена при обработке стороны ЕН.
746 Глава 9. Методы исследования видимых поверхностей Рис. 9.11. Пересечение и циклическое наложение поверхностей, попеременно затеняющих одна другую При переходе от одной строки развертки к следующей используем когерентность строк развертки. На рис. 9.10 строка развертки 3 имеет тот же активный список сторон, что и строка развертки 2. Поскольку относительно пересечений строк никаких изменений не наблюдается, то снова вычислять и сравнивать глубины сторон ЕН и ВС не требуется. Две поверхности должны сохранять ориентацию, определенную в строке развертки 2, так что в буфер кадров можно без дополнительных расчетов глубины вводить цвета поверхности Si. С помощью описанного метода строк развертки можно обработать любое число накладывающихся многоугольных поверхностей. Для поверхностей устанавливаются метки, указывающие, где расположена данная точка — внутри или снаружи поверх- ности, а глубина рассчитывается только на краях накладывающихся поверхностей. Данная процедура корректно работает только тогда, когда поверхности не проходят одна сквозь другую или нет какого-либо иного циклического наложения (рис. 9.11). Если на сцене присутствует любое циклическое наложение, то, чтобы его устранить, поверхности можно разделить на части. На указанном рисунке пунктиром показа- но, как плоскости разрезаются на два отдельных участка, что позволяет избежать циклического наложения. 9.6. МЕТОД СОРТИРОВКИ ПО ГЛУБИНЕ Используя процедуры, определенные в пространстве объектов и пространстве изоб- ражений, метод сортировки по глубине реализует следующие базовые функции. 1. Поверхности сортируются в порядке уменьшения глубины. 2. Поверхности упорядочиваются согласно стандарту развертки, начиная с наиболее глубокой поверхности.
9.6. Метод сортировки по глубине 747 Рис. 9.12. Две поверхности без наложения по глубине Операции сортировки выполняются и в пространстве изображений, и в простран- стве объектов, а преобразование многоугольных поверхностей в стандарт развертки выполняется в пространстве изображений. Данный метод исследования видимых поверхностей часто называется алгорит- мом художника. При создании акварельной или масляной картины художник вначале наносит фоновые цвета. Затем добавляются наиболее удаленные объекты, потом бо- лее близкие объекты и т.д. На заключительном этапе на холсте поверх фона и более удаленных объектов рисуются предметы переднего плана. Каждый слой цвета за- крывает предыдущий уровень. С помощью подобной техники поверхности вначале сортируются согласно их расстоянию от плоскости наблюдения. Затем в буфер реге- нерации вводятся коды цветов наиболее далекой поверхности. При обработке каждой последующей поверхности (в порядке уменьшения глубины) мы “рисуем” поверх- ность в буфере кадров поверх цветов ранее обработанных поверхностей. Упорядоченное рисование многоугольных поверхностей в буфере кадров выпол- няется в несколько этапов. Предполагая, что сцена наблюдается по направлению оси z, при первом проходе алгоритма поверхности упорядочиваются согласно наи- меньшему значению z каждой поверхности. Затем поверхность S в конце списка (с наибольшей глубиной) сравнивается с другими поверхностями списка, и определя- ется, перекрывается ли она с ними по глубине. Если нет, S — наиболее удаленная поверхность, и она преобразовывается в стандарт развертки. В качестве примера на рис. 9.12 показаны две поверхности, накладывающиеся на плоскости ху, но не име- ющие перекрытия по глубине. Затем данный процесс повторяется для следующей поверхности списка. Если перекрытия не наблюдается, поверхности обрабатываются в порядке, определяемом глубиной, пока все они не будут преобразованы в стан- дарт развертки. Если для некоторой позиции списка обнаруживается перекрытие по глубине, необходимы дополнительные сравнения, чтобы выяснить, нужно ли пере- упорядочить какие-либо поверхности.
748 Глава 9. Методы исследования видимых поверхностей Рис. 9.13. Две поверхности с перекрытием по глубине, но без перекрытия по оси х Для каждой поверхности, перекрывающейся по глубине с S, выполняются сле- дующие проверки. Если в любой из этих проверок получен положительный ответ, значит, переупорядочения выполнять не нужно, и поверхность S прошла проверку. Проверки перечислены в порядке увеличения сложности. 1. Ограничивающие прямоугольники (координатные границы) двух поверхностей в направлениях х и у не перекрываются. 2. Поверхность S полностью расположена за некоторой поверхностью относитель- но точки наблюдения. 3. Накладывающаяся поверхность полностью находится перед S относительно точ- ки наблюдения. 4. Проекции ограничивающих областей двух поверхностей на плоскость наблюде- ния не перекрываются. Перечисленные проверки выполняются в указанном порядке, и сразу после того, как какая-то проверка даст положительный ответ, начинается обработка следующей пе- рекрывающейся поверхности. Если все проектирующиеся поверхности дали положи- тельный ответ хотя бы при одной проверке, S — наиболее удаленная поверхность. В таком случае никакого переупорядочения не требуется, и S преобразуется в стандарт развертки. Проверка 1 выполняется в два этапа. Вначале проверяется наложение по оси х, затем по оси у. Если ни в одном направлении не наблюдается перекрытия поверхно- стей, две плоскости не могут закрывать одна другую. На рис. 9.13 приведен пример двух поверхностей, которые не перекрываются ни в направлении х, ни в направлении у, но перекрываются в направлении z. Проверки 2 и 3 можно выполнить с использованием проверки “передняя/задняя грань многоугольника”. Следовательно, координаты всех вершин S подставляются в уравнение плоскости для накладывающихся поверхностей, и проверяется знак ре- зультата. Если уравнения плоскости заданы так, что передняя сторона поверхности смотрит на точку наблюдения, то S расположена за S', если все вершины S находятся
9.6. Метод сортировки по глубине 749 xv Рис. 9.14. Поверхность S полностью расположена за наклады- вающейся поверхностью S' Рис. 9.15. Накладывающаяся поверхность S' полностью раз- мещается перед поверхностью S, но S не полностью — за S' Рис. 9.16. Две многоуголь- ные поверхности с накладыва- ющимися граничными прямо- угольниками на плоскости ху позади S' (рис. 9.14). Таким образом, S' полностью находится перед S, если все вер- шины S расположены перед S'. На рис. 9.15 показана накладывающаяся поверхность S', т.е. она вся находится перед S, но поверхность S не полностью расположена за S' (проверка 2 дает отрицательный ответ). Если все проверки 1-3 дали отрицательный ответ, выполняется проверка 4, по результату которой определяется, налагаются ли две поверхности. Как показано на рис. 9.16, две поверхности могут пересекаться или не пересекаться, даже когда их координатные границы налагаются.
750 Глава 9. Методы исследования видимых поверхностей Рис. 9.17. Некоторые точки поверхности S имеет большую глубину, чем все точки поверхности S', но поверхность S затеняет поверх- ность S' Рис. 9.18. Три поверхности введены в список сортировки в порядке S, S', S", но они должны упорядочиться как S', S", S Если все четыре проверки дают отрицательные результаты для проектирующейся поверхности S', поверхности S и S' в списке сортировки меняются местами. Пример двух поверхностей, переупорядоченных с помощью данной процедуры, приводится на рис. 9.17. На этом этапе все еще достоверно неизвестно, найдена ли плоскость, наиболее удаленная от плоскости наблюдения. На рис. 9.18 иллюстрируется ситуация, когда вначале меняются местами S и S". Однако, поскольку S" скрывает часть S', необходимо еще поменять местами S" и S', чтобы три поверхности шли в правильном порядке глубины. Следовательно, для каждой поверхности, порядок которой в списке меняется, ряд проверок нужно повторить. Если несколько поверхностей попеременно закрывают друг друга, как на рис. 9.11, алгоритм может просто зацикливаться. В подобных ситуациях алгоритм постоянно переупорядочивает накладывающиеся поверхности. Чтобы избежать по- добных циклов, можно пометить любую поверхность, передвинутую глубже, чтобы ее нельзя было снова переместить. При попытке переставить поверхность повтор- но, она делится на две части, исходная поверхность заменяется двумя новыми, и обработка продолжается, как раньше.
9.7. Метод BSP-дерева 751 9.7. Рис. 9.19. Область пространства (панель а) делится на две плоскости Pi и Рг с целью получения BSP-дерева (панель б) МЕТОД BSP-ДЕРЕВА Метод дерева бинарного разбиения пространства (binary space-partitioning — BSP) позволяет эффективно определить видимость объекта, занося поверхности в буфер кадров от фона к переднему плану, как в алгоритме художника. BSP-дерево осо- бенно полезно, когда положение точки наблюдения меняется, но объекты на сцены фиксированы. Применение BSP-дерева в проверках видимости включает выявление на каждом этапе деления пространства поверхностей, расположенных за или перед плоскостью разбиения (относительно направления наблюдения). Основные концепции этого ал- горитма иллюстрируются на рис. 9.19. Для плоскости Р\ пространство вначале де- лится на два набора объектов. Один набор объектов находится позади плоскости Р\ относительно направления наблюдения, а другой — перед Р\. Поскольку плоскость Р1 пересекает один объект, он делится на два разных объекта, помеченных А и В. Объекты А и С находятся перед Pi, а объекты В и D расположены за Pi. Далее пространство делится плоскостью Рг, и строится представление в форме двоичного дерева, показанное на рис. 9.19, б. На этом дереве объекты представляются заключи- тельными узлами, причем передние объекты занимают левые ветви, а задние объекты соответствуют правым ветвям.
752 Глава 9. Методы исследования видимых поверхностей Для объектов, описанных многоугольными гранями, плоскости деления можно выбрать совпадающими с плоскостями поверхностей многоугольников. Затем с помо- щью уравнений многоугольников определяются задние и передние многоугольники, и дерево строится с одной плоскостью деления для каждой грани. Любой много- угольник, пересекаемый плоскостью деления, разбивается на две части. Построен- ное BSP-дерево обрабатывается в следующем порядке: вначале правые узлы, затем левые. Таким образом поверхности подготавливаются к отображению в порядке от фона к переднему плану, так что объекты переднего плана рисуются поверх фоно- вых. В некоторых системах для построения и обработки BSP-деревьев используются быстрые аппаратные реализации. 9.8. МЕТОДЫ ДЕЛЕНИЯ ОБЛАСТИ Данный метод удаления невидимых поверхностей — это, по сути, метод пространства изображений, но для упорядочения поверхностей по глубине могут использоваться ориентации в пространстве объектов. Итак, метод деления области построен на когерентности областей сцены, и он локализует те области проекции, которые пред- ставляют одну поверхность. Этот метод состоит в делении всей области плоскости наблюдения на последовательно уменьшающиеся прямоугольники. Деление прекра- щается, если каждая прямоугольная область содержит проекцию части только одной видимой поверхности или не содержит проекций поверхности, либо деление дошло до размера пикселя. Чтобы реализовать этот метод, нужно установить проверки, которые помогут быстро определить, что область является частью одной поверхности, или что эта об- ласть слишком сложна, чтобы ее можно было просто проанализировать. Изначально к общей проекции применяются проверки, позволяющие определить, нужно ли раз- делить общую область на меньшие прямоугольники. Если проверки указывают, что проекция достаточно сложна, она делится на части. Затем проверки применяются ко всем меньшим областям, которые при необходимости также разбиваются (если проверки показали, что видимость суммарной поверхности все еще неопределенная). Данный процесс продолжается, пока не удастся однозначно отнести фрагмент к од- ной поверхности, или пока не будет достигнуто предельное разрешение. Чтобы легко реализовать этот принцип, нужно на каждом шаге последовательно делить область на четыре равные части, как показано на рис. 9.20. Данный подход подобен используе- мому при построении квадродерева (четверичного дерева, quadtree). Зону просмотра при разрешении 1024 на 1024 пикселей можно описанным способом подвергнуть делению 10 раз, пока подзона не сократится до размера одного пикселя. Существует четыре возможные связи, которые поверхность может иметь с обла- стью разделенной плоскости наблюдения. Данные относительные положения поверх- ности можно описать, используя следующие классификации (рис. 9.21).
9.8. Методы деления области 753 Рис. 9.20. Деление квадратной области на каждом шаге на квадраты равного размера Окружающая поверхность Накладывающаяся поверхность Внутренняя поверхность Внешняя поверхность Рис. 9.21. Возможные связи между многоугольными поверхностями и прямоугольной областью плоскости наблюдения Окружающая поверхность: поверхность, полностью замыкающая область. Накладывающаяся поверхность: поверхность, расположенная частично внутри и снаружи области. Внутренняя поверхность: поверхность, расположенная целиком внутри области. Внешняя поверхность: поверхность, расположенная полностью вне области. Проверки на определение видимости поверхности в пределах прямоугольной области можно сформулировать в терминах четырех классификаций поверхности, проиллюстрированных на рис. 9.21. Дальнейшее деление указанной области не тре- буется, если выполняется одно из приведенных ниже условий. Условие 1: область не принадлежит к внутренним, накладывающимся или ок- ружающим поверхностям (все поверхности находятся вне области). Условие 2: область имеет только одну внутреннюю, накладывающуюся или окружающую поверхность. Условие 3: область имеет одну окружающую поверхность, затеняющую все остальные поверхности в пределах границ области.
754 Глава 9. Методы исследования видимых поверхностей Рис. 9.22. В заданной области окружающая поверхность с макси- мальной глубиной zmax затеняет все поверхности, минимальная глу- бина которых превышает zmax Первый шаг анализа — сравнение координатных границ всех поверхностей в пре- делах границ области. Это определит внутренние и окружающие поверхности, но выявление накладывающихся и внешних поверхностей обычно требует проверок на пересечение. Если первый граничный прямоугольник пересекает область, то, что- бы определить, является поверхность окружающей, накладывающейся или внешней, используются дополнительные проверки. Как только выявлена внутренняя, наклады- вающаяся или окружающая поверхность, в буфер кадров записываются ее коды цвета. Чтобы проверить условие 3, можно, например, рассортировать поверхности со- гласно минимальной глубине от плоскости наблюдения. Затем для каждой окружа- ющей поверхности вычисляется максимальная глубина в пределах рассматриваемой области. Если максимальная глубина (отсчитывается от плоскости наблюдения) од- ной из таких окружающих поверхностей меньше, чем минимальная глубина всех остальных поверхностей данной области, условие 3 удовлетворяется. Данная ситуа- ция иллюстрируется на рис. 9.22. Другой метод проверки условия 3, не требующий сортировки по глубине, — это использовать уравнения плоскости для расчета значений глубин в четырех вершинах области для всех окружающих, накладывающихся и внутренних поверхностей. Если все четыре глубины для одной поверхности меньше рассчитанных глубин для всех остальных поверхностей, условие 3 удовлетворено. Далее область можно отобразить с цветами окружающей поверхности. В некоторых ситуациях предыдущие два метода проверки могут не выявить окру- жающую поверхность, затеняющую все остальные. Чтобы правильно определить поверхность, охватывающую область, можно продолжить проверку, но проще эту об- ласть разделить. Поверхность, классифицированная как внешняя или окружающая для данной области, будет оставаться в этой категории при всех делениях области. Более того, можно ожидать, что при продолжении процесса деления исчезнут неко- торые внутренние и накладывающиеся поверхности, так что анализировать области будет проще. Когда деление доходит до размера пикселя, в каждой точке просто рас- считывается глубина значимой для нее поверхности, и пикселю присваивается цвет ближайшей поверхности.
9.9. Методы октодеревьев 755 Рис. 9.23. Область А делится на А\ и Аг с помощью границы поверхно- сти S на плоскости наблюдения Возможна небольшая модификация базового процесса деления — вместо того, чтобы делить области пополам, их можно делить вдоль границ поверхностей. Если поверхности были отсортированы согласно минимальной глубине, для деления дан- ной области используется поверхность с наименьшим значением глубины. Сказанное иллюстрируется на рис. 9.23. Проекция границы поверхности S делит исходную область на подобласти Л1 и Лг- После этого поверхность S является окружающей поверхностью для Ai, и, чтобы определить, требуется ли дальнейшее деление, можно проверять условия видимости 2 и 3. Вообще, чтобы при описанном подходе разделить области и проанализировать отношения поверхностей к границам деления, требуется меньше делений, но больше обработки. 9.9. МЕТОДЫ ОКТОДЕРЕВЬЕВ Когда в наблюдаемом объеме используется представление в форме восьмеричного дерева (октодерево, octree), выявление видимых поверхностей выполняется через поиск в пространстве узлов октодерева в порядке от переднего к заднему плану. На рис. 9.24 передний план сцены занимают октанты 0,1, 2 и 3. Поверхности перед этими октантами видимы для наблюдателя. Любые поверхности, расположенные позади передних октантов или в задних октантах (4, 5, 6 и 7), могут быть скрыты передними поверхностями. Узлы октодерева на рис. 9.24 можно обработать в порядке 0, 1,2, 3, 4, 5, 6, 7. Эго соответствует прохождению дерева вглубь, причем узлы четырех передних под- октантов октанта 0 видимы перед узлами четырех задних подоктантов. При каждом делении октанта прохождение октодерева выполняется в таком порядке.
756 Глава 9. Методы исследования видимых поверхностей Рис. 9.24. При указанном направлении наблюдения объекты в октантах 0, 1, 2 и 3 затеняют объекты в задних октантах (4, 5, 6, 7) Когда при проходе восьмеричного дерева встречается код цвета, данный цвет записывается в квадродереве, только если для этой же области ранее не было запи- сано ни одного значения. При таком подходе записываются только цвета передних граней. Узлы, имеющие значение “пусто” (“void”), игнорируются. Любой полностью затеняемый узел исключается из дальнейшей обработки, так что его поддеревья недо- ступны. На рис. 9.25 изображены октанты области пространства и соответствующие квадранты на плоскости наблюдения. Вклады в квадрант 0 дают октанты 0 и 4. Коды цвета в квадранте 1 определяют поверхности в октантах 1 и 5, а коды в остальных двух квадрантах генерируются по значениям в парах октантов, соотнесенных с этими квадрантами. Эффективно проверить видимость по октодереву позволяет рекурсивная обра- ботка узлов октодерева и создание квадродерева для видимых поверхностей. В боль- шинстве случаев нужно рассмотреть и передний, и задний октант, чтобы определить правильный код цвета квадранта. Однако, если передний октант однородно закрашен некоторым цветом, задний октант не обрабатывается. Для неоднородных областей вы- зывается рекурсивная процедура, возвращающая в качестве новых аргументов потом- ки неоднородного октанта и свежесозданные узлы квадродерева. Если передний ок- тант пуст, необходимо обработать только потомки заднего октанта. В противном слу- чае делается два рекурсивных вызова, один для заднего октанта, один для переднего. Различные проекции объектов, представленные в форме октодерева, можно по- лучить, применив к представлению в форме октодерева преобразования, меняющие ориентацию объекта согласно выбранной проекции. Октанты можно затем перенуме- ровать так, чтобы представление в форме октодерева всегда имело на передней грани октанты 0, 1, 2 и 3.
9.10. Метод расчета луча 757 Квадранты плоскости наблюдения Рис. 9.25. Этапы деления октантов области пространства и плоскость соответствующего квадранта 9.10. МЕТОД РАСЧЕТА ЛУЧА Если рассмотреть луч, идущий от положения пикселя на плоскости наблюдения через сцену, как показано на рис. 9.26, можно определить, какие объекты на сцене (если такие есть) пересекают этот луч. После расчета всех точек пересечения луча с по- верхностью видимой считается поверхность, точка пересечения с которой является ближайшей к пикселю. В данной схеме исследования видимых поверхностей исполь- зуются процедуры расчета луча (ray casting), представленные в разделе 8.20. Расчет луча как средство исследования видимых поверхностей основан на методах геометри- ческой оптики, позволяющих отследить пути лучей света. Поскольку на сцене имеет- ся бесконечное число лучей света, а нас интересуют только те лучи, которые проходят через положения пикселей, можно отследить ход лучей света в обратном порядке — от пикселей на сцену. Отметим, что метод расчета лучей при анализе видимых поверх- ностей эффективен для сцен с криволинейными поверхностями, особенно сферами.
758 Глава 9. Методы исследования видимых поверхностей Рис. 9.26. Луч вдоль линии наблюдения от пикселя сквозь сцену Расчет луча можно рассматривать как разновидность метода буфера глубины (раз- дел 9.3). В алгоритме буфера глубины поверхности обрабатываются по одной, и для всех спроектированных точек поверхности вычисляются значения глубины. Затем рассчитанные глубины поверхностей сравниваются с ранее записанными глубинами, чтобы для каждого пикселя определить видимую поверхность. В методе расчета лу- чей по одному обрабатываются пиксели, и для всех поверхностей, проектирующихся в этот пиксель, вычисляются глубины. Расчет луча является частным случаем алгоритма построения хода луча (ray- tracing) (раздел 10.11), прокладывающим несколько путей луча, чтобы учесть гло- бальные вклады в отражение и преломление от нескольких объектов сцены. При рас- чете же луча луч прослеживается только от каждого пикселя до ближайшего объекта. В настоящее время разработаны эффективные формулы расчета точки пересечения луча с поверхностью распространенных объектов, например, сфер; подробно данные методы рассмотрены в разделе 10.11. 9.11. СРАВНЕНИЕ МЕТОДОВ ИССЛЕДОВАНИЯ ВИДИМЫХ ПОВЕРХНОСТЕЙ Эффективность метода исследования видимых поверхностей зависит от характери- стик конкретного приложения. Если поверхности на сцене значительно распределены вдоль направления наблюдения, и существует крайне незначительное перекрытие по глубине, часто эффективнее использовать методы сортировки по глубине или BSP- дерева. Если проекции поверхностей на плоскость наблюдения немного перекрыва- ются, видимые поверхности проще локализовать с использованием строк развертки или деления области.
9.12. Криволинейные поверхности 759 Исходя из сказанного, можно сформулировать общее правило: если сцена содер- жит малое число поверхностей, крайне эффективным подходом является алгоритм сортировки по глубине или метод BSP-дерева. Это объясняется тем, что подобные сцены обычно содержат мало поверхностей, перекрывающихся по глубине. Когда сце- на содержит малое число поверхностей, хорошие результаты также дает метод строк развертки. Чтобы эффективно определить видимые поверхности для сцен, содержа- щих до нескольких тысяч многоугольных поверхностей, можно использовать метод строк развертки, сортировки по глубине или метод BSP-дерева. Для сцен, содержа- щих более нескольких тысяч поверхностей, лучшим является метод буфера глубины или восьмеричного дерева. Для метода буфера глубины характерно почти постоянное время обработки, независимо от числа поверхностей на сцене. Это так, потому что размер областей поверхности уменьшается при увеличении числа поверхностей на сцене. Следовательно, метод буфера глубины имеет относительно невысокую произ- водительность на простых сценах и сравнительно большую — на сложных сценах. BSP-деревья полезны, когда соответствующие проекции требуется рассчитать для нескольких точек наблюдения. Если сцена содержит криволинейные поверхности, то, чтобы определить видимые части сцены, можно использовать метод октодерева или расчета лучей. Когда в системе используется октодерево, процесс исследования видимых по- верхностей быстр и прост. В нем используются только целые сложения и вычитания, поэтому не нужно выполнять сортировку или расчет точек пересечения. Другое до- стоинство октодеревьев заключается в том, что в них записана не только геометрия поверхностей. Для отображения доступен весь объем объекта, что делает представ- ление в форме октодеревьев полезным при расчете сечений трехмерных объектов. Методы исследования видимых поверхностей можно различным образом при- менять и объединять. Кроме того, алгоритмы исследования видимых поверхностей часто реализуются аппаратно, и в специальных системах для увеличения эффектив- ности этих методов используется параллельная обработка. Если вопрос скорости об- работки критичен, как при генерации анимированных изображений для пилотажных тренажеров, применяются специальные аппаратные системы. 9.12. КРИВОЛИНЕЙНЫЕ ПОВЕРХНОСТИ В число эффективных методов определения видимости объектов при наличии на сцене криволинейных поверхностей входят расчет лучей и метод октодерева. При расчете лучей определяются точки пересечения луча с поверхностями и расстояние вдоль луча до ближайшей точки пересечения. При использовании октодеревьев про- сто прослеживаются узлы от переднего к заднему плану, и определяются коды цветов поверхностей. После того как представление в форме октодерева будет построено по входным определениям объектов, все видимые поверхности выявляются с помощью
760 Глава 9. Методы исследования видимых поверхностей рассмотренных выше процедур обработки. Никаких принципиальных отличий при работе с криволинейными поверхностями не возникает. Криволинейную поверхность можно также аппроксимировать многоугольной сет- кой, а затем использовать один из рассмотренных выше методов исследования види- мых поверхностей. Стоит, однако, отметить, что для некоторых объектов (например, сфер) эффективнее и точнее будет использовать расчет лучей и уравнения криволи- нейных поверхностей. ПРЕДСТАВЛЕНИЯ КРИВОЛИНЕЙНЫХ ПОВЕРХНОСТЕЙ Поверхность можно представить с помощью неявного уравнения вида f(x, y,z) = Q или посредством параметрического представления (см. приложение А). Сплайно- вые поверхности, например, обычно описываются параметрическими уравнениями. В некоторых случаях бывает полезно получить и явное уравнение поверхности, на- пример, уравнение высот точек над плоскостью ху: z = f(x,y). Многие интересные объекты, такие как сферы, эллипсоиды, цилиндры и конусы, имеют квадратическое представление и широко используются для моделирования молекулярных структур, роликовых подшипников, колец и осей. В алгоритмах строк развертки и расчета луча часто фигурируют методы числен- ной аппроксимации, с помощью которых решается уравнение поверхностей в точке пересечения со строкой развертки или лучом пикселя. Разработано множество мето- дов решения уравнений пересечения с криволинейной поверхностью для наиболее распространенных объектов, включающих параллельные расчеты и быстрые аппа- ратные реализации. ГРАФИКИ КОНТУРОВ ПОВЕРХНОСТИ Во многих приложениях в математике, физике и других отраслях полезно быва- ет отобразить поверхностную функцию с помощью набора контурных линий, де- монстрирующих форму поверхности. Поверхность можно описать уравнением или таблицами данных, например, топографическими данными высот или плотностью населения. Имея явное функциональное представление, можно изобразить видимые контурные линии поверхности и удалить участки контура, скрытые видимыми частя- ми поверхности. Чтобы получить график в координатах функциональной поверхности ху, пред- ставление поверхности можно записать в виде У = f(x,z). (9.8)
9.12. Криволинейные поверхности 761 Затем кривая на плоскости ху изображается для значений z, принадлежащих некоторому выбранному диапазону при заданном интервале Аг. Начиная с наиболь- шего значения z, рисуются кривые от “переднего” к “заднему” плану, и удаляются скрытые сегменты. Сегменты кривых представляются на экране как отображение диапазона ху функции в диапазон ху пикселей экрана. Затем по х берутся единич- ные шаги, и из уравнения (9.8) для каждого х при данном значении z определяется соответствующее значение у. Один способ определения видимых сегментов кривых на поверхности заключает- ся в следующем: поддерживается список значений уПШ1 и утах, ранее рассчитанных для координат х пикселя на экране. При переходе от одного положения пикселя х к следующему рассчитанное значение у проверяется на принадлежность записанному диапазону ymin и утах для следующего пикселя. Если ymin < у < уп1ах, то точка на поверхности невидима, и она не изображается. Однако, если рассчитанное значение у находится вне записанных границ у для указанного пикселя, точка видима. Далее рисуется точка и обновляются границы этого пикселя. Подобные процедуры можно использовать для проектирования контуров на плоскость xz или yz. На рис. 9.27 приведен пример графика контуров поверхности с цветными линиями контуров. Те же методы можно применить и к дискретному набору точек данных для опре- деления горизонталей. Например, если дан дискретный набор значений z для сетки пх на пу значений ху, то на поверхности можно определить путь линии постоянно- го z, используя методы построения контуров, рассмотренные в разделе 8.27. Затем каждую выбранную линию контура можно спроектировать на плоскость наблюдения и отобразить прямыми отрезками. Как и ранее, линии можно рисовать на дисплее в порядке от переднего плана к заднему и не изображать части контуров, проходящие за ранее нарисованными (видимыми) линиями контуров. Рис. 9.27. График контуров поверхности с цветовым кодированием (перепечатано с разрешения Национальной лаборатории Лос-Аламоса)
762 Глава 9. Методы исследования видимых поверхностей 9.13. МЕТОДЫ ОПРЕДЕЛЕНИЯ ВИДИМОСТИ ДЛЯ КАРКАСНЫХ ИЗОБРАЖЕНИЙ Сцены обычно не содержат изолированных отрезков, если это не изображения графи- ков, диаграмм или схем сети дорог. Однако часто трехмерную сцену нужно изобра- зить в виде контуров, чтобы быстро получить изображение деталей объекта. Наиболее быстрый способ получения каркасного вида сцены — это отобразить все грани объ- ектов. В то же время, при таком изображении может быть трудно идентифицировать передние и задние элементы объекта. Одно решение этой проблемы заключается в применении затухания с глубиной (depth cueing), чтобы отображенная интенсивность линии была функцией ее расстояния от наблюдателя. В качестве альтернативы можно использовать проверки видимости, и, либо удалить скрытые отрезки, либо изобра- зить их иначе, чем видимые края. Процедуры определения видимости краев объектов называются методами исследования видимости для каркасных изображений, мето- дами исследования видимых линий или методами исследования невидимых линий. Кроме того, некоторые методы исследования видимых поверхностей, рассмотренные в предыдущих разделах, можно использовать для проверки видимости краев. АЛГОРИТМЫ ИССЛЕДОВАНИЯ ВИДИМЫХ ПОВЕРХНОСТЕЙ ДЛЯ КАРКАСНЫХ ОБЪЕКТОВ Прямой подход к определению видимых отрезков заключается в сравнении положе- ний краев с положениями поверхностей на сцене. В данном процессе используются те же методы, что и в алгоритмах отсечения линий. Следовательно, положение конечных точек отрезка проверяется относительно границ заданной области, но при проверке на видимость дополнительно требуется сравнить глубины краев и поверхности. Если обе конечные точки отрезка принадлежат области проекции поверхности, глубина конечных точек сравнивается с глубиной поверхности (х, у) в этих точках. Если обе конечные точки находятся за поверхностью, значит, край скрыт. Если обе конечные точки находятся перед поверхностью, край по отношению к данной поверхности является видимым. В противном случае нужно рассчитать точки пересечения и опре- делить глубины в этих точках пересечения. Если край имеет большую глубину, чем поверхность в точках пересечения периметра, часть края скрыта поверхностью, как показано на рис. 9.28, а. Возможен другой вариант — край имеет большую глубину в одной точке пересечения с границей и меньшую глубину, чем поверхность, в другой точке пересечения с границей (предполагается, что поверхности выпуклые). В этом случае нужно определить, где край проникает внутрь поверхности, как показано на рис. 9.28, б. Определив скрытую часть края, ее можно удалить, изобразить пунктиром или еще как-то визуально выделить, чтобы она отличалась от видимых поверхностей.
9.13. Методы определения видимости для каркасных изображений 763 б) Рис. 9.28. Скрытые части линии (пунктир), имеющей большую глубину, чем поверхность (панель а), и расположенной частично за и пе- ред поверхностью (панель б) Некоторые методы исследования видимых поверхностей легко приспосабливают- ся к проверке видимости каркаса из краев объекта. Используя метод задних граней, можно определить все задние поверхности объекта и отобразить только границы видимых поверхностей. Используя сортировку по глубине, поверхности можно нари- совать в буфере регенерации так, чтобы внутренние части поверхности имели цвет фона, а границы — цвет переднего плана. Если обрабатывать поверхности от заднего плана к переднему, невидимые линии будут закрываться более близкими поверх- ностями. Алгоритм удаления невидимых линий можно дополнить методом деления площади, отображая только границы видимых поверхностей. Наконец, для отобра- жения точек пересечения со строками развертки на границах видимых поверхностей можно использовать методы строк развертки. АЛГОРИТМ ЗАТУХАНИЯ С ГЛУБИНОЙ ДЛЯ КАРКАСНЫХ ОБЪЕКТОВ Другим методом отображения информации о видимости является изменение ярко- сти объектов на сцене согласно расстоянию от точки наблюдения. Данный метод затухания с глубиной (depth-cueing method) обычно применяется с использованием линейной функции /depthW = (99> ^max Gtmin
764 Глава 9. Методы исследования видимых поверхностей где d — расстояние точки от наблюдателя. Значения минимальной и максимальной глубин dmin и dmax можно положить равными величинам, удобным в конкретном приложении. Или же минимальную и максимальную глубины можно задать, пред- полагая нормированный диапазон частот: t/mjn = 0,0 и <4пах = 1>0- При обработке каждого пикселя цвет этого пикселя умножается на /depth (cQ- При этом ближние точ- ки отображаются с большими интенсивностями, а точки на максимальной глубине имеют интенсивность 0. Функцию затухания с глубиной можно реализовать с различными вариациями. В некоторых графических библиотеках доступна общая атмосферная функция (раз- дел 10.3), которая позволяет объединять затухание с глубиной с атмосферными эф- фектами, например, для имитации дыма или тумана. Таким образом цвет объекта можно модифицировать функцией затухания с глубиной, а затем объединить с цве- том атмосферы. 9.14. ФУНКЦИИ ИССЛЕДОВАНИЯ видимых ПОВЕРХНОСТЕЙ В OpenGL Методы удаления невидимых граней и методы проверки видимости с использова- нием буфера глубины можно применить к сценам, воспользовавшись функциями, предлагаемыми в основной библиотеке OpenGL. Кроме того, функции OpenGL при- меняются для построения каркасного изображения сцены с удаленными невидимыми линиями и отображения сцен с затуханием с глубиной. ФУНКЦИИ ОТБОРА МНОГОУГОЛЬНИКОВ OpenGL Удаление задних граней выполняется с помощью функции glEnable (GL_CULL_FACE); glCullFace (mode); Здесь параметру mode присваивается значение GL_BACK. Фактически данную функ- цию можно использовать и для удаления передних граней, более того, можно убрать и передние, и задние грани. Если точка наблюдения находится, например, внутри зда- ния, то будут наблюдаться только задние стороны объекта (внутренние части комна- ты). В этом случае можно либо присвоить параметру mode значение GL_FRONT, либо изменить определение передних многоугольников, используя функцию glFront- Face, рассмотренную в разделе 4.14. Затем, если точка наблюдения перемещает- ся из здания, можно убрать с изображения задние грани. Кроме того, в некоторых приложениях может потребоваться отобразить на сцене только такие определенные примитивы, как наборы точек и отдельные отрезки. Таким образом, чтобы удалить все многоугольные поверхности со сцены, параметру mode присваивается значение GL_FRONT_AND_BACK.
9.14. Функции исследования видимых поверхностей в OpenGL 765 По умолчанию параметр mode в функции glCullFace имеет значение GL_BACK. Следовательно, если активизировать функцию glEnable без явного вы- зова функции glCullFace, со сцены будут удалены задние грани. Процедура отбора выключается командой glDisable (GL_CULL_FACE); ФУНКЦИИ БУФЕРА ГЛУБИНЫ OpenGL Чтобы использовать процедуры OpenGL исследования видимых поверхностей с по- мощью буфера глубины, вначале необходимо модифицировать функцию инициализа- ции GLUT для режима отображения, чтобы она включала запрос к буферу глубины и буферу регенерации. Это можно сделать, например, с помощью оператора glutlnitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); Затем значения буфера глубины инициализируется с помощью функции glClear (GL_DEPTH_BUFFER_BIT); Обычно буфер глубины инициализируется с помощью того же оператора, который инициализирует буфер регенерации с цветом фона. При этом буфер глубины нужно очищать всякий раз, когда требуется отобразить на экране новый кадр. Отметим, что в OpenGL значения глубины нормируются в диапазон 0-1, так что предыдущая инициализация по умолчанию устанавливает все значения на максимум (1). Процедуры OpenGL исследования видимых поверхностей с помощью буфера глубины активизируются следующей функцией: glEnable (GL_DEPTH_TEST); Для деактивизации процедур буфера глубины используется функция glDisable (GL_DEPTH_TEST); Проверку видимости с помощью буфера глубины можно также выполнить с други- ми исходными значениями максимальной глубины, которые выбираются с помощью функции OpenGL glClearDepth (maxDepth); Параметру maxDepth можно присвоить любое значение между 0 и 1. Чтобы загрузить его в буфер глубины, нужно вызвать функцию glClear (GL_DEPTH_BUFFER_BIT). В противном случае буфер глубины инициализирует- ся со значением по умолчанию (1.0). Поскольку расчет цвета поверхности и другая обработка не выполняются для объектов, находящихся за заданной максимальной глубиной, данная функция может использоваться для ускорения процедур буфера глубины, когда сцена содержит много отдаленных объектов, расположенных позади объектов переднего плана.
766 Глава 9. Методы исследования видимых поверхностей В OpenGL координаты проекции нормируются в диапазон от —1,0 до 1,0, и значения глубины между ближней и дальней плоскостью отсечения затем дополни- тельно нормируются в диапазон от 0,0 до 1,0. Значение 0,0 соответствует ближней плоскости отсечения (плоскость проекции), а значение 1,0 — дальней. Как вариант, данные нормированные значения можно выравнять с помощью функции glDepthRange (nearNormDepth, farNormDepth); По умолчанию nearNormDepth = 0.0 и farNormDepth = 1.0. В то же время, используя функцию glDepthRange, можно присвоить данным параметрам любые значения из диапазона 0-1, включая nearNormDepth > farNormDepth. Используя функцию glDepthRange, можно ограничить проверки с помощью буфера глубины любой областью объема наблюдения и даже поменять местами ближнюю и дальнюю плоскости отсечения. Другой опцией, доступной в OpenGL, является условие проверки, которое будет использоваться процедурами буфера глубины. Условие проверки задается следующей функцией. glDepthFunc (testcondition); Параметру testcondition можно присвоить любое из следующих восьми значений: GL_LESS, GL_GREATER, GL_EQUAL, GL_NOTEQUAL, GL_LEQUAL, GL_GEQUAL, GL_NEVER (точки не обрабатываются), GL_ALWAYS (обрабатываются все точки). Данные проверки могут быть полезными в различных приложениях, где они позволяют сократить вычисления в буфере глубины. По умолчанию значение па- раметра testcondition — GL_LESS, так что значение глубины обрабатывается, ес- ли оно меньше текущего значения в буфере глубины для данного положения пикселя. Кроме того, можно задать статус буфера глубины — “только чтение” или “чтение- запись”. Для этого используется следующая функция: glDepthMask (writeStatus); Если writeStatus = GL_TRUE (значение по умолчанию), из буфера глубины можно считывать значения и производить запись в буфер. При writeStatus = GL_FALSE режим записи в буфер глубины невозможен, допускается только извле- чение значений для сравнения при проверках глубин. Данная возможность полезна, когда требуется использовать некоторый сложный фон при отображении различных объектов переднего плана. После записи фона в буфер глубины режим записи от- ключается, и выполняется обработка переднего плана. Это позволяет генерировать ряд кадров с различными объектами переднего плана или одним объектом в раз- личных позах для анимационной последовательности. Таким образом, записываются только значения глубины фона. Другой сферой применения функции glDepthMask является отображение эффектов прозрачности (раздел 10.20). В этом случае требует-
9.14. Функции исследования видимых поверхностей в OpenGL 767 ся записать только глубины непрозрачных объектов для проверок видимости, но не глубины точек прозрачной поверхности. Поэтому при обработке прозрачной поверх- ности режим записи для буфера глубины отключается. МЕТОДЫ OpenGL ИССЛЕДОВАНИЯ ВИДИМЫХ КАРКАСНЫХ ПОВЕРХНОСТЕЙ Каркасное изображение стандартных графических объектов получается в OpenGL путем генерации только краев этих объектов. Для этого функция режима многоуголь- ников (раздел 4.14) задается, например, в таком виде: glPolygonMode (GL_FRONT_AND_BACK, GL_LINE); Отметим, однако, что данная команда отображает видимые и невидимые края. Чтобы убрать невидимые линии с каркасного изображения, можно воспользовать- ся методом сдвига по глубине, описанным в разделе 4.14. Следовательно, вначале с помощью цвета переднего плана задается каркасная версия объекта, затем сдвигом по глубине задается схема заполнения внутренней части и цвет фона для внутренне- го заполнения. Сдвиг по глубине гарантирует, что заполнение цветом фона не будет мешать изображению видимых краев. Например, в следующем фрагменте кода гене- рируется каркасное изображение объекта с использованием белого цвета переднего плана и черного цвета фона. glEnable (GL_DEPTH_TEST); glPolygonMode (GL_FRONT_AND_BACK, GL_LINE); glColor3f (1.0, 1.0, 1.0); /* Вызывается процедура описания объекта. */ glPolygonMode (GL_FRONT_AND_BACK, GL_FILL); glEnable (GL_POLYGON_OFFSET_FILL); glPolygonOffset (1.0, 1.0); glColor3f (0.0, 0.0, 0.0); /* Снова вызывается процедура описания объекта. */ glDisable (GL_POLYGON_OFFSET_FILL); ФУНКЦИИ OpenGL ЗАТУХАНИЯ С ГЛУБИНОЙ Яркость объекта можно менять как функцию его расстояния от точки наблюдения, используя функцию glEnable (GL_FOG); glFogi (GL_FOG_MODE, GL_ LINEAR);
768 Глава 9. Методы исследования видимых поверхностей Данные команды применяют линейную функцию глубины, записанную в урав- нении (9.9), к цветам объекта, используя dmjn = 0,0 и dmax = 1,0- Однако можно задать и другие значения для dmin и <imax, вызывая следующие функции. glFogf (GL_FOG_START, minDepth); glFogf (GL_FOG_END, maxDepth); В данных функциях параметрам minDepth и maxDepth присваиваются зна- чения с плавающей запятой, хотя, изменив суффикс функции на i, можно будет использовать целые значения. Кроме того, с помощью функции glFog можно задать цвет атмосферы, который будет объединяться с цветом объекта после применения линейной функции затухания с глубиной. Можно также смоделировать другие атмосферные эффекты. Соответству- ющие возможности обсуждаются в разделе 10.20. 9.15. РЕЗЮМЕ Простейшей проверкой видимости является алгоритм исследования задних граней, быстрый и эффективный для начального отсеивания, устраняющего из дальнейших проверок на видимость значительное число многоугольников. Для одного выпуклого многогранника выявление задних граней исключает все невидимые поверхности, но в общем случае выявление задних граней не позволяет полностью найти все невиди- мые поверхности. Распространенным методом определения всех видимых поверхностей на сцене является алгоритм буфера глубины. При применении к стандартным графическим объектам данная процедура является весьма эффективной, но с ее использованием связаны дополнительные требования к памяти. Для работы метода нужно два бу- фера: один для хранения цветов пикселей и один для хранения значений глубины для положений пикселей. Для обработки каждого многоугольника на сцене (расчета глубин поверхностей) используются быстрые последовательные методы строк раз- вертки. При обработке каждой последующей поверхности два буфера обновляются. Расширением подхода буфера глубины является метод A-буфера, который предо- ставляет дополнительную информацию, необходимую для защиты от наложения и отображения прозрачных поверхностей. Разработано еще несколько методов исследования видимых поверхностей. Метод строк развертки одновременно обрабатывает все поверхности для каждой строки раз- вертки. В методе сортировки по глубине (алгоритм художника) объекты “рисуются” в буфере регенерации согласно их расстояниям от точки наблюдения. Определение видимых частей сцены с помощью схем деления представлено методом BSP-дерева, делением области и представлением в форме октодерева. Видимые поверхности так- же можно выявлять, используя методы расчета лучей, в которых путем проектиро- вания линий с плоскости пикселей на сцену определяются точки пересечения этих
Упражнения 769 линий проекции с объектами. Методы расчета лучей являются неотъемлемой частью алгоритмов построения хода луча, которые позволяют отображать сцены с эффектами глобального освещения. Методы исследования видимых поверхностей также используются при отобра- жении трехмерных рисунков от руки (line drawings). При наличии на сцене криво- линейных поверхностей можно отображать графики в горизонталях. Для построения каркасных изображений многогранников на сцене ищутся различные сегменты краев поверхностей, видимые из точки наблюдения. Любую схему исследования видимых поверхностей можно реализовать в программе-приложении, создав собственные процедуры, поскольку в графических библиотеках широко представлены функции только для устранения задних граней и метод буфера глубины, который в высокопроизводительных системах компьютерной графики реализован аппаратно. Функции отбора многоугольников и определения видимых поверхностей с помо- щью буфера глубины есть в корневой библиотеке OpenGL. С помощью этих процедур можно удалить задние грани стандартных графических объектов, их передние грани или и те, и другие. Используя процедуры буферы глубины, можно задать диапазон проверок глубины и тип проверок глубины, которые будут выполняться. Каркасные изображения строятся с использованием операций OpenGL для работы с режимами и сдвига многоугольников. Кроме того, сцены OpenGL можно также генерировать с использованием эффектов затухания с глубиной. Функции OpenGL для проверок на видимость сведены в табл. 9.1. Функции выбора режима многоугольников и других родственные операции перечислены в конце главы 4. I ЛИТЕРАТУРА В качестве дополнительных источников информации по алгоритмам исследования видимости реко- мендуются [91], [103], [230] и [310]. Методы A-буфера представлены в [63], [138] и [315]. Резюме по методам создания контуров приводится в [88]. Руководство по различным техникам программирования можно найти в [8], [122], [151], [176] и [244]. В работе [400] обсуждаются функции исследования видимых поверхностей OpenGL. Наконец, полный перечень функций OpenGL в корневой библиотеке и в GLU дан в [320]. УПРАЖНЕНИЯ 9.1. Разработайте процедуру исследования задних граней, которая определит все видимые грани любого входного выпуклого многогранника, имеющего поверхности разных цветов. Мно- гогранник должен быть определен в правосторонней системе координат, а направление на- блюдения вводится пользователем. 9.2. Реализуйте процедуру из предыдущего упражнения, используя ортографическое параллель- ное проектирование для отображения на экране видимых граней входного выпуклого мно- гогранника. Предполагайте, что все части объекта находятся перед плоскостью наблюдения.
770 Глава 9. Методы исследования видимых поверхностей ТАБЛИЦА 9.1 .Резюме по функциям OpenGL исследования видимости Функция Описание glCullFace При активизации c glEnable (GL_CULL_FACE) указывает, какие плос- кости многоугольников (задние или передние) будут задействованы в операциях отбора glutlnitDisplayMode Задает операции в буфере глубине с использо- ванием аргумента GLUT_DEPTH glClear Инициализирует буфер глубины со значением (GL_DEPTH_BUFFER_BIT) по умолчанию 1.0 или значением, заданным функцией glClearDepth glClearDepth Задает исходное значение буфера глубины glEnable (GL_DEPTH_TEST) Активизирует операции проверок глубин glDepthRange Задает диапазон нормированных значений глубины glDepthFunc Задает условия проверок глубины glDepthMask Устанавливает статус записи для буфера глубины glPolygonOffset Задает смещение, чтобы устранить скрытые ли- нии на каркасном изображении при применении заполнения цветом фона glFog Задает линейные операции затухания с глуби- ной и значения минимальной и максимальной глубин в расчетах затухания с глубиной 9.3. Реализуйте процедуру из упражнения 9.1, используя перспективную проекцию для вывода на экран видимых граней входного выпуклого многогранника. Предполагайте, что все части объекта расположены перед плоскостью наблюдения. 9.4. Напишите программу анимации выпуклого многогранника. Объект должен вращаться во- круг оси, проходящей через объект параллельно плоскости наблюдения. Предполагайте, что объект целиком лежит перед плоскостью наблюдения. Используйте ортографическую парал- лельную проекцию для последовательного отображения проекций на плоскость наблюдения. 9.5. Напишите процедуру реализации метода буфера глубины для отображения видимых поверх- ностей любого входного многогранника. Размер массива, используемого в буфере глубины, выбирается согласно требованиям системы, например 500 на 500. Как требования к памяти, касающиеся буфера глубины, выводятся из определений отображаемых объектов? 9.6. Модифицируйте процедуру из предыдущего упражнения, чтобы она отображала видимые поверхности на сцене, содержащей любое число многогранников. Разработайте эффектив- ные методы записи и обработки различных объектов сцены.
Упражнения 771 9.7. Модифицируйте процедуру из предыдущего упражнения и реализуйте алгоритм А-буфера для отображения сцены, содержащей прозрачные и непрозрачные поверхности. 9.8. Расширьте процедуру из предыдущего упражнения, чтобы она включала защиту от наложения. 9.9. Разработайте программу — реализацию алгоритма строк развертки для отображения ви- димых поверхностей данного многогранника. Используйте таблицы многоугольников для хранения определений объекта и используйте техники когерентности для вычисления точек вдоль строк развертки и между ними. 9.10. Напишите программу реализации алгоритма строк развертки для сцены, содержащей несколько многогранников. Используйте таблицы многоугольников для хранения опреде- лений объекта и техники когерентности для вычисления точек вдоль строк развертки и между ними. 9.11. Разработайте программу отображения видимых поверхностей выпуклого многогранника с использованием алгоритма художника. Поверхности должны сортироваться по глубине и изображаться на экране от фона к переднему плану. 9.12. Напишите программу, использующую метод сортировки по глубине для отображения види- мых поверхностей любого данного объекта с плоскими гранями. 9.13. Разработайте программу сортировки по глубине для отображения видимых поверхностей на сцене, содержащей несколько многогранников. 9.14. Напишите программу отображения видимых поверхностей выпуклого многогранника с ис- пользованием метода BSP-дерева. 9.15. Приведите примеры ситуаций, когда два метода, рассмотренных при обсуждении условия 3 в алгоритме деления области, не смогут корректно идентифицировать окружающую поверх- ность, затеняющую все другие поверхности. 9.16. Разработайте алгоритм, сравнивающий данную плоскую поверхность с прямоугольной об- ластью, чтобы определить, является ли поверхность окружающей, накладывающейся, внут- ренней или внешней. 9.17. Создайте алгоритм генерации представления в форме квадродерева видимых поверхностей объекта. Значения элементов дерева должны определяться из проверок методом деления области. 9.18. Разработайте алгоритм хранения в буфере кадра представления объекта в форме квадродерева. 9.19. Составьте процедуру отображения видимых поверхностей объекта, представленного в фор- ме октодерева. 9.20. Напишите алгоритм наблюдения одной сферы с использованием метода расчета лучей. 9.21. Обсудите, как методы защиты от наложения можно внедрить в различные алгоритмы устра- нения скрытых поверхностей. 9.22. Напишите процедуру генерации представления поверхности с горизонталями для данной поверхностной функции 9.23. Разработайте алгоритм исследования видимых участков линий на сцене, сравнивающий каждую линию сцены с каждой многоугольной гранью поверхности. 9.24. Обсудите, как на основе различных методов исследования видимых поверхностей, рассмот- ренных в данной главе, можно получить каркасные изображения. 9.25. Разработайте процедуру генерации каркасного изображения многогранника, невидимые края которого показаны пунктиром.
772 Глава 9. Методы исследования видимых поверхностей 9.26. Напишите программу отображения многогранника с удаленными выбранными гранями, ис- пользуя функции OpenGL отбора многоугольников. Каждая грань многоугольника должна отличаться цветом, а выбор удаляемой грани производиться пользователем. Кроме того, точка наблюдения и другие параметры наблюдения задаются как входные значения. 9.27. Модифицируйте программу из предыдущего упражнения, чтобы многогранник можно было наблюдать из любой точки, кроме того, вместо процедур отбора многоугольников исполь- зуйте процедуры буфера глубины. 9.28. Модифицируйте программу из предыдущего упражнения, чтобы пользователь мог вводить диапазон глубин и условие сравнения глубин. 9.29. Сгенерируйте каркасное изображение многогранника, используя функции glPolygonMode и glPolygonOf f set, как обсуждалось в разделе 9.14. 9.30. Модифицируйте программу из предыдущего упражнения, чтобы она отображала многогран- ник, используя функцию затухания с глубиной glFogi. 9.31. Модифицируйте программу из предыдущего упражнения, чтобы она отображала несколь- ко многогранников, расположенных на разных глубинах. Диапазон затухания с глубиной должен вводиться пользователем.
ГЛАВА 10 Модели освещения и методы визуализации поверхностей Сцена из компьютерного анимационного фильма Final Fantasy: The Spirits Within, демонстрирующая эффекты освещения при имитации взрывающегося духа (перепечатано с разрешения Square Pictures, Inc. ©2001, FFFP)
10.1. Источники света 10.12. Модель диффузного отражения 10.2. Эффекты освещения поверхности 10.13. Отображение среды 10.3. Стандартные модели освещения 10.14. Отображение фотонов 10.4. Прозрачные поверхности 10.15. Добавление деталей поверхности 10.5. Атмосферные эффекты 10.16. Моделирование деталей поверхности с 10.6. Тени помощью многоугольников 10.7. Параметры камеры 10.17. Наложение текстуры 10.8. Отображения интенсивности света 10.18. Отображение шероховатости 10.9. Полутоновые узоры и методы 10.19. Отображение кадра добавления случайного шума 10.20. Функции освещения и визуализации 10.10. Методы визуализации поверхностей OpenGL многоугольников 10.21. Функции текстурирования OpenGL 10.11. Методы построения хода лучей 10.22. Резюме ч тобы получить реалистичное отображение сцены, нужно сгенерировать перспективные проекции объектов и применить эффекты естественного освещения видимых поверхностей. Для расчета цвета освещенной точки на поверхности объекта используется модель освещения, также иногда называемая моделью затенения. Расчет цвета по модели освещения используется в методе визуализации поверхностей для определения цвета пикселей, в которые пе- реходят все спроектированные точки сцены. Модель освещения можно применить к любой точке. Визуализация поверхности выполняется путем интерполяции цветов поверхностей в модели освещения с помощью несложных вычислений. Алгоритмы строк развертки в пространстве изображений обычно реализуют схемы интерполя- ции, тогда как алгоритмы построения хода лучей могут в каждом пикселе вызывать модели освещения. Иногда процедуру визуализации поверхности называют методом затенения, рассчитывающим цвета поверхности с использованием модели затенения, но это может привести к путанице между указанными двумя терминами. Чтобы избе- жать неудобств, вызванных использованием сходной терминологии, будем называть модель расчета интенсивности света в отдельной точке поверхности моделью осве- щения, а термин визуализация поверхности будет означать применение модели осве- щения для получения цветов пикселей, в которые проектируются точки поверхности.
776 Глава 10. Модели освещения и методы визуализации поверхностей Чтобы добиться в компьютерной графике фотореалистичности, нужны два эле- мента: точное представление свойств поверхности и хорошее физическое описание эффектов освещения на сцене. В число этих эффектов входят отражение света, про- зрачность, текстура поверхности и тени. Вообще, моделирование эффектов освещения, наблюдаемых на объекте, является сложным процессом, в котором задействованы принципы, относящиеся как к фи- зике, так и к физиологии. По сути, эффекты освещения описываются моделями, в которых рассматривается взаимодействие электромагнитной энергии с поверхностью объекта на сцене. Свет, попадая в глаза, инициирует процесс восприятия, который и определяет, что в действительности мы “видим”. Физические модели освещения включают множество таких факторов, как свойства материала, положение объекта относительно источников света и других объектов, а также свойства источников све- та. Объекты могут быть сделаны из непрозрачных материалов или быть в какой-то степени прозрачными. Кроме того, они могут иметь блестящие или матовые поверх- ности, а также содержать различные текстурные узоры. Для освещения сцены могут использоваться источники света, имеющие различные формы, цвета и положения. Для заданных оптических свойств поверхностей, относительного положения поверх- ностей на сцене, цвета и положения источников света, характеристик источников света и положения и ориентации плоскости наблюдения модель освещения позволя- ет рассчитать интенсивность света, исходящего из определенной точки поверхности в заданном направлении наблюдения. Модели освещения в компьютерной графике часто представляют собой аппрок- симации законов физики, описывающих эффекты освещения поверхности. Чтобы сократить объем вычислений, в большинстве пакетов используются эмпирические модели, основанные на упрощенных фотометрических расчетах. В таких более точ- ных моделях, как алгоритмы диффузного отражения, для вычисления интенсивности света рассматривается распространение энергии излучения от источника света до различных поверхностей сцены. В последующих разделах рассматриваются базовые модели освещения, часто используемые в системах компьютерной графики; затем об- суждаются более точные, хотя и более сложные, методы определения внешнего вида освещенных поверхностей. Кроме того, разбираются различные алгоритмы визуали- зации поверхности, позволяющие использовать модели освещения для эффективного отображения природных сцен. 10.1. ИСТОЧНИКИ СВЕТА Любой объект, излучающий энергию, является источником света, дающим вклад в эффекты освещения других объектов сцены. При моделировании источников света им можно придавать различные формы и характеристики, и большинство излучателей (источников излучения) служат только для формирования освещения сцены. Впро-
10.1. Источники света 777 Рис. 10.1. Лучи, расходящиеся от точечного источника света чем, в некоторых приложениях может потребоваться объект, являющийся одновре- менно источником и отражателем света. Например, пластмассовый шар, окружающий электрическую лампочку, и излучает, и отражает свет, поступающий от нее. Впрочем, данный шар можно также смоделировать как полупрозрачную поверхность, окружаю- щую источник света. Однако для таких объектов, как большая панель дневного света, удобнее будет описать поверхность просто как комбинацию излучателя и отражателя. Для того чтобы определить источник света, используется множество свойств. Можно задать его положение, цвет излучаемого света, направление излучения и фор- му источника. Если источник, к тому же, является светоотражающей поверхностью, для него следует задать параметры отражающих свойств. Кроме того, можно указать, что источник света излучает в разных направлениях свет различных цветов. Напри- мер, источник света излучает красный свет с одной стороны и зеленый — с другой. В большинстве приложений, особенно в сфере отображения на экран в реальном времени, используются простые модели источников света, позволяющие избежать громоздких вычислений. Чтобы указать свойства излучаемого света, задается по од- ному значению для каждого RGB-компонента, а их объединение описывает величину, или интенсивность, данного цветового компонента. Подробно параметры цвета и мо- дели источников света описаны в главе 12. ТОЧЕЧНЫЕ ИСТОЧНИКИ СВЕТА Простейшая модель объекта, излучающего световую энергию, — это точечный источ- ник света, имеющий один цвет, заданный тремя RGB-компонентами. Чтобы задать для сцены точечный источник света, указывается его положение и цвет излучаемого света. Как показано на рис. 10.1, лучи света генерируются вдоль радиально расхо- дящихся лучей, начинающихся в одноцветной точке-источнике. Подобная модель из- лучателя разумно аппроксимирует источники, размеры которых малы по сравнению с размером объектов на сцене. Кроме того, большие излучатели можно моделиро- вать как точечные, если они расположены не слишком близко к сцене. Отметим, что положение точечного излучателя в модели освещения используется для того, что- бы определить, какие объекты на сцене освещаются этим источником, и рассчитать направление света к выбранной точке поверхности объекта.
778 Глава 10. Модели освещения и методы визуализации поверхностей Рис. 10.2. Лучи света от бесконечно удаленного источника освещают объект по прибли- зительно параллельным путям распространения света БЕСКОНЕЧНО УДАЛЕННЫЕ ИСТОЧНИКИ СВЕТА Большой источник света, такой как солнце, расположенный очень далеко от сцены, также можно было бы аппроксимировать точечным излучателем, но в его направ- ленном действии наблюдаются незначительные колебания. В противоположность ис- точникам света, расположенным в середине сцены и освещающим объекты со всех сторон источника, удаленный источник освещает сцену только в одном направле- нии. Пути света от удаленного источника к любой точке сцены примерно равны, как показано на рис. 10.2. Бесконечно удаленный источник света можно смоделировать, присвоив ему код цвета и фиксированное направление лучей света, выходящих из источника. Для рас- чета освещения требуется только вектор направления излучения и цвет источника света, но не его положение. РАДИАЛЬНОЕ ЗАТУХАНИЕ ИНТЕНСИВНОСТИ При распространении лучистой энергии от источника света сквозь пространство ее амплитуда на любом расстоянии di от источника затухает с коэффициентом 1/dp. Это означает, что поверхность, близкая к источнику света, получает больше падающего света от источника, чем более удаленные поверхности. Следовательно, чтобы создать реалистичные эффекты освещения, это затухание интенсивности следует учесть. В противном случае все поверхности будут освещаться с одинаковой интенсивностью, и могут проявиться нежелательные эффекты. Например, если проекции двух поверх- ностей с одинаковыми оптическими параметрами перекрываются, они будут неотли- чимы друг от друга, т.е. независимо от их относительного расстояния до источника света, две поверхности будут казаться одной.
10.1. Источники света 779 На практике, однако, использование коэффициента затухания 1/dp и точечного излучателя не всегда дает реалистичные изображения. Коэффициент 1/dp обычно приводит к слишком большому разбросу интенсивностей для объектов, близких к источнику света, и крайне малому — при большом <7/. Это объясняется тем, что ре- альные источники света не являются инфинитезимальными точками, и освещение сцены точечными излучателями является просто аппроксимацией освещения истин- ными источниками. Чтобы получить более реалистичные изображения с использова- нием точечных источников, затухание интенсивности можно смоделировать обратной квадратической функцией от di, включающей линейный член: /рад. затух, (di) = • - • . (10.1) «о + «1 «/ + «2 df Затем численные значения коэффициентов ао, а1 и а2 подгоняются так, чтобы полу- чить оптимальные эффекты затухания. Например, можно присвоить большое значе- ние коэффициенту ао ПРИ очень маленьком di, чтобы величина /radatten(^/) не стала слишком большой. В качестве дополнительной меры, часто доступной в графиче- ском пакете, со всеми точечными источниками на сцене можно соотнести различные наборы коэффициентов затухания. Расчет затухания интенсивности по уравнению (10.1) нельзя применить к точеч- ному излучателю “на бесконечности”, поскольку расстояние до источника света в этом случае не определено. Кроме того, все точки на сцене расположены пример- но на равном расстоянии от отдаленного источника. Чтобы объединить удаленные и локальные источники света, функцию затухания интенсивности можно выразить следующим образом: 1, если источник на бесконечности; 1 (10.2) --------:------, если источник локальный. а0 + ai di + а2 df ИСТОЧНИКИ НАПРАВЛЕННОГО СВЕТА И ПРОЖЕКТОРНЫЕ ЭФФЕКТЫ Локальный источник света можно легко модифицировать, чтобы он генерировал на- правленный, или прожекторный, луч света. Если объект находится вне границ на- правленного излучения, освещение, порождаемое этим источником на этом объекте, можно не рассматривать. Один путь задания направленного источника света — при- своить ему (в дополнение к его положению и цвету) векторное направление и границу по углу 0(, измеряемую от этого векторного направления. В результате определяет- ся коническая область пространства, причем вектор направления от источника света идет по оси конуса (рис. 10.3). Таким же образом можно смоделировать многоцвет- ный точечный источник света, используя множественные направляющие векторы и различные цвета излучения для каждого направления. fl,рад. затух. —
780 Глава 10. Модели освещения и методы визуализации поверхностей Рис. 10.3. Направленный точечный источник све- та. Единичный вектор направления света опре- деляет ось конуса света, а угол 0i — угловые гра- ницы кругового конуса света Обозначим через единичный вектор в направлении источника света, а Vobj — единичный вектор в направлении от положения источника к положению объекта. Далее получаем Vobj * Vjight — cos сс, (Ю.З) где угол a — угловое расстояние объекта от вектора направления света. Если ограни- чить угловые границы конуса света так, чтобы 0° < 0/ < 90°, то объект будет нахо- диться внутри конуса света, если cos а > cos 0i, как показано на рис. 10.4. Однако, если Vobj • V]jght < cos 0i, объект находится вне конуса света. УГЛОВОЕ ЗАТУХАНИЕ ИНТЕНСИВНОСТИ Для направленного источника света угловое затухание можно реализовать так же, как радиальное затухание излучения точечного источника. Это позволяет смоделировать конус света, дающий наибольшую интенсивность вдоль оси конуса с падением ин- тенсивности при удалении от оси конуса. Широко используется следующая функция углового затухания интенсивности для направленного источника: /angatten (<?) — COSai 0, 0° < ф < 0, (Ю.4) где показателю затухания сц присваивается некоторое положительное значение, а угол ф измеряется от оси конуса. Вдоль оси конуса ф = 0° и /angatten (0) = 1, 0- Чем больше значение коэффициента затухания а/, тем меньше значение функции углового затухания интенсивности для данного значения угла ф > 0°.
10.1. Источники света 781 света Рис. 10.4. Объект, освещенный на- правленным точечным источником света При реализации функции углового затухания стоит рассмотреть несколько част- ных случаев. Углового затухания не существует, если источник света ненаправленный (не прожектор). Кроме того, объект не освещается источником света, если объект на- ходится где-либо за пределами конуса прожектора. Чтобы определить коэффициент углового затухания вдоль линии, соединяющей источник света с точкой поверхности на сцене, можно рассчитать косинус направляющего угла от оси конуса, используя скалярное произведение, представленное в уравнении (10.3). Обозначим как Viight единичный вектор в направлении источника света (вдоль оси конуса), a Vobj — еди- ничный вектор в направлении от источника света к положению объекта. Используя эти два вектора и предполагая, что 0° < < 90°, можно записать общее уравнение углового затухания: '1,0, 0,0, .angatten 1 Д Vo6. • vCBeT)a‘ если источник не является прожектором; если Vobj • VCBeT = cos а < cos 0[ (объект вне конуса прожектора); в противном случае. (10.5)
782 Глава 10. Модели освещения и методы визуализации поверхностей Рис. 10.6. Студийные эффек- ты освещения, полученные с помощью модели Вона с использованием пяти точеч- ных источников, освещающих Chevrolet Camaro (перепеча- тано с разрешения Дэвида Во- на (David R. Warn), General Motors Research Laboratories) Рис. 10.5. Объект, освещаемый большим близлежащим точечным источником света НЕТОЧЕЧНЫЕ ИСТОЧНИКИ СВЕТА И МОДЕЛЬ ВОНА Если требуется включить большой источник света в точке, близкой к объекту на сцене, например, длинную неоновую лампу, изображенную на рис. 10.5, его можно аппрок- симировать светоизлучающей поверхностью. Это можно сделать, например, пред- ставив поверхность света сеткой направленных точечных излучателей. Направления точечных источников задаются так, чтобы объекты, расположенные позади светоиз- лучающей поверхности, не освещались. Кроме того, можно задействовать другие па- раметры, чтобы ограничить направление излучаемого света вблизи краев источника. Модель Вона (Warn model) позволяет имитировать студийные эффекты освещения с использованием наборов точечных излучателей с различными параметрами, моде- лирующими применяемые фотографами шторки, заслонки и прожекторное освеще- ние. Прожекторное освещение реализуется с помощью рассмотренного ранее конуса света, а шторки и заслонки позволяют дополнительно корректировать освещение. Например, для каждого направления х, у и z можно задать две заслонки, что до- полнительно ограничит путь излучаемого света. Данная имитация источника света реализуется в некоторых графических пакетах, а на рис. 10.6 иллюстрируются эф- фекты освещения, которых можно добиться с помощью модели Вона.
10.2. Эффекты освещения поверхности 783 Рис. 10.7. Диффузное отражение от поверхности Рис. 10.8. Зеркальное отражение, наложенное на векторы диффузного отражения 10.2. ЭФФЕКТЫ ОСВЕЩЕНИЯ ПОВЕРХНОСТИ Модель освещения рассчитывает эффекты освещения для поверхности на основе различных оптических свойств, приписанных этой поверхности. Данные свойства включают степень прозрачности, коэффициенты отражения поверхности и различные параметры, относящиеся к ее текстуре. При падении света на непрозрачную поверхность часть света отражается, а часть поглощается. Величина падающего света, отраженного поверхностью, зависит от ти- па материала. Блестящие материалы отражают большую часть падающего света, а матовые поверхности больше поглощают падающий свет, кроме того, при падении света на прозрачную поверхность некоторое количество падающего света также про- ходит через материал. Грубые или зернистые поверхности рассеивают отраженный свет во всех на- правлениях. Данный рассеянный свет называется диффузным отражением. Очень шероховатые матовые поверхности дают преимущественно диффузное отражение, так что поверхность кажется одинаково яркой при любом угле наблюдения. Диффуз- ное рассеяние света с поверхности иллюстрируется на рис. 10.7. То, что мы называем цветом объекта, — это как раз цвет диффузного отражения при освещении объекта белым светом, который является комбинацией всех цветов. Синий объект, например, отражает синий компонент белого света и поглощает все остальные цветовые компо- ненты. Если синий объект наблюдается в красном свете, он будет казаться черным, поскольку весь падающий свет поглощается. Помимо диффузного рассеяния света некоторое количество отраженного света концентрируется в небольшом светлом участке, называемом точкой зеркального от- ражения или зайчиком. Данный эффект яркостного выделения более заметен на бле- стящих, чем на матовых (тусклых) поверхностях. Кроме того, зеркальное отражение можно наблюдать при взгляде на освещенную блестящую поверхность, такую как отполированный металл, яблоко, лоб человека, только под определенным углом. Кон- цепция зеркального отражения иллюстрируется на рис. 10.8.
784 Глава 10. Модели освещения и методы визуализации поверхностей Рис. 10.9. Эффекты освещения поверхности вследствие объеди- нения освещения от источников света с отражением от других поверхностей Другим моментом, который нужно рассмотреть при записи модели освещения, является фоновое, или общее, освещение сцены. Поверхность, на которую свет от источника не падает прямо, может все же быть видимой из-за отражения света от близлежащих освещенных объектов. Следовательно, общее освещение сцены — это эффект освещения, порожденный светом, отраженным от различных поверхностей сцены. Данный эффект фонового освещения иллюстрируется на рис. 10.9. Общий свет, отраженный от поверхности, — это сумма вкладов от всех источников света и света, отраженного другими освещенными объектами. 10.3. СТАНДАРТНЫЕ МОДЕЛИ ОСВЕЩЕНИЯ В точных моделях освещения поверхностей рассчитывается результат взаимодей- ствия падающей световой энергии с материалом объекта. Чтобы упростить расчет освещения поверхности, можно использовать приближенные представления физиче- ских процессов, дающих эффекты освещения, рассмотренные в предыдущем разделе. Изложенная ниже эмпирическая модель дает разумно хорошие результаты, поэтому она реализована в большинстве графических систем. Обычно все светоизлучающие объекты в стандартной модели освещения — это то- чечные источники. Однако многие графические пакеты предлагают дополнительные функции для работы с направленным светом (прожектором) и неточечными источни- ками света.
10.3. Стандартные модели освещения 785 РАССЕЯННЫЙ СВЕТ В принятой стандартной модели освещения имитацию фонового освещения мож- но создать, задав общий уровень яркости сцены, что даст равномерное рассеянное освещение, одинаковое для всех объектов. Данная модель аппроксимирует общее диффузное отражение от различных освещенных поверхностей. Предполагая, что описываются только монохроматические эффекты освещения, например, порождаемые оттенками серого, будем задавать уровень рассеянного света на сцене параметром интенсивности Ia. При этом каждая поверхность на сцене осве- щается данным фоновым светом. Отметим, что отражение, порожденное рассеянным светом, является просто разновидностью диффузного отражения, и оно не зависит от направления наблюдения и пространственной ориентации поверхности. Однако отражаемая величина падающего света зависит от оптических свойств поверхности, определяющих, какая доля падающей энергии отражается, а какая — поглощается. ДИФФУЗНОЕ ОТРАЖЕНИЕ Диффузное отражение от поверхности можно смоделировать, предполагая, что пада- ющий свет рассеивается с равной интенсивностью во всех направлениях, независимо от направления наблюдения. Подобные поверхности называются идеальными диф- фузными отражателями. Они также именуются ламбертовскими отражателями, поскольку отраженная от любой точки поверхности световая энергия подчиняется за- кону косинусов Ламберта. В этом законе говорится, что величина энергии излучения, поступающей от любой малой площади поверхности dA в направлении фк относи- тельно нормали к поверхности, пропорциональна cos фм (рис. 10.10). Интенсивность света в этом направлении можно вычислить как отношение энергии излучения за еди- 1 ницу времени к проекции площади поверхности в направлении излучения: энергия излучения за единицу времени Интенсивность = ----------------------------------- const. площадь проекции COS фм dA cos фм (10.6) Следовательно, для ламбертовского отражателя всех направлений наблюдения. интенсивность света одинакова для Напрвменяе (14 Рис. 10.10. Энергия излучения от элемента площади поверхности dA в направлении ф^ относительно нормали к поверхности про- порциональна СОБфх
786 Глава 10. Модели освещения и методы визуализации поверхностей Рис. 10.11. Поверхность, перпендикулярная направлению падающего света (па- нель а), освещается больше, чем поверхность такого же размера, но расположен- ная под углом к направлению падающего света (панель б) Предполагая, что любую поверхность можно считать идеальным диффузным от- ражателем (ламбертовской поверхностью), для каждой поверхности можно задать параметр А'€/, определяющий долю падающего света, которая будет рассеяна в фор- ме диффузного отражения. Этот параметр называется коэффициентом диффузного отражения. Тогда диффузное отражение в любом направлении постоянно и равно ин- тенсивности падающего света, умноженной на коэффициент диффузного отражения. Для монохроматических источников света параметру кд присваивается постоянное значение из интервала 0,0-1,0 согласно отражательным свойствам, которые требу- ются от поверхности. Чтобы изобразить сильно отражающую поверхность, значение кд выбирается примерно равным 1,0. В результате получаем яркую поверхность с интенсивностью отраженного света, примерно совпадающей с интенсивностью па- дающего. Если требуется смоделировать поверхность, поглощающую большую часть падающего света, коэффициент диффузного отражения выбирается близким к 0,0. Для создания эффектов фонового освещения можно предположить, что все по- верхности полностью освещаются рассеянным светом 1а, приписанным сцене. Сле- довательно, фоновый вклад в диффузное отражение в любой точке поверхности про- сто равен Tambdiff = kdla- 0 0-7) Сам по себе фоновый свет дает на поверхности плоские неинтересные тени (рис. 10.23, б), так что сцены редко визуализируются только с использованием рассе- янного света. Сцену должен освещать по крайней мере один источник света — часто это точечный источник, расположенный там, откуда ведется наблюдение сцены. Когда поверхность освещается источником света с интенсивностью величи- на падающего света от источника зависит от ориентации поверхности относительно направления на источник. Поверхность, ориентированная приблизительно перпенди- кулярно направлению облучения, получает больше света от источника, чем поверх- ность, повернутая под острым углом к направлению падения света. Данный эффект
10.3. Стандартные модели освещения 787 Рис. 10.12. Освещенная поверхность А, спроектированная на перпендикуляр к пути распространения света. Площадь данной перпендикулярной проекции равна A cos 6 Рис. 10.13. Угол падения в между единичным вектором направле- ния на точечный источник L и единичной нормалью N в точке поверхности освещения можно наблюдать на белом листе бумаги или гладкой картонке, разме- щенной параллельно освещенному солнцем окну. Если медленно отворачивать лист от окна, поверхность покажется менее яркой. Данный эффект иллюстрируется на рис. 10.11, где изображен луч света, падающий на две поверхности равной площади, но имеющие различные пространственные ориентации относительно направления облучения от удаленного источника (падающие лучи параллельны). Из рис. 10.11 видно, что число лучей, пересекающих элемент поверхности, про- порционально площади проекции поверхности, перпендикулярной направлению па- дения света. Если обозначить угол падения между направлением поступающего света и нормалью к поверхности через в (рис. 10.12), то площадь проекции элемента по- верхности, перпендикулярного направлению света, пропорциональна cos в. Следова- тельно, величину света от источника с интенсивностью Ц, падающего на поверхность, можно моделировать таким образом: Л,incident ~ Il COS0. (10.8) Используя уравнение (10.8), диффузное отражение от источника света с интенсивно- стью Ii моделируется по следующим формулам: ^,diff = ^dll, incident = = kdli COS в. (Ю.9) Если в определенной точке свет падает от источника перпендикулярно поверхности, тогда в = 90° и /;,diff = кдЦ. При увеличении угла падения освещение, давае- мое источником света, увеличивается. Более того, поверхность освещается точечным источником, только если угол падения принадлежит диапазону от 0° до 90° (cos 6 принадлежит интервалу от 0,0 до 1,0). Если cos в < 0,0, источник света находится за поверхностью.
788 Глава 10. Модели освещения и методы визуализации поверхностей ка = 0 ••••ОС 0,0 0,2 0,4 0,6 0,8 1,0 Рис. 10.14. Диффузное отражение от сферической поверхности, облучаемой точечным источ- ником белого света, значение коэффициента диффузного отражения которого принадлежит интервалу 0 < ка < 1 В любой точке поверхности можно ввести единичный вектор нормали N и еди- ничный вектор направления на точечный источник L, как обозначено на рис. 10.13. Тогда cos 9 = N • L, и уравнение диффузного отражения для освещения точки по- верхности одним точечным источником можно выразить в следующей форме: p^(N.L), Л.сшг = s I 0,0, если N • L > 0; если N • L < 0. (10.10) Единичный вектор направления L на близлежащий точечный источник света вычис- ляется с помощью точки поверхности и положения источника света: Р источник Р поверхность Ристочник ~ Рповерхность (10.11) Однако источник “на бесконечности” не имеет положения, только направление рас- пространения. В этом случае направление вектора L выбирается как минус направ- ление излучения от источника света. Применение уравнения (10.10) к точкам на поверхности сферы иллюстрируется на рис. 10.14 при нескольких значениях параметра k(i между 0 и 1. При к,] — 0 свет не отражается, и поверхность объекта кажется черной. С увеличением значения kj увеличивается интенсивность диффузного отражения, что дает светлые оттенки се- рого. Каждому спроектированному на поверхность пикселю присваивается значение интенсивности, рассчитанное по уравнению диффузного отражения. Визуализиро-
10.3. Стандартные модели освещения 789 ванная на рисунке поверхность иллюстрирует освещение одним точеным источником при отсутствии иных эффектов освещения. Именно такое изображение можно ожи- дать, если навести очень маленький (миниатюрный) фонарик на объект в абсолютно темной комнате. Впрочем, на типичных сценах стоит ожидать, что дополнительно к эффектам освещения, порожденным источником света, будет присутствовать некото- рое отражение от поверхности, вызванное рассеянным светом. Интенсивности, которые дает рассеянный свет и свет от источника, можно объ- единить и получить выражение для общего диффузного отражения в точке поверх- ности. Кроме того, многие графические пакеты вводят коэффициент рассеянного отражения ка, значение которого может выбираться для каждой поверхности с це- лью модификации интенсивности рассеянного света 1а. В результате просто получаем дополнительный параметр, позволяющий корректировать эффекты освещения нашей эмпирической модели. Используя параметр ка, можно записать общее уравнение диффузного отражения для одного точечного источника (ка1а + kjli (N • L), если N • L > 0, Miff = S , Т (10.12) \ка1а, если N • L < 0, где ка и kd зависят от свойств материала поверхности и имеют значения от 0 до 1 при монохроматических эффектах освещения. На рис. 10.15 показана сфера с ука- занными интенсивностями точек поверхности, рассчитанными по уравнению (10.12) для значений параметров ка и kd между 0 и 1,0. ЗЕРКАЛЬНОЕ ОТРАЖЕНИЕ И МОДЕЛЬ ФОНГА Яркое пятно, или зеркальное отражение, которое можно наблюдать на блестящих по- верхностях, является результатом полного (или почти полного) отражения падающего света в сфокусированной области вблизи угла зеркального отражения. На рис. 10.16 показано направление зеркального отражения для точки на освещенной поверхности. Угол зеркального отражения равен углу падения света, причем эти углы отмеряются в противоположных направлениях от единичного вектора нормали к поверхности N. На рисунке R представляет единичный вектор в направлении идеального зеркально- го отражения, L — единичный вектор, направленный к точечному источнику света, а V — единичный вектор, направленный на наблюдателя от выбранной точки поверх- ности. Угол ф является углом наблюдения относительно направления спектрального отражения R. Для идеального отражателя (идеального зеркала) падающий свет от- ражается только в направлении зеркального отражения, и его можно увидеть, только если векторы V и R совпадают (ф = 0). Неидеальные отражатели дают зеркальное отражение в конечном диапазоне на- правлений наблюдения вокруг вектора R. Блестящие поверхности имеют узкий диа- пазон зеркального отражения, а матовые — широкий. Эмпирическая модель расчета
790 Глава 10. Модели освещения и методы визуализации поверхностей Рис. 10.15. Диффузное отражение от сферической поверхности, освещаемой темно- серым рассеянным светом и белым точечным источником, рассчитанное для пяти значений ка и к,] из диапазона от 0,0 до 1,0 Рис. 10.16. Угол зеркального отражения равен углу падения в диапазона зеркального отражения, разработанная Фонгом Буи Туонгом (Phong Bui Tuong) и называемая моделью зеркального отражения Фонга или просто моделью Фонга, задает интенсивность зеркального отражения пропорциональной cos”8 ф. Угол ф может принимать значения из диапазона от 0° до 90°, так что cos ф меняется от 0 до 1,0. Значение, присвоенное показателю зеркального отражения ns, определя- ется типом поверхности, которую нужно отобразить. Очень блестящие поверхности моделируются большими значениями ns (скажем, 100 или больше), а меньшие значе- ния (до 1) используются для матовых поверхностей. Для идеального отражателя ns равно бесконечности. Для таких шероховатых поверхностей, как мел или шлакоблок, ns имеет значение порядка 1. На рис. 10.17 и 10.18 показано влияние ns на угловой диапазон, в котором можно ожидать увидеть зеркальное отражение.
10.3. Стандартные модели освещения 791 Блестящая поверхность (большое л,) Тусклая поверхность (маленькое ns) Рис. 10.17. Моделирование зеркального отражения (за- тененная область) с помо- щью параметра п3 Рис. 10.18. Графики cosns ф для пяти значений показателя зеркального отражения ns
792 Глава 10. Модели освещения и методы визуализации поверхностей Рис. 10.19. Приблизительное изменение коэффи- циента зеркального отражения для различных ма- териалов как функции угла падения Интенсивность зеркального отражения зависит от свойств материала поверхно- сти и угла падения, а также таких факторов, как поляризация и цвет падающего света. Изменение интенсивности монохроматического зеркального отражения можно при- близительно смоделировать, используя коэффициент зеркального отражения W (0) для каждой поверхности. На рис. 10.19 показано общее изменение W(0) в диапазоне от в = 0° до 0 = 90° для нескольких материалов. Вообще, при увеличении угла падения W (0) обычно увеличивается. При 0 = 90° отражается весь падающий свет (W(0) = 1). Изменение интенсивности зеркального отражения с углом описывает- ся законом отражения Френеля. Используя функцию зеркального отражения W(0), модель зеркального отражения Фонга можно записать следующим образом: II,spec = W(0)IiCOSns ф, (10.13) где Ii — интенсивность источника света, а ф — угол наблюдения относительно на- правления зеркального отражения R. Как видно из рис. 10.19, прозрачные материалы, например, стекло, дают заметное зеркальное отражение только при 0 близком 90°. При 0 = 0° от стеклянной поверхно- сти отражается около 4% падающего света. Для большей части диапазона изменения 0 интенсивность отраженного света составляет менее 10%. В то же время, для мно- гих непрозрачных материалов зеркальное отражение приблизительно постоянно для всех углов падения. В этом случае зеркальные эффекты разумно моделировать, заме- нив W(б) постоянным коэффициентом зеркального отражения ks. Затем для каждой поверхности можно просто положить ks равным некоторому значению из диапазо- на от 0 до 1.
10.3. Стандартные модели освещения 793 Рис. 10.20. Проекция L или R на направление вектора нормали N равна N • L Поскольку V и R - единичные векторы в направлении наблюдения и зеркально- го отражения, значение cos ф можно рассчитать, используя скалярное произведение V • R. Кроме того, при отображении поверхности зеркальные эффекты не проявля- ются, если V и L лежат с одной стороны от вектора нормали N, или если источник света находится за поверхностью. Таким образом, предполагая, что коэффициент зер- кального отражения примерно постоянен для любого материала, можно при точечном источнике определить интенсивность зеркального отражения в точке поверхности: _ jMi(V.R)’1’, l'spec~ 10,0, если V • R > 0 если V • R < 0 и N-L>0; или N • L < 0. (10.14) Направление вектора отражения R можно вычислить по направлениям векторов L и N. Как показано на рис. 10.20, проекция L на направление вектора нормали равна скалярному произведению N • L, которое также равно проекции единичного вектора R на направление вектора N. Следовательно, из приведенной диаграммы видно, что R+L = (2N • L)N, а вектор зеркального отражения вычисляется следующим образом: R=(2N«L)N —L. (10.15) На рис. 10.21 зеркальное отражение иллюстрируется для различных значений ks и ns на сфере, освещаемой одним точечным источником. Для расчета V используем точку поверхности и направление наблюдения подоб- но тому, как это делалось для вычисления единичного вектора L (уравнение (10.11)). Впрочем, если для всех точек сцены будет использоваться фиксированное направле- ние наблюдения, можно положить V = (0,0; 0,0; 1,0), что соответствует единич- ному вектору, идущему по положительному направлению оси z. Если использовать постоянное V, расчет величин потребует меньшего времени, но изображение будет не таким реалистичным.
794 Глава 10. Модели освещения и методы визуализации поверхностей Рис. 10.21. Зеркальное отражение от сферической поверхности для различных зеркальных параметров и одного источника света Рис. 10.22. Вектор полупути Н, идущий по биссектрисе утла между L и V Несколько упрощенную модель Фонга можно получить, используя вектор по- лупути (halfway vector) Н, лежащий между L и V, и рассчитав диапазон углов зеркального отражения. Если заменить V • R в модели Фонга скалярным произве- дением N • Н, это приведет к тому, что вместо эмпирического расчета cos ф будет использовать эмпирический расчет cos а (рис. 10.22). Вектор полупути находится следующим образом: L +V |L + V|- (10.16) Для неплоских поверхностей N • Н требует меньше вычислений, чем V • R, по- скольку при расчете R в каждой точке поверхности фигурирует переменный вектор N. Кроме того, если и наблюдатель, и источник света находятся достаточно далеко от поверхности, векторы V и L являются константами, а следовательно, Н также константа для всех точек поверхности. Если угол между Н и N больше 90°, N • Н отрицательно, и вклад зеркального отражения равен 0,0.
10.3. Стандартные модели освещения 795 Рис. 10.23. Каркасная сцена (панель а), отображенная только с использованием рассеянного света с объектами различных цветов (панель б). Диффузное отражение, порожденное освещением рассеянным светом и единственным точечным излучателем (панель в). На данном изображении ка = 0 для всех поверхностей. На панели г показано диффузное и зеркальное отражение при воздействии точечного излучателя и наличии фонового освещения Вектор Н представляет ориентацию поверхности, которая даст максимальное зеркальное отражение в направлении наблюдения для данного положения точечного источника света. По этой причине Н иногда называют направлением ориентации поверхности с максимальной подсветкой. Кроме того, если вектор V компланарен векторам L и R (а следовательно, и N), угол о равен ф/2. Если V, L и N некомпла- нарные, а > ф/2 и зависит от пространственной связи трех векторов. ОБЪЕДИНЕННОЕ ДИФФУЗНОЕ И ЗЕРКАЛЬНОЕ ОТРАЖЕНИЕ Для одного точечного источника света суммарное диффузное и зеркальное отражение от точки на освещенной поверхности можно смоделировать следующим образом: Z = 7diff + 4pec = Ma + ^(N.L) + Mz(N.H)n\ (10.17)
796 Глава 10. Модели освещения и методы визуализации поверхностей Поверхность освещается только рассеянным светом, если источник света находится за поверхностью; эффектов зеркального отражения нет, если V и L расположены по одну сторону от вектора нормали N. На рис. 10.23 иллюстрируются эффекты освещения поверхности, порожденные различными членами уравнения (10.17). ДИФФУЗНОЕ И ЗЕРКАЛЬНОЕ ОТРАЖЕНИЕ ОТ НЕСКОЛЬКИХ ИСТОЧНИКОВ СВЕТА На сцене можно разместить любое число излучателей. Для нескольких точечных источников света диффузное и зеркальное отражение вычисляется как сумма вкладов от различных источников света: п I = ^дифф. отр. 52^,дифф. + Лзерк. отр.] = 1=1 п = kaIa + /z[fcd(N • L) + fcs(N • Н)П (10.18) 1=1 ИЗЛУЧЕНИЕ СВЕТА С ПОВЕРХНОСТИ Некоторые поверхности на сцене могут излучать и отражать свет. Например, комнат- ная сцена может содержать лампы или верхнее освещение, а внешние ночные сцены могут включать уличные фонари, вывески магазинов и автомобильные фары. Чтобы эмпирически смоделировать излучение света с поверхности, можно просто вклю- чить член излучения /surfemission в модель освещения так же, как для моделирования фонового освещения использовался уровень рассеянного света. Данное излучение с поверхности прибавляется к поверхностному отражению, порожденному источником света и фоновым освещением. Чтобы с помощью излучающей поверхности осветить другие объекты, можно разместить за поверхностью направленный источник света, дающий конус света, ко- торый проходит через поверхность. Еще можно имитировать излучение, введя набор точечных источников света, распределенных по поверхности. Вообще, излучающая поверхность обычно не используется в стандартной модели освещения для осве- щения других поверхностей из-за увеличивающегося времени вычислений. Вместо этого для аппроксимации внешнего вида поверхности неточечного источника света используется излучение с поверхности. В результате создается эффект раскаленной поверхности. Более реалистичный метод моделирования излучения с поверхности — это модель диффузного отражения, рассмотренная в разделе 10.12.
10.3. Стандартные модели освещения 797 СТАНДАРТНАЯ МОДЕЛЬ ОСВЕЩЕНИЯ С ЗАТУХАНИЕМ ИНТЕНСИВНОСТИ И ИСТОЧНИКАМИ НАПРАВЛЕННОГО СВЕТА Общую модель монохроматического освещения для отражения от поверхности, вклю- чающую множественные точечные источники света, коэффициенты затухания, источ- ники направленного света (прожекторы), источники на бесконечности и излучение с поверхности, можно создать следующим образом: 71 I = Тпов. изл.+^дифф. отр.+^2 Арад- затух. Дугл. затух. (Адифф.+Азерк. отр. )• (10.19) 1=1 Функция радиального затухания /(,radatten вычисляется согласно уравнению (10.2), а функция углового затухания — уравнению (10.5). Для каждого источника света диффузное отражение от точки поверхности вычисляется следующим образом: {0,0, если N • L; < 0,0 (источник света расположен за объектом); QQ 20) krflifN • L;) в противном случае. С помощью похожего выражения вычисляется слагаемое зеркального отражения, по- рожденного излучением точечного источника: {0,0, если N • L/ < 0,0 (источник света расположен за объектом); ksIi max{0, 0, (N • H/)n's} в противном случае. (10.21) Чтобы гарантировать, что интенсивность любого пикселя не превышает максималь- ного разрешенного значения, можно просто выполнить своеобразную нормировку. Для этого в уравнении для интенсивности задается максимальная величина каждого члена. Если какое-либо рассчитанное слагаемое превышает максимум, его значение просто заменяется максимальным. Другой способ компенсации “переполнения интен- сивности” — это нормировать отдельные члены, разделив каждый из них на значение максимального члена. Более сложной является процедура, при которой рассчитыва- ются интенсивности всех пикселей сцены, затем данный набор масштабируется в диапазон 0,0-1,0. Кроме того, значения коэффициентов в функции радиального затухания и оптиче- ские параметры поверхности на сцене можно регулировать так, чтобы рассчитанные интенсивности не могли превысить максимальное разрешенное значение. Данный метод эффективно ограничивает значения интенсивности, если сцену освещает един- ственный источник. Впрочем, в общем случае рассчитанным интенсивностям никогда не разрешается превышать 1, а отрицательные значения заменяются значением 0.
798 Глава 10. Модели освещения и методы визуализации поверхностей ВОПРОСЫ, КАСАЮЩИЕСЯ RGB-ЦВЕТОВ При описании RGB-цветов каждая спецификация интенсивности в модели осве- щения является вектором, три элемента которого соответствуют красному, зеле- ному и синему компонентам этой интенсивности. Таким образом, для каждого источника света Ii = (Iir, 1ю, Iib)- Коэффициенты отражения также задаются тремя RGB-компонентами: ka = (kaR, кав, кав), kd = (kdR, kdG, и ks = (ksR, ksG,ksB '). Далее каждый компонент цвета поверхности рассчитывается с помо- щью отдельного выражения. Например, синие компоненты диффузного и зеркального отражений для точечного источника вычисляются из модифицированных выраже- ний (10.20) и (10.21): IlB,diff = kdBlie(N • Lf) (10.22) и Л,spec = ksBliB max{0,0, (N • H;)”s}. (10.23) Чаще всего поверхности освещаются белыми источниками света, однако для созда- ния специальных эффектов или иллюзии комнатного освещения могут использоваться другие цвета источников света. Далее для моделирования конкретного цвета поверх- ности задаются коэффициенты отражения. Например, если требуется, чтобы объект имел синюю поверхность, выбирается ненулевое значение из диапазона 0,0-1,0 для синего компонента отражения kdB, тогда как красный и зеленый компоненты отра- жения устанавливаются равными нулю (kdR = kdG = 0,0). Все ненулевые красные и зеленые компоненты в падающем свете поглощаются, а отражается только синий компонент. В первоначальной модели зеркального отражения Фонг установил параметр ks равным постоянному значению независимо от цвета поверхности. В результате бы- ло получено зеркальное отражение того же цвета, что и падающий цвет (обычно — белый), что придавало поверхности “пластмассовый вид”. Для непластического ма- териала цвет зеркального отражения в действительности является функцией свойств поверхности и может отличаться от цвета падающего света и диффузного отражения. Зеркальные эффекты на подобных поверхностях можно аппроксимировать, сделав ко- эффициент зеркального отражения зависящим от цвета, как в уравнении (10.23). На рис. 10.24 показано отражение цветного света от матовой поверхности, а на рис. 10.25 и 10.26 показано отражение цветного света от металлических поверхностей. Отраже- ние света от поверхностей объектов показано на рис. 10.27. Другой способ, позволяющий задать цвет поверхности, — указать для каждой по- верхности компоненты векторов диффузного и зеркального цветов, при этом положив коэффициенты отражения равными однозначным константам. Для представления цве- тов в формате RGB, например, компоненты данных двух векторов цвета поверхности
10.3. Стандартные модели освещения 799 I Рис. 10.24. Отражение света от поверхности черной нейлоновой подушки, смоделирован- ной с помощью тканевых элементов одеж- ды и визуализированной посредством по- строения хода лучей с использованием ме- тода Монте-Карло (перепечатано с разреше- ния Стефана Вестина (Stephen Н. Westin), Program of Computer Graphics, Университет Корнелла) Рис. 10.25. Отражение света от чайника, параметры отражения которого заданы так, чтобы имитировать разрисованные алюми- ниевые поверхности. Для визуализации ис- пользовалось построение хода лучей и ме- тод Монте-Карло (перепечатано с разреше- ния Стефана Вестина, Program of Computer Graphics, Университет Корнелла) Рис. 10.26. Отражение света от воронок — параметры отражения имитируют блестящие стеклянные поверхности (перепечатано с разрешения SOFTIMAGE, Inc.) можно обозначить как (SdR- Sag-, S^b) и (Ssr, Ssg, Ssb)- Далее синий компонент диффузного отражения (уравнение (10.22)) рассчитывается следующим образом: Iis.dift = kdSdBliB(N • L;). (10.24) Описанный подход предлагает несколько большую гибкость, поскольку параметры цвета поверхности и значения коэффициентов отражения можно задать независимо.
800 Глава 10. Модели освещения и методы визуализации поверхностей Рис. 10.27. Отражение света при нескольких источниках света различных цветов (перепе- чатано с разрешения Sun Microsystems) В некоторых графических пакетах предлагаются дополнительные параметры освещения — источнику света можно присвоить несколько цветов, и каждый цвет вносит вклад в один из эффектов освещения поверхности. Например, один цвет можно использовать как вклад в общее фоновое освещение на сцене. Другой цвет применяется при задании интенсивности света в расчетах диффузного отражения, а третий — при расчете зеркального отражения. ДРУГИЕ ФОРМЫ ПРЕДСТАВЛЕНИЯ ЦВЕТА Чтобы описать цвет, можно использовать не только RGB-представление, но и дру- гие модели. Например, цвет можно представить, используя голубой, пурпурный и желтый компоненты (cyan, magenta, yellow — CMY), или же воспользоваться оттен- ком, яркостью и насыщенностью цвета (hue, brightness, saturation — HBS). Любое из названных представлений, включая спецификации цвета с помощью более чем трех компонентов, можно ввести в модель освещения. Например, уравнение (10.24) можно выразить через спектральный цвет с длиной волны А: J/A.diff = kdSd\Iix№ • Lf). (10.25) Различные представления цвета, полезные в компьютерной графике, более подробно рассмотрены в главе 12. ЯРКОСТЬ Другой характеристикой цвета является яркость, иногда называемая световой энер- гией. Яркость — это психологическая мера нашего восприятия яркости, которая ме- няется с изменением освещения.
10.4. Прозрачные поверхности 801 Рис. 10.28. Излучение света с прозрачной поверхности обычно является комбинацией отраженного и переданного света Физически цвет описывается через диапазон частот видимой энергии излучения (света), а яркость рассчитывается как взвешенная сумма компонентов интенсивно- сти при определенном освещении. Поскольку любое реальное освещение содержит непрерывный диапазон частот, значение яркости вычисляется как яркость = f p(j)I(f)df. (10.26) •/вид. f Параметр 7(У) в этой формуле представляет интенсивность компонента света с ча- стотой У, излучающего в определенном направлении. Параметр р(У) — определенная экспериментально функция пропорциональности, зависящая от частоты и уровня освещенности. Интегрирование выполняется по всем интенсивностям в диапазоне частот, содержащихся в свете. Чтобы описать освещение объекта для полутоновых (gray-scale) и монохромати- ческих изображений, нужны только значения яркости. Кроме того, некоторые гра- фические пакеты позволяют выражать параметры освещения через яркость. Зеленые компоненты источника света вносят наибольший вклад в освещенность, а синие — наименьший, поэтому освещенность RGB-источника света обычно вычисляется так: яркость = 0, 299В + 0, 587G + 0,114В. (10.27) Иногда, чтобы усилить эффект освещения, увеличивается вклад зеленого компонента каждого RGB-цвета. Например, рекомендуется использовать следующую формулу: 0,2125В + 0, 7154G + 0,0721В. Параметр освещения чаще всего представляется символом Y и соответствует компоненту Y в модели цвета XYZ (раздел 12.3). 10.4. ПРОЗРАЧНЫЕ ПОВЕРХНОСТИ Такой объект, как оконное стекло, называется прозрачным, если видны предметы, на- ходящиеся за ним. Подобным образом, если предметы, расположенные за объектом, видеть нельзя, объект относится к непрозрачным. Кроме того, некоторые прозрачные объекты, такие как матовое (с узором “мороз”) стекло и определенные пластические материалы, являются полупрозрачными, так что прошедший сквозь них свет рассеива- ется во всех направлениях. Объекты, наблюдаемые через полупрозрачные материалы, кажутся размытыми (нечеткими), и часто их нельзя точно идентифицировать.
802 Глава 10. Модели освещения и методы визуализации поверхностей Рис. 10.29. Ход световых лучей на сцене, содержащей прозрачный стакан, демон- стрирующий как передачу света от объектов, расположенных за стаканом, так и отражение света от стеклянной поверхности (перепечатано с разрешения Эрика Хайнса (Eric Haines), Autodesk, Inc.) В общем случае прозрачная поверхность дает и отраженный, и пропущенный свет. Свет, прошедший сквозь поверхность, является результатом излучения и отраже- ния от объектов и источников, расположенных за прозрачным объектом. На рис. 10.28 показан вклад в освещение поверхности прозрачного объекта, который находится пе- ред непрозрачным, а на рис. 10.29 показаны эффекты прозрачности, которые можно получить на компьютерной сцене. ПОЛУПРОЗРАЧНЫЕ МАТЕРИАЛЫ На поверхности прозрачного объекта наблюдается и диффузная, и зеркальная пере- дача. Отметим, что при моделировании прозрачных материалов диффузные эффекты очень важны. Свет, проходящий сквозь полупрозрачный материал, рассеивается, так что фоновые объекты наблюдаются как размытые изображения. Диффузную пере- дачу можно имитировать, распределив вклады интенсивности от фоновых объектов по конечной площади, или же для имитации полупрозрачности можно использовать методы построения хода световых лучей. Данные манипуляции требуют времени, поэтому в базовой модели освещенности обычно рассчитываются только эффекты зеркальной прозрачности.
10.4. Прозрачные поверхности 803 Рис. 10.30. Направление отражения R и направление преломления (передачи) Т для луча света, падающего на поверхности с показа- телем преломления рг ПРЕЛОМЛЕНИЕ СВЕТА Чтобы получить реалистичные изображения прозрачных материалов, нужно смоде- лировать путь преломления луча при прохождении сквозь материал. При падении луча света на прозрачную поверхность часть его отражается, а часть — передается через материал в виде преломленного света, как показано на рис. 10.30. Поскольку скорость света отличается для разных материалов, путь преломленного света отлича- ется от пути падающего. Направление преломленного света, которое задается углом преломления, отсчитываемым от вектора нормали к поверхности, является функцией показателя преломления материала и направления падения света. Показатель пре- ломления определяется как отношение скорости света в вакууме к скорости света в материале. Угол преломления вг вычисляется по закону Снелла sin0r = — sinflj, (10.28) T]r где 9г — угол падения, гц — показатель преломления среды, в которой распространяет- ся падающий свет, rjr — показатель преломления среды, в которой распространяется преломленный свет. В действительности показатель преломления также зависит от других факторов, таких как температура материала и длина волны падающего света. Следовательно, различные компоненты падающего белого света, например, преломляются под разны- ми углами, которые, к тому же, зависят от температуры. Более того, в анизотропных материалах, таких как кристаллический кварц, скорость света зависит от направле- ния, а некоторые прозрачные материалы обнаруживают двойное преломление, при котором генерируется два преломленных луча света. Впрочем, в большинстве при- ложений можно использовать один средний показатель преломления для каждого материала из перечисленных в табл. 10.1. Подставляя в уравнение (10.28) показа- тель преломления для воздуха (приблизительно 1,0), окружающего окно из тяжелого кронгласа (показатель преломления ~ 1,61), при угле падения 30°, получим для света, проходящего через стекло, угол преломления порядка 18°.
804 Глава 10. Модели освещения и методы визуализации поверхностей ТАБЛИЦА 10.1. Средние показатели преломления распространенных материалов Материал Показатель преломления Вакуум (воздух, газ) 1,00 Обычное оптическое стекло (кронглас) 1,52 Тяжелое оптическое стекло (кронглас) 1,61 Обычное бесцветное стекло (флинтглас) 1,61 Тяжелое бесцветное стекло (флинтглас) 1,92 Каменная соль 1,55 Кварц 1,54 Вода 1,33 Лед 1,31 На рис. 10.31 иллюстрируется изменение луча из-за преломления при прохожде- нии через тонкий слой стекла. Общий эффект преломления заключается в смещении падающего света на параллельный путь при выходе из материала. Поскольку оценка тригонометрических функций в уравнении (10.28) является длительным процессом, эти эффекты преломления можно аппроксимировать, просто сместив путь падающего света на приблизительную величину, рассчитанную для данного материала. Из закона Снелла и диаграммы на рис. 10.30 можно получить единичный вектор передачи Т в направлении преломления f)r\ Т= ( — cosdi — cos0r )N — — L, (10.29) \T]r ) Яг где N — единичная нормаль к поверхности, a L — единичный вектор в направле- нии от точки поверхности к источнику света. Используя вектор переноса Т, можно найти точки пересечения пути преломленного луча с объектами, расположенными за прозрачной поверхностью. Если включить в изображение эффекты преломления, получатся очень реалистичные картины, но, чтобы определить пути преломленных лучей и точки пересечения с объектами, потребуются значительные вычисления. В большинстве методов построения в пространстве изображений с помощью строк развертки пропускание света моделируется приближениями, сокращающими время обработки. Точные эффекты преломления отображаются с использованием алгорит- мов построения хода луча (раздел 10.11).
10.4. Прозрачные поверхности 805 Рис. 10.31. Преломление света при прохождении через оконное стекло. Выходящий преломленный луч проходит по пути, парал- лельному пути падающего света (показан пунктиром) Фоновый объект Прозрачный объект Плоскость проекции Рис. 10.32. Интенсивность фонового объекта в точке Р можно объеди- нить с интенсивностью света, отраженного от поверхности прозрачного объекта вдоль перпендикулярной линии проекции (пунктир) СТАНДАРТНАЯ МОДЕЛЬ ПРОЗРАЧНОСТИ Прозрачные объекты можно смоделировать и проще — проигнорировать смещение пути, вызванное преломлением. По сути, при таком подходе предполагается, что по- казатель преломления общий для всех материалов, так что угол преломления не отли- чается от угла падения. Данный метод ускоряет вычисление интенсивностей и может дать приемлемые эффекты прозрачности для тонких многоугольных поверхностей. Интенсивность /trans > пронесенную от фонового объекта через прозрачную по- верхность, можно объединить с отраженной от поверхности интенсивностью /гея (рис. 10.32), используя коэффициент прозрачности kt. Параметру kt присваивается значение между 0,0 и 1,0, и он определяет, какое количество фонового света было пропущено. Суммарная интенсивность поверхности вычисляется как / = (1 - fct)/refl + A:t/trans- (10.30) Член (1 — kt) — это коэффициент непрозрачности. Например, если коэффициент прозрачности имеет значение 0,3, то 30% фонового света объединяется с 70% отра- женной освещенности поверхности. Описанную процедуру можно использовать для объединения эффектов освеще- ния, порожденных любым числом прозрачных и непрозрачных объектов, если обраба- тывать поверхности в порядке уменьшения глубины (от заднего плана к переднему). Например, если смотреть через стекло на рис. 10.29, можно видеть непрозрачные объекты, расположенные за двумя прозрачными поверхностями. Подобным образом, если смотреть через лобовое стекло автомобиля, будут видимы объекты внутри ма- шины, а также объекты, которые находятся за задним стеклом.
806 Глава 10. Модели освещения и методы визуализации поверхностей Для очень прозрачных объектов kt присваивается значение порядка 1,0. Почти непрозрачные объекты пропускают очень мало света от фоновых объектов, поэтому для таких материалов kt можно присвоить значение, близкое к 0,0. Кроме того, мож- но позволить kt быть функцией точки над поверхностью, так что различные части объекта могут пропускать больше или меньше света от фоновых поверхностей. Алгоритм видимости с сортировкой по глубине модифицируется, чтобы можно было работать с прозрачностью, вначале отсортировав поверхности по глубине, а затем определив, является ли видимая поверхность прозрачной. При положительном ответе интенсивность света, отраженного с этой поверхности, объединяется с объек- тами позади поверхности, и в результате можно определить интенсивность пикселей в каждой спроектированной на экран точке поверхности. Эффекты прозрачности можно также реализовать, используя модифицированный подход буфера глубины. Поверхности на сцене делятся на две группы так, чтобы все непрозрачные поверхности обрабатывались первыми. В этот момент буфер кад- ра содержит интенсивности видимых поверхностей, а буфер глубины — их глубины. Затем положения глубин прозрачных объектов сравниваются со значениями, ранее занесенными в буфер глубин. Если любая прозрачная поверхность видима, ее отра- женная интенсивность вычисляется и объединяется с интенсивностью непрозрачной поверхности, ранее занесенной в буфер кадров. Данный метод можно модифици- ровать, чтобы получить более точные изображения, за счет дополнительной памяти для записи глубины и других параметров прозрачных поверхностей. Это позволит сравнивать значения глубин для прозрачных поверхностей между собой, а также со значениями глубин непрозрачных поверхностей. Затем видимые прозрачные поверх- ности визуализируются, для чего интенсивности их поверхностей объединяются с интенсивностями видимых и непрозрачных поверхностей за ними. Другой подход — использовать метод A-буфера. Для каждого пикселя в А-буфере записываются и сортируются в порядке глубин участки поверхности всех перекры- вающихся поверхностей. Затем интенсивности прозрачных и непрозрачных участков поверхностей, накладывающихся по глубине, объединяются в надлежащем порядке видимости, и получается окончательная усредненная интенсивность пикселя. 10.5. АТМОСФЕРНЫЕ ЭФФЕКТЫ Еще один фактор, который иногда включается в модель освещенности, — это вли- яние атмосферы на цвет объекта. Замутненная атмосфера делает цвета тусклыми, а объекты кажутся более серыми. Таким образом, можно задать функцию, которая будет модифицировать цвета поверхности согласно количеству пыли, дыма или смо- га, которое нужно сымитировать в атмосфере. Эффект туманной атмосферы часто имитируется экспоненциальной функцией затухания, например, такой:
10.6. Тени 807 /atmo(d) = ^Pd (10.31) ИЛИ /atmo(d) =e-(^2. (10.32) Значения, присвоенные d, являются расстоянием объекта от точки наблюдения. Кро- ме того, можно использовать параметр р в любой из приведенных экспоненциальных функций и задать положительную плотность атмосферы. Большие значения р да- ют более плотную атмосферу, а цвета поверхностей будут более приглушенными. После вычисления цвета поверхности объекта это значение умножается на одну из атмосферных функций, что уменьшает его интенсивность на величину, зависящую от плотности атмосферы. Расчет атмосферного поглощения можно упростить, если вместо экспоненциаль- ной функции использовать линейную функцию глубины (9.9). Это уменьшает интен- сивность цветов поверхностей для удаленных объектов, но исключает возможность варьировать плотность атмосферы. Иногда бывает нужно сымитировать цвет атмосферы. Например, воздух в проку- ренной комнате можно смоделировать свинцово-серым цветом или, возможно, лазур- ным. Затем можно использовать следующую формулу и объединить цвет атмосферы с цветом объекта: I = /atmo(^)^obj 4" [1 — /atmo (d)]/atmo, (Ю.ЗЗ) где /atmo — экспоненциальная или линейная функция атмосферного поглощения. 10.6. ТЕНИ Чтобы локализовать области, которые не освещаются источниками света, исполь- зуются методы поиска видимых поверхностей. Если точка наблюдения совпадает с положением источника света, можно определить, какие сегменты поверхности на сцене невидимы. Это — области тени. Как только области тени определены для всех источников света, можно рассматривать тени как шаблоны поверхности и записывать их в массивах шаблонов. На рис. 10.33 показаны области тени на лице анимирован- ного персонажа. На этом изображении области тени — это сегменты поверхностей, невидимые с места расположения верхнего источника света. Таким образом, подня- тая рука освещается, а участки лица за рукой, расположенные вдоль линии взора на источник света, находятся в тени. Сцена на рис. 10.29 демонстрирует эффекты затенения, порожденные несколькими источниками света.
808 Глава 10. Модели освещения и методы визуализации поверхностей Рис. 10.33. Шаблон тени, отображенный на лицо доктора Аки Росс, анимиро- ванного персонажа из фильма Final Fantasy: The Spirits Within {перепечатано с разрешения Square Pictures, Inc. © 2001, FFFP) Теневые узоры, полученные методом выявления видимых поверхностей, соот- ветствуют любой выбранной точке наблюдения, если не менять положение источ- ника света. Поверхности, видимые из точки наблюдения, затеняются согласно моде- ли освещенности, которую можно дополнительно улучшить, используя текстурные узоры. Чтобы отобразить затененные области на экран, используется либо только интенсивность рассеянного света, либо комбинация рассеянного света с заданными поверхностными текстурами. 10.7. ПАРАМЕТРЫ КАМЕРЫ Рассмотренные выше процедуры наблюдения и освещения дают четкие изображения, что эквивалентно фотосъемке сцены с помощью камеры-обскуры. Однако, если фо- тографировать реальную сцену, камеру можно настроить так, чтобы в фокусе были только выбранные объекты. Другие объекты находятся в фокусе в большей или мень- шей степени в зависимости от распределения глубин объектов на сцене. Внешний вид точек, находящихся не в фокусе, можно имитировать в программе компьютерной графики, спроектировав каждую точку в область, содержащую несколько пикселей, и смоделировав смешивание цветов объектов для создания размытого наложенного узора. Данная процедура подобна методам, используемым в сфере защиты от нало- жений, а имитацию эффектов камер можно ввести в алгоритм строк развертки или построения хода лучей. Сцены компьютерной графики кажутся более реалистичны- ми, если включить эффекты фокусировки, однако стоит отметить, что расчет этих эффектов — довольно трудоемкая процедура. Подробно методы установки парамет- ров линз и камер для имитации эффектов фокусировки рассмотрены в разделе 10.11.
10.8. Отображение интенсивности света 809 ОТОБРАЖЕНИЕ ИНТЕНСИВНОСТИ СВЕТА Интенсивность поверхности, рассчитанная в модели освещенности, может иметь лю- бое значение из диапазона от 0,0 до 1,0, но система компьютерной графики может отобразить только ограниченный набор интенсивностей. Следовательно, рассчитан- ное значение интенсивности нужно преобразовать в одно из доступных системных значений. Кроме того, разрешенное в системе количество уровней интенсивности можно распределить так, чтобы они соответствовали тому, как наши глаза воспри- нимают изменение интенсивности. Если сцена отображается в двухуровневой си- стеме, рассчитанные интенсивности можно преобразовать в полутоновые значения (раздел 10.9). РАСПРЕДЕЛЕНИЕ УРОВНЕЙ ИНТЕНСИВНОСТИ Для любой системы разрешенное количество уровней интенсивности можно рас- пределить в диапазоне от 0,0 до 1,0 так, чтобы это распределение соответствовало нашему восприятию интервалов равной интенсивности между уровнями. Известно, что относительные интенсивности света мы ощущаем так же, как относительные интенсивности звука: по логарифмической шкале. Это означает, что если отношение двух значений интенсивности равно отношению двух других интенсивностей, раз- ницу между каждой парой мы ощущаем одинаково. Проиллюстрируем сказанное на примере. Разница между интенсивностями 0,20 и 0,22 кажется равной разнице между 0,80 и 0,88. Следовательно, чтобы отобразить п + 1 последовательных уровней ин- тенсивностей с равно ощущаемыми яркостями, уровни интенсивности на мониторе должны размещаться так, чтобы отношение последовательных уровней интенсивно- сти было постоянным: Л = h h Л In (10.34) где I представляет интенсивность одного цветового компонента света. Самый нижний уровень, который можно отобразить, представляется как Iq, а самый высокий — как 1п. Любую промежуточную интенсивность можно выразить через Iq: Ik = гк10 (10.35) Для данных значений Iq и п (конкретной системы) можно рассчитать значение г, подставив к = п в приведенное выше выражение. Поскольку 1п = 1,0, получаем следующее: 1,0\ 1/п (10.36)
810 Глава 10. Модели освещения и методы визуализации поверхностей Таким образом, определение Д через уравнение (10.35) можно переписать следую- щим образом: Ik = (10.37) Например, если Iq = | для системы с п = 3, получаем г = 2, и в системе возможны четыре значения интенсивности: | и 1,0. Самое малое значение интенсивности Iq зависит от характеристик монитора, и обычно оно принадлежит диапазону от 0,005 примерно до 0,025. Эта остаточная интенсивность на мониторе объясняется отраженным светом от люминофоров экрана. Следовательно, “черная” область на экране всегда имеет интенсивность больше, чем 0,0. Для полутонового дисплея с 8 бит на пиксель (п — 255) и Iq — 0,01 отношение последовательных интенсивностей примерно равно г = 1,0182. Приблизительные значения 256 интенсивностей в этой системе: 0,0100; 0,0102; 0,0104; 0,0106; 0,0107; 0,0109; ...; 0,9821 и 1,0000. Похожие методы используются для RGB-компонентов цветов. Например, интен- сивность синего компонента цвета с уровнем к можно выразить через наименьшее достижимое синее значение: lek — t^Ibo, (10.38) где гВ = уМ , (Ю.39) \1во/ ап — число уровней интенсивности. ГАММА-КОРРЕКЦИЯ И ТАБЛИЦЫ ВИДЕОСООТВЕТСТВИЙ При отображении цветных или монохроматических изображений на мониторе вос- принимаемые вариации яркости нелинейны, но модели освещенности дают линейное изменение значений интенсивности. Цвет RGB (0,25; 0,25; 0,25), полученный из моде- ли освещенности, представляет половину интенсивности цвета (0,5; 0,5; 0,5). Данные интенсивности впоследствии записываются в файле изображения в виде целых чисел из диапазона 0-255, с одним байтом для каждого RGB-компонента. Данный файл ин- тенсивностей также линеен, так что пиксель со значением (64; 64; 64) представляет половину интенсивности пикселя со значением (128; 128; 128). Напряжение пучка, который управляет числом электронов, ударяющихся о люминофоры экрана, дает уровни яркости, которые определяются характеристикой чувствительности мони- тора (monitor response curve), показанной на рис. 10.34. Следовательно, отображенное значение интенсивности (64; 64; 64) не будет казаться вполовину таким ярким, как значение (128; 128; 128).
10.8. Отображение интенсивности света 811 Нормированное напряжение электронной пушки Рис. 10.34. Типичная характеристика монитора, демонстрирующая изменение отображаемых ин- тенсивностей (или “яркости”) как функции нор- мированного напряжения электронной пушки Рис. 10.35. Кривая видеосоответствий для отоб- ражения нормированного значения интенсив- ности в нормированное напряжение электрон- ной пушки с использованием гамма-коррекции (7 = 2,2) Чтобы компенсировать нелинейность монитора, в графических системах ис- пользуется таблица видеосоответствий, которая выравнивает линейные входные значения интенсивностей. Характеристика монитора описывается экспоненциальной функцией I = aVy. (10.40) Параметр I — это отображенная интенсивность, а параметр V — соответствующее напряжение электронной пушки. Значения параметров а и 7 зависят от характери- стик монитора, используемого в графической системе. Следовательно, если требуется
812 Глава 10. Модели освещения и методы визуализации поверхностей отобразить определенное значение интенсивности I, значение напряжения, которое даст эту интенсивность, определяется по формуле V = 1/у (10.41) Процесс, описываемый приведенным выражением, называется гамма-коррекцией ин- тенсивности, а значения 7 обычно принадлежат диапазону 1,7-2,3. В стандарте сиг- налов NTSC (The National Television System Committee — Национальный комитет по телевизионным стандартам США) 7 = 2,2. На рис. 10.35 показана кривая гамма- коррекции со значением 7, соответствующим стандарту NTSC, а интенсивность и напряжение нормированы в интервал 0-1,0. Для установки таблицы видеосоответ- ствия, позволяющей переводить целые значения интенсивностей в файле изображе- ния в значения, управляющие напряжением электронной пушки, используется урав- нение (10.41). Чтобы получить таблицу соответствий, гамма-коррекцию можно объединить с логарифмическим отображением интенсивности. Если I — входное значение интен- сивности, полученное из модели освещенности, найдем вначале ближайшую ин- тенсивность Д в таблице значений, полученных по уравнению (10.34) или урав- нению (10.37). В качестве альтернативы можно определить номер уровня для этого значения интенсивности: k — round (10.42) Затем с помощью уравнения (10.37) вычисляется значение интенсивности на этом уровне. Как только значение интенсивности Д получено, можно рассчитать напря- жение электронной пушки: (10.43) Затем значения 14 помещаются в таблицы соответствий вместе со значениями к, за- писанными в точках пикселей в буфере кадров. Если определенная система не имеет таблицы соответствий, вычисленные значения 14 могут заноситься непосредственно в буфер кадра. Отметим, что суммарное преобразование в логарифмический мас- штаб интенсивностей и расчет 14 с использованием уравнения (10.43) также иногда называется гамма-коррекцией. Если видеоусилители монитора спроектированы так, чтобы преобразовывать ли- нейные значения интенсивности в напряжения электронной пушки, два процесса преобразования интенсивности объединить нельзя. В этом случае гамма-коррекция реализуется на аппаратном уровне, поэтому логарифмические значения Д должны вычисляться заранее и записываться в буфере кадров (или в таблице цветов).
10.8. Отображение интенсивности света 813 Рис. 10.36. Тоновая фотография (панель а), напечатанная с двумя уровнями интенсивности (панель б), 4 уровнями интенсивности (панель в) и 8 уровнями интенсивности (панель г) ВЫВОД НА ЭКРАН ТОНОВЫХ ИЗОБРАЖЕНИЙ Высококачественные системы компьютерной графики обычно предлагают 256 уров- ней интенсивности для каждого компонента цвета, но для получения приемлемых изображений во многих приложениях можно использовать меньшее число уровней. Четырехуровневая система предоставляет минимальные возможности создания зате- нения на тоновых изображениях, тогда как фотореалистичные изображения можно генерировать в системах, которые могут предложить от 32 до 256 уровней интенсив- ности на пиксель. На рис. 10.36 показана тоновая фотография, отображенная с различными уров- нями интенсивности. Если для воспроизведения тонового изображения использует- ся небольшое число уровней интенсивности, границы между областями различной интенсивности (называемые контурами) видны отчетливо. В двухуровневой репро- дукции едва-едва идентифицируемы черты лица. Используя 4 уровня интенсивности,
10.9. 814 Глава 10. Модели освещения и методы визуализации поверхностей можно различать схемы затенения оригинала, но контурные эффекты слишком режут глаза. При 8 уровнях интенсивности контурные эффекты все еще очевидны, но лучше видны исходные тени. При 16 или большем числе уровней интенсивности контур- ные эффекты менее заметны, а репродукции очень близки к оригиналу. Репродукции тоновых изображений с использованием 32 уровней интенсивности демонстрируют лишь незначительные отличия от оригинала. ПОЛУТОНОВЫЕ ШАБЛОНЫ И МЕТОДЫ ПСЕВДОСЛУЧАЙНОГО ШУМА В системе, располагающей очень малым числом уровней интенсивности, можно со- здать видимое увеличение числа доступных интенсивностей, выделяя несколько пик- селей на изображение на сцене каждого значения интенсивности. При наблюдении небольшой области, состоящей из нескольких положений пикселей, наши глаза имеют тенденцию скрашивать или усреднять мелкие детали общей интенсивностью. Двух- уровневые мониторы и принтеры, в частности, позволяют играть на этом визуальном эффекте для получения изображений, глядя на которые, кажется, что они отображены с использованием нескольких значений интенсивности. Тоновые фотографии воспроизводятся для публикации в газетах, журналах и книгах с использованием процесса печати, называемого формированием полутоно- вого изображения (halftoning), а воспроизведенные изображения называются полу- тоновыми. Для черно-белых фотографий каждая область постоянной интенсивности воспроизводится как набор небольших черных кружков на белом фоне. Диаметр каж- дого круга пропорционален темноте, требуемой от данной области интенсивностей. Более темные области печатаются большими окружностями, а более светлые — мень- шими. На рис. 10.37 представлен увеличенный сегмент полутоновой репродукции. Как показано на рис. 10.38, полутона цвета печатаются с использованием небольших круглых точек различных размеров и цветов. Книжные и журнальные полутоновые изображения печатаются на качественной бумаге с использованием приблизитель- но 60-80 кружков различного диаметра на сантиметр. Газеты печатаются на бумаге худшего качества и с меньшим разрешением (порядка 25-30 точек на сантиметр). ПОЛУТОНОВЫЕ АППРОКСИМАЦИИ В компьютерной графике полутоновые репродукции моделируются прямоуголь- ными областями пикселей, которые называются полутоновыми шаблонами- аппроксимациями или просто точечным изображением (pixel patterns). Число уров- ней интенсивности, которые можно отобразить с помощью этого метода, зависит от того, сколько пикселей мы включили в прямоугольные сетки, и сколько уровней мо- жет отобразить система. При использовании сетки п на п пикселей в двухуровневой
10.9. Полутоновые шаблоны и методы псевдослучайного шума 815 Рис. 10.37. Увеличенный фрагмент фотографии, воспроизведенный с использованием метода полутоновых изображений, демонстриру- ющий, как тона представляются “точками” различного размера системе можно представить n2 + 1 уровней интенсивности. На рис. 10.39 показан один способ задания точечных изображений, позволяющий представить пять уровней интенсивности в двухуровневой системе. В шаблоне 0 все пиксели “выключены”; в шаблоне 1 включен один пиксель; наконец, в шаблоне 4 включены все четыре пиксе- ля. Значение интенсивности I на сцене отображается в определенный шаблон соглас- но диапазону, приведенному под каждой сеткой на рисунке. Шаблон 0 используется для 0,0 < I <0,2, шаблон 1 — для 0,2 < I < 0,4, а шаблон 4 — для 0,8 < I < 1,0. При сетке 3 на 3 пикселя можно отобразить десять уровней интенсивности. Один из способов задания десяти пиксельных шаблонов для этих уровней показан на рис. 10.40. На каждом уровне выбираются положения пикселей, так что шаблоны аппроксимируют увеличивающиеся размеры окружностей, используемые в полуто- новых репродукциях. Следовательно, “включенные” положения пикселей распола- гаются вблизи центра сетки для более низких уровней интенсивности и переходят наружу при увеличении уровня интенсивности. Для пиксельной сетки любого размера шаблоны пикселей для различных воз- можных интенсивностей можно представить посредством маски (матрицы) номеров положений пикселей. Например, следующую маску можно использовать для генера- ции девяти сеток-шаблонов, представляющих уровни интенсивности и показанных на рис. 10.40. 8 3 7' 5 1 2 4 9 6 (10.44) Чтобы отобразить интенсивность уровня к, включаются все пиксели, номер позиции которых меньше или равен к.
816 Глава 10. Модели освещения и методы визуализации поверхностей а) Рис. 10.38. Точечная структура цветных полутонов. Верх диска часов в цветных полутонах (панель а), увеличенный в 10 раз (панель б), увеличенный в 50 раз (панель в) (перепечатано с разрешения IRIS Graphics, Inc., Бэдфорд, Массачусетс) 0 0,0 <1< 0,2 2 0,4 < I < 0,6 3 0,6<1<0,8 4 0,8 <1< 1,0 Рис. 10.39. Набор сеток с шагом 2 на 2 пикселя, которые можно использо- вать для отображения пяти уровней интенсивности в двухуровневой систе- ме; “включенные” пиксели показаны как красные окружности. Под масси- вом пикселей указаны значения интенсивностей, которые отображаются в каждую ячейку сетки
10.9. Полутоновые шаблоны и методы псевдослучайного шума 817 0,0<К0,1 0,1<1<0,2 0,2<К0,3 4 0,4<1<0,5 5 0,5<1<0,6 6 0,6<1<0,7 7 0,7 < I < 0,8 8 0,8<1<0,9 9 0,9 < 1< 1,0 Рис. 10.40. Набор шаблонов сетки 3 на 3 пикселя, который можно использовать для отображения десяти уровней интенсивности в двухуровневой системе, где “вклю- ченные” пиксели изображены как красные кружочки. Значения интенсивностей указаны под массивами пикселей Хотя использование шаблонов пикселей п на п увеличивает число интенсивно- стей, которые можно представить, разрешение области дисплея уменьшается в п раз в направлениях х и у. Использование сетки с шаблонами 2 на 2 в экранной области 512 на 512, например, снижает разрешение до 256 на 256 позиций интенсивности, а если использовать шаблоны 3 на 3, разрешение снижается до 128 на 128. Другая проблема при использовании сеток пикселей заключается в том, что при увеличении шага сетки становятся видимыми шаблоны подсеток. Шаг сетки, кото- рый можно использовать без искажения вариаций интенсивности, зависит от размера отображенного пикселя. Следовательно, для систем с низким разрешением (меньше пикселей на сантиметр) придется удовлетвориться меньшим числом уровней интен- сивности. С другой стороны, высококачественные дисплеи требуют по крайней мере 64 уровней интенсивности. Это означает, что потребуется сетка с шагом 8 на 8 пик- селей. Кроме того, чтобы получить разрешение, эквивалентное полутонам в книгах и журналах, нужно отобразить 60 точек на сантиметр. Следовательно, должна суще- ствовать возможность отображения 60 х 8 — 480 точек на сантиметр. Такое разре- шение способны давать лишь некоторые устройства, например, высококачественные фотоаппараты. Шаблоны для сетки пикселей, подходящие для полутоновых аппроксимаций, сле- дует строить так, чтобы минимизировать подчеркивание контуров и другие визуаль- ные эффекты, отсутствующие на исходной сцене. Подчеркивание контуров можно минимизировать, если каждый последующий шаблон сетки сделать развитием преды- дущего. Следовательно, шаблон на уровне к формирует прибавление “включенной” позиции в шаблон сетки, использованный для уровня к — 1. Таким образом, если по- ложение пикселя — “включено” для одного уровня сетки, таким же оно будет для всех более высоких уровней (рис. 10.39 и 10.40). Чтобы минимизировать другие побоч-
818 Глава 10. Модели освещения и методы визуализации поверхностей Рис. 10.41. При представлении третьего уров- ня интенсивности в сетке 3 на 3 пикселя шаб- лон (панель а) лучше любого симметричного шаблона (панель б) 0 0 0 0 Рис. 10.42. Полутоновые шаб- лоны сетки с изолированными пикселями, которые невозмож- но эффективно воспроизвести на некоторых устройствах вы- дачи документальных копий 0 1 1 0 1 1 1 0 1 1 1 1 00 01 01 11 11 12 00 00 10 10 11 11 Рис. 10.43. Представление интенсивностей от 0 до 12 с помощью шаблонов полутоновой аппрок- симации и сетки 2 на 2 пикселя в четырехуровневой системе. Уровни интенсивности пикселей помечены числами от 0 до 3 Рис. 10.44. Шаблон 2 на 2 для сетки пикселей, предназначенный для отображения RGB-цветов ные визуальные эффекты, следует избегать симметричных шаблонов. Например, при использовании сетки пикселей 3 на 3 третий уровень интенсивности целесообразнее будет представить шаблоном, показанным на рис. 10.41, а, чем любой из симмет- ричных схем, представленных на рис. 10.41, б. Симметричные шаблоны на данном рисунке дадут вертикальные, горизонтальные или диагональные полосы в любой большой области, закрашенной с уровнем интенсивности 3. Для таких устройств выдачи документальных копий, как фотоаппараты или некоторые принтеры, изо- лированные пиксели воспроизводятся неэффективно. Следовательно, нужно также избегать шаблонов сеток с отдельным “включенным” пикселем или изолированными “включенными” пикселями, как показано на рис. 10.42.
10.9. Полутоновые шаблоны и методы псевдослучайного шума 819 Методы полутоновой аппроксимации можно также применить для увеличения числа отображаемых интенсивностей в системах, способных давать более двух интен- сивностей на пиксель. Например, в полутоновой системе, которая может отображать четыре значения интенсивности на пиксель, можно использовать сетку пикселей 2 на 2 и представить 13 различных уровней интенсивности. На рис. 10.43 иллюстрируется один способ выбора 13 шаблонов сетки пикселей, где каждый пиксель может иметь интенсивность 0, 1, 2 или 3. Аналогично шаблоны сеток пикселей можно использовать для увеличения числа уровней интенсивности, представляемых в цветной системе. В системе RGB с тремя битами на пиксель, например, для записи каждого цвета используется один бит на пиксель. Таким образом, пиксель отображается тремя люминофорными точками, так что пикселю может присваиваться любой из восьми различных цветов (включая чер- ный и белый). В то же время, используя шаблоны для сетки пикселей 2 на 2, получим 12 люминофорных точек, которые, как показано на рис. 10.44, можно использовать для представления цвета. Красная электронная пушка может активизировать любую комбинацию четырех красных точек в шаблоне сетки, а это дает пять возможных расстановок красного цвета в шаблоне. То же самое справедливо для зеленой и си- ней пушки, что дает в сумме 125 различных комбинаций цветов, которые можно представить с помощью шаблонов 2 на 2. МЕТОДЫ ВВЕДЕНИЯ ПСЕВДОСЛУЧАЙНОГО ШУМА Термин введение псевдослучайного шума (dithering) используется в различных кон- текстах. Во-первых, это метод аппроксимации полутонами без снижения разрешения, характерного для шаблонов сеток пикселей. Во-вторых, этот термин иногда приме- няется в названии любой схемы полутоновой аппроксимации, а иногда — в названии схемы аппроксимации цветными полутонами. Случайные значения, прибавленные к интенсивностям пикселей, чтобы убрать контуры, часто называются дополнительным шумом (dither noise). Для генерации таких случайных распределений используются различные алгоритмы. Суммарный эффект добавления шума в картину проявляется в том, что границы интенсивностей становятся более мягкими. Метод упорядоченного шума вводит колебание интенсивности со взаимно одно- значным отображением точек сцены в положения пикселей и использованием для выбора уровня интенсивности матрицы псевдослучайного шума Dn. Матрица D„ содержит п на п элементов, которым присвоены различные положительные целые значения в диапазоне от 0 до п2 — 1. Например, используя приведенную ниже матрицу, можно сгенерировать четыре уровня интенсивности. 3 0 1 2 d2 = (10.45)
820 Глава 10. Модели освещения и методы визуализации поверхностей А с помощью другой матрицы можно получить девять уровней интенсивности. D 7 2 6' 4 0 1 3 8 5. (10.46) Элементы матриц D2 и D3 идут в том же порядке, что и в маске пикселей, используе- мой в сетках 2 на 2 и 3 на 3 пикселей соответственно. Чтобы в двухуровневой системе определить отображаемые на дисплей значения интенсивности, входные интенсивно- сти сравниваются с матричными элементами. Вначале каждая входная интенсивность масштабируется в диапазон 0 < I < тг2. Если в точке экрана (т, у) нужно отобразить интенсивность I, соответствующее положение (строка и столбец) в матрице псевдо- случайного шума определяется так: j = (х mod тг) + 1, к = (у mod тг) + 1. (10.47) Если I > Dn(j, к), включается пиксель в точке (х,у). В противном случае пик- сель выключен. Для приложений в RGB-цветах данная процедура реализуется для интенсивностей каждого отдельного компонента цвета (красный, зеленый и синий). Значения элементов матрицы псевдослучайного шума присваиваются, исходя из тех же принципов, что рассматривались при обсуждении сеток пикселей. Следова- тельно, желательно минимизировать искусственные визуальные эффекты, такие как подчеркивание контуров. Упорядоченный шум дает области постоянной интенсив- ности, идентичные тем, что получаются при использовании шаблонов для сеток пикселей, когда значения матричных элементов соответствуют значениям в маске сетки полутоновой аппроксимации. Кроме того, на границе двух областей с разны- ми интенсивностями проявляются отклонения от изображений, представленных на сетке пикселей. Обычно число уровней интенсивности выбирается кратным 2. Матрицы псев- дослучайного шума большего порядка (п > 4) можно получить из матриц малых порядков, используя рекуррентное соотношение 4Dn/2 + Пг(1,1) Un/2 4Dn/2 + Вг(1,2) Un/2 _4Dn/2 + Вг(2,1) Un/2 4Dn/2 + Вг(2,2) Un/2 (10.48) Параметр Un/2 представляет единичную матрицу (все элементы — 1). Например, если подставить в уравнение (10.45) значение D2, рекуррентное соотношение (10.48) дает 15 7 13 5 3 11 1 9 12 4 10 6 0 8 2 10 (10.49)
10.9. Полутоновые шаблоны и методы псевдослучайного шума 821 Другой метод отображения изображения из т на п точек в область экран размером т на п пикселей — это диффузия ошибок. При таком подходе ошибка между входным значением интенсивности и выбранным уровнем интенсивности в данном положении пикселя распределяется по положениям пикселей справа и под текущим положением. Начав с матрицы М (значения интенсивности, полученные сканированием фотогра- фии), требуется построить массив I значений интенсивностей пикселей для области экрана. Для этого вначале строки М сканируются слева направо, начиная с верхней строки, и для каждого элемента М определяется ближайший возможный уровень интенсивности. Затем ошибка между значениями, записанными в матрице М и отоб- раженными уровнями интенсивности в каждом положении пикселя, распределяется по соседним элементам с помощью следующего упрощенного алгоритма: for (j = 0; j < m; j++) for (k = 0; k < n; k++) { /* Определить возможное в системе значение интенсивности, * ближайшее к значению М [j][к], и присвоить это * значение I [j][к]. */ 1 error = М [j][k] - I [j][к]; I [j][k+1] = М [j][к+1] + alpha * error; I [j+1][к-1] = М [j+1][к-1] + beta * error; I [j+1][к] = М [j+1][к] + gamma * error; I [j+1][к+1] = М [j+1][к+1] + delta * error; После того как элементам матрицы I присвоены значения уровней интенсивности, матрицы отображаются в некоторую область устройства отображения (например, принтер или монитор). Разумеется, ошибку нельзя распространить за последний столбец матрицы (fc = п) или ниже последней строки матрицы (j = т), и для двухуровневой системы значения интенсивностей равны просто 0 и 1. Параметры распределения ошибки можно выбрать согласно следующему правилу: a + /? + 7 + J<l. (10.50) Одним набором параметров диффузии ошибки, дающим довольно хорошие результа- ты, является (а,/3,7, <5) = (^, ^). Распределение ошибки с использованием этих значений показано на рис. 10.45. Отметим, что диффузия ошибки иногда дает повторные изображения (“ghosts”) на картинке, дублируя определенные части изобра- жения, особенно такие детали, как волосы и контуры носа. В этих случаях появление ореола можно сделать не таким заметным, выбрав значения параметров диффузии ошибки так, чтобы их сумма давала значение, меньше 1, и перемасштабировав зна- чения матрицы после распространения ошибок. Чтобы изменить масштаб, можно,
822 Глава 10. Модели освещения и методы визуализации поверхностей Столбец к ' 1 4 7 16 Строка j 3_ 16 16 X 1 16 Строка j+ 1 Рис. 10.45. Доли ошибки интенсивности, которые можно распределить по соседним положениям пикселей, используя схему диффузии ошибок Рис. 10.46. Одна возможная схема деления массива интенсивности на 64 класса точек диффузии, пронумерованных от 0 до 63 34 48 40 32 29 15 23 31 42 58 56 53 21 5 7 10 50 62 61 45 13 1 2 18 38 46 54 37 25 17 9 26 28 14 22 30 35 49 41 33 20 4 6 11 43 59 57 52 12 0 3 19 51 63 60 44 24 16 8 27 39 47 55 36 например, умножить все элементы матрицы на 0,8, а затем прибавить к ним 0,1. Дру- гой метод улучшения качества изображения заключается в чередовании сканирования строк матрицы слева направо и справа налево. Разновидностью метода диффузии ошибки является точечная диффузия. В этом методе массив значений интенсивности т на п делится на 64 класса, пронумерован- ных от 0 до 63, как показано на рис. 10.46. Затем ошибка между матричным значением и отображенной интенсивностью распределяется только по тем соседним элементам матрицы, которые имеют больший номер класса. Распределение 64 чисел класса основано на минимизации числа элементов, полностью окруженных элементами с меньшими числами класса, поскольку в противном случае в одну точку сводились бы все ошибки окружающих элементов. 10.10. МЕТОДЫ ВИЗУАЛИЗАЦИИ МНОГОУГОЛЬНИКОВ Расчет интенсивности по модели освещенности можно различными способами при- менить к визуализации поверхностей. На основе модели освещенности можно опре- делить интенсивность поверхности в любом спроектированном положении пикселя. Кроме того, модель освещенности можно применить к нескольким выбранным точкам
10.10. Методы визуализации многоугольников 823 и аппроксимировать интенсивность в других точках поверхности. В графических па- кетах поверхности обычно визуализируются с помощью алгоритмов строк развертки, сокращающих время обработки, поскольку в них используются только многоуголь- ные поверхности, а расчет интенсивностей производится только в вершинах этих многоугольников. Затем интенсивности вершин интерполируются на другие точки многоугольной поверхности. Разработаны и другие, более точные методы визуализа- ции многоугольников по строкам развертки, а в алгоритмах построения хода лучей для криволинейных или плоских поверхностей рассчитывается интенсивность в каж- дой спроектированной точке поверхности. Рассмотрим вначале схемы визуализации поверхностей по строкам развертки, которые применяются к многоугольникам. За- тем в разделе 10.11 будут исследованы методы, которые могут использоваться при построении хода лучей. ВИЗУАЛИЗАЦИЯ ПОВЕРХНОСТЕЙ ПОСТОЯННОЙ ИНТЕНСИВНОСТИ Простейший метод визуализации многоугольной поверхности — это присвоить опре- деленный цвет всем спроектированным точкам поверхности. В этом случае на основе модели освещенности определяются интенсивности трех RGB-компонентов цвета в такой отдельной точке поверхности, как вершина или центр масс многоугольника. Данный подход, называемый визуализацией поверхностей постоянной интенсивно- сти или визуализацией плоских поверхностей, предлагает быстрый и простой метод отображения многоугольных граней объекта, что может быть использовано для быст- рого получения общего внешнего вида криволинейной поверхности, подобной изоб- раженной на рис. 10.50, б. Плоская визуализация также полезна в проектировании или других приложениях, где может потребоваться быстро обозначить отдельные много- угольные грани, использованные для моделирования криволинейной поверхности. Вообще, визуализация плоских поверхностей многоугольника позволяет точно отобразить поверхность, если справедливы все следующие предположения. • Многоугольник является одной гранью многогранника, а не сегментом аппрок- симирующей сетки криволинейной поверхности. • Все источники, освещающие многоугольник, расположены достаточно далеко от поверхности, так что N • L и функция затухания равны константе на поверхности многоугольника. • Точка наблюдения достаточно удалена от многоугольника, так что произведение V • R постоянно по области многоугольника. Даже если некоторые из этих условий не выполняются, эффекты освещения поверх- ности все еще можно описать в разумном приближении, используя визуализацию поверхностей постоянной интенсивности, если грани объекта-многогранника малы.
824 Глава 10. Модели освещения и методы визуализации поверхностей Рис. 10.47. Вектор нормали в вершине V вычисляется как среднее нормалей поверхности для каждого многоуголь- ника, содержащего эту вершину Рис. 10.48. При визуализации поверхностей по ме- тоду Гуро интенсивность в точке 4 является ли- нейной интерполяцией интенсивностей вершин 1 и 2. Интенсивность в точке 5 определяется линей- ной интерполяцией интенсивностей вершин 2 и 3. Внутренняя точка р получает значение интенсив- ности, являющееся линейной интерполяцией ин- тенсивностей в точках 4 и 5 ВИЗУАЛИЗАЦИЯ ПОВЕРХНОСТЕЙ ПО МЕТОДУ ГУРО Данная схема, разработанная Генри Гуро (Henri Gouraud) и называемая визуализацией поверхностей по Гуро или визуализацией поверхности с интерполяцией интенсивно- сти, линейно интерполирует значения интенсивностей в вершинах многоугольных граней освещенного объекта. Метод Гуро, разработанный для визуализации криволи- нейных поверхностей, аппроксимированных многоугольной сеткой, дает гладкие пе- реходы значений интенсивности для каждой многоугольной грани в значения интен- сивностей смежных многоугольников, имеющих с данным общие стороны. Названная интерполяция интенсивностей по области многоугольника устраняет разрывы интен- сивности, которые могут появиться при плоской визуализации поверхностей. Каждый сегмент многоугольника мозаичной криволинейной поверхности обра- батывается методом Гуро с использованием следующих процедур. 1. Определить средний единичный вектор нормали в каждой вершине многоуголь- ника. 2. Применить модель освещенности к каждой вершине многоугольника, чтобы по- лучить интенсивность света в этой точке. 3. Линейно интерполировать интенсивности вершин по спроектированной области многоугольника.
10.10. Методы визуализации многоугольников 825 В каждой вершине многоугольника вектор нормали вычисляется как среднее век- торов нормали всех многоугольников сетки поверхности, содержащих эту вершину (рис. 10.47). Следовательно, для любой вершины V единичный вектор нормали рас- считывается так: дт _ 13fc=i N/г пл sn И., Nd' ( ’ После вычисления вектора нормали в вершине мы обращаемся к модели освещенно- сти и получаем интенсивность поверхности в этой точке. Вычислив по многоугольной сетке интенсивности всех вершин и интерполируя эти значения, можно найти интенсивности в точках вдоль строк развертки, пересе- кающих спроектированную область многоугольника, как показано на рис. 10.48. Для каждой строки развертки интенсивность в точке пересечения строки развертки со сто- роной многоугольника линейно интерполируется по интенсивностям в концах этой стороны. В примере, приведенном на рис. 10.48, сторона многоугольника с конечны- ми вершинами в точках 1 и 2 пересекается строкой развертки в точке 4. Чтобы быстро получить интенсивность в точке 4, нужно интерполировать значения в вершинах 1 и 2, используя только вертикальное смещение строки развертки: У4~У2 г ,У1'У4г -----11 4------12- У1 ~У2 У1~ У2 (10.52) В этом выражении символ I представляет интенсивность одного из RGB-компонентов цвета. Подобным образом, интенсивность в правой точке пересечения с этой стро- кой развертки (точка 5) интерполируется по значениям интенсивности в вершинах 2 и 3. Зная эти две граничные интенсивности, можно с помощью линейной интер- поляции получить интенсивности пикселей во всех точках вдоль строки развертки. Интенсивность одного RGB-компонента цвета в точке р на рис. 10.48, например, рассчитывается по интенсивностям в точках 4 и 5: Т5 Хр Хр а?4 1т> = -------------G т----------------Л5- — а?4 а?5 — а?4 (10.53) При визуализации по Гуро расчет интенсивности, представленный уравнения- ми (10.52) и (10.53), можно выполнить эффективно, используя методы последова- тельного расчета. Начав со строки развертки, пересекающей одну из вершин мно- гоугольника, можно последовательно получить значения интенсивности для других строк развертки, пересекающих сторону, соединенную с этой вершиной. Если грани многоугольника выпуклые, каждая строка развертки, пересекающая многоугольник, имеет два пересечения со стороной (точки 4 и 5 на рис. 10.48). После вычисления интенсивностей в двух точках пересечения строки развертки со стороной процеду- ра последовательного расчета дает значения интенсивностей пикселей вдоль всей строки развертки.
826 Глава 10. Модели освещения и методы визуализации поверхностей Строки развертки Рис. 10.49. Последовательная ин- терполяция значений интенсивности вдоль стороны многоугольника для последовательных строк развертки а) б) в) Рис. 10.50. Аппроксимация объекта многоугольной сеткой (панель а) отображена с использованием визуализации плоских поверхностей (панель б) и визуализации Гуро (панель в) В качестве примера последовательного расчета интенсивностей рассмотрим стро- ки развертки у и у — 1 на рис. 10.49, которые пересекают левую сторону многоуголь- ника. Если строка развертки у — это следующая строка развертки под вершиной в точке т/l с интенсивностью 1\, т.е. у = yi — 1, то интенсивность I в строке развертки у можно вычислить по уравнению (10.52): Го — -Г| / = Л + ----------. (10.54) У1 - У2 Спускаясь вниз по стороне многоугольника, находим интенсивность вдоль этой сто- роны для следующей строки развертки у — 1: Г = 1 + 12 ~ 11. (10.55) У1 ~ У2
10.10. Методы визуализации многоугольников 827 Таким образом, для вычисления каждого последующего значения интенсивности вниз по стороне к предыдущему значению интенсивности просто прибавляется постоян- ный член (I2 — Л )/(?71 ~У2)-Подобные приросты используются для получения интен- сивностей в последовательных горизонтальных положениях пикселей вдоль каждой строки развертки. Визуализацию поверхностей по Гуро можно объединить с алгоритмом поиска невидимых поверхностей и заполнять только видимые многоугольники вдоль каждой строки развертки. Пример визуализации трехмерного объекта методом Гуро приведен на рис. 10.50, в. Описанный метод интерполяции интенсивностей устраняет разрывы, присущие плоской визуализации, но имеет и свои недостатки. Блики на поверхности иногда отображаются с аномальными формами, а линейная аппроксимация интенсивности может давать на поверхности яркие или темные прожилки интенсивности, называе- мые полосами возмущения (Mach bands). Эти эффекты можно уменьшить, разделив поверхность на большее число многоугольных граней, или использовав более точный расчет интенсивности. ВИЗУАЛИЗАЦИЯ ПОВЕРХНОСТИ ПО ФОНГУ Более точный метод интерполяции при визуализации многоугольной сетки разрабо- тал Фонг Буи Туонг (Phong Bui Tuong). В данном подходе, названном визуализацией поверхностей по Фонгу или визуализацией с интерполяцией вектора нормали, интер- полируются не значения интенсивностей, а векторы нормали. В результате получают- ся более точные значения интенсивностей, более реалистичные изображения бликов (светлых пятен) поверхности, и значительно уменьшается эффект полос возмущения. В то же время, метод Фонга требует больше вычислений, чем метод Гуро. Каждая многоугольная область мозаичной криволинейной поверхности обраба- тывается методом Фонга с использованием следующих процедур. 1. Определить средний единичный вектор нормали в каждой вершине многоуголь- ника. 2. Используя нормали вершин, с помощью линейной интерполяции найти нормали во всех точках спроектированной области многоугольника. 3. Применить модель освещенности к точкам вдоль строк развертки и рассчитать ин- тенсивности пикселей с использованием интерполированных векторов нормали. Процедуры интерполяции для векторов нормали в методе Фонга идентичны процеду- рам поиска значений интенсивности в методе Гуро. Вектор нормали N на рис. 10.51 найдем с помощью вертикальной интерполяции векторов в вершинах 1 и 2: N = У~У2 + У1~У (10.56) У1 ~У2 У\~ У2
828 Глава 10. Модели освещения и методы визуализации поверхностей Рис. 10.51. Интерполяция нормалей поверхности вдоль стороны многоугольника Чтобы получить векторы нормали в последовательных строках развертки и последо- вательных положениях пикселей вдоль строк развертки, используются те же методы последовательного расчета. Разница между двумя подходами к визуализации поверх- ности состоит в том, что теперь, чтобы найти интенсивности точек поверхности, модель освещенности нужно применять в каждом пикселе проекции вдоль строк развертки. БЫСТРАЯ ВИЗУАЛИЗАЦИЯ ПОВЕРХНОСТИ ПО ФОНГУ Время обработки в методе Фонга можно сократить, аппроксимировав некоторые рас- четы в модели освещенности. В быстрой визуализации поверхностей по Фонгу интен- сивности рассчитываются с использованием усеченного разложения в ряд Тейлора, а грани сетки имеют форму треугольных участков поверхности. Поскольку в методе Фонга векторы нормали интерполируются по нормалями в вершинах, можно следующим образом записать выражение для расчета нормали к поверхности N в точке (.г, у), принадлежащей треугольному участку: N = Ах + By + С. (10.57) Здесь векторы А, В и С определены по трем уравнениям вершин: Nfc = Ахк + Вук + С, k = 1,2,3, (10.58) где через (х^, у к) обозначена вершина треугольника, спроектированная на плоскость пикселей. Опуская параметры отражения и затухания, можно записать формулу для диф- фузного отражения света, излучаемого источником, от точки поверхности (х, у): Т . . L • N L • (Ах + By + С) diff(z,y) |L||N1 |L||Ax + By + C| (L ♦ А)х + (L » В)?/+ L ♦ С |L||Ax + By + C| ’ U J
10.11. Методы построения хода лучей 829 Данное выражение можно переписать в следующей форме: r , ax + by + с Aliff (ж, у) = г, 2,-----, f 21—, . , -11/2 ’ (1 °-60> [dx. + еху + ууЛ + дх + пу + г]1'2 где такие параметры, как а, Ь, с и d, используются для представления различных скалярных произведений. Например, Наконец, знаменатель в уравнении (10.60) можно разложить в ряд Тейлора и оставить члены до второй степени по х и у. В результате получим следующее: Idiff (х, у) = Т5х2 + Т4ХУ + Т3У2 + Т2х + Т\у + То, (10.62) где все Т: являются функциями различных параметров в уравнении (10.60), таких как а, Ь и с. Если использовать правые разности, то после того, как определены исходные параметры правой разности, для вычисления уравнения (10.62) потребуется всего лишь два сложения на каждое положение пикселя (х, у). Хотя упрощения в быстром методе Фонга сокращают требуемые расчеты, визуализация поверхности все еще тре- бует примерно вдвое большего времени, чем визуализация по методу Гуро. Отметим, впрочем, что стандартный метод Фонга при использовании правых разностей требует примерно в 6-7 раз большего времени, чем визуализация Гуро. Метод быстрой визуализации по Фонгу для диффузного отражения можно рас- ширить и включить в него зеркальное отражение, для чего с помощью сходной ап- проксимации вычисляются такие зеркальные члены, как (N • Н)Па. Кроме того, опи- санный алгоритм можно обобщить и включить в него конечную точку наблюдения и многоугольники с числом вершин, превышающим три. 10.11. МЕТОДЫ ПОСТРОЕНИЯ ХОДА ЛУЧЕЙ В разделе 8.20 было введено понятие расчета луча (ray casting), которое используется в конструктивной блочной геометрии для обнаружения точек пересечения с поверх- ностью вдоль луча, идущего от положения пикселя. Кроме того, методы расчета луча рассматривались в разделе 9.10 как средство определения видимых поверхностей на сцене. Построение хода луча (ray tracing) — это обобщение стандартной процедуры расчета луча. Вместо того чтобы просто определить поверхности, видимые для каж- дого положения пикселя, луч с началом в пикселе прокладывается по сцене, как пока- зано на рис. ??, собирая различные вклады в интенсивность. Этот метод является про- стой и мощной методикой визуализации, позволяющей получать глобальные эффекты
830 Глава 10. Модели освещения и методы визуализации поверхностей несколько объектов проекции Рис. 10.53. Схема построения хода луча, де- монстрирующая эффекты глобального отра- жения и прозрачности (перепечатано с раз- решения Evans & Sutherland) отражения и пропускания. Кроме того, стандартный алгоритм построения хода лучей выявляет видимые поверхности, определяет затененные области, предусматривает ви- зуализацию эффектов прозрачности, генерирует перспективные проекции и собирает вклады в эффекты освещенности от различных источников света. В настоящее время разработано множество расширений стандартного алгоритма, позволяющих получать фотореалистичные изображения. Изображения сцен, полученные построением хода лучей, могут быть очень реалистичными, особенно если сцена содержит блестящие объекты, но алгоритмы построения хода лучей сопряжены с длительными расчетами. Пример эффектов глобального отражения и прозрачности, которые можно получить с помощью построения хода лучей, демонстрируется на рис. 10.53.
10.11. Методы построения хода лучей 831 Рис. 10.54. Система координат, в которой выполняется построение хода лучей СТАНДАРТНЫЙ АЛГОРИТМ ПОСТРОЕНИЯ ХОДА ЛУЧЕЙ Система координат для алгоритма построения хода лучей обычно задается так, как показано на рис. 10.54, со спроектированной опорной точкой, находящейся на оси z, и положениями пикселей на плоскости ху. Затем в этой системе координат описывается геометрия и генерируются лучи, проходящие через пиксели. Если сцена представляет собой перспективную проекцию, каждый луч начинается в опорной точке проекции (центр проекции), проходит через центр пикселя и продолжает движение по сцене, формируя различные ветки луча вдоль путей отражения и пропускания. Затем вкла- ды в интенсивность пикселя на пересекаемых поверхностях суммируются. Данный алгоритм визуализации основан на принципах геометрической оптики. Лучи света от поверхностей на сцене излучаются во всех направлениях, и некоторые из них прохо- дят через положение пикселя на плоскости проекции. Поскольку излучаемых лучей бесконечно много, вклады в интенсивность определенного пикселя определяются пу- тем отслеживания (построения хода) луча света обратно от положения пикселя к сцене. В стандартном алгоритме построения хода лучей для каждого пикселя генери- руется один обращенный луч света, что примерно эквивалентно рассмотрению сцены через камеру-обскуру. После генерации луча для каждого пикселя обрабатывается список поверхностей на сцене, и определяется, пересекает ли луч поверхности. Если луч проходит через поверхность, вычисляется расстояние от пикселя до точки пересечения с ней. После того как все поверхности будут проверены на предмет пересечения лучами, наимень- шее вычисленное расстояние до пересечения определяет поверхность, видимую для данного пикселя. Затем луч отражается от видимой поверхности вдоль траектории зеркального отражения (угол отражения равен углу падения). Для прозрачных по- верхностей луч также посылается через поверхность в направлении преломления. Отраженные и преломленные лучи называются вторичными.
832 Глава 10. Модели освещения и методы визуализации поверхностей Рис. 10.55. Пути отражения и преломления для луча от пикселя, проходящего через сцену (па- нель а), и соответствующее бинарное дерево построения хода луча (панель б) Затем процедура построения хода лучей повторяется для вторичных лучей. По- верхности проверяются на предмет пересечения с лучами, а ближайшая поверхность (если она есть) вдоль траектории вторичного луча используется для рекурсивного со- здания следующего поколения путей отражения и преломления. При рикошете лучей, выходящих из пикселей, каждая последовательно пересекаемая поверхность прибав- ляется к бинарному дереву построения хода лучей, как показано на рис. 10.55. Левые ветки дерева используются для представления траекторий отражения, а правые — тра- екторий пропускания. Максимальная глубина деревьев построения хода лучей может задаваться пользователем или определяться по объему доступной памяти. Путь луча от пикселя на бинарном дереве обрывается, если выполняется одно из перечисленных ниже условий. • Луч не пересекает поверхность. • Луч пересекает источник света, не являющийся отражающей поверхностью. • Дерево дошло до максимально разрешенной глубины. В каждой точке пересечения с поверхностью мы обращаемся к модели освещен- ности, чтобы определить вклад в интенсивность поверхности. Полученное значение интенсивности записывается в соответствующем узле на дереве пикселей. Лучу, пе- ресекающему неотражающий источник света, может присваиваться значение интен- сивности источника, хотя источники света в стандартном алгоритме построения хода луча являются точечными и располагаются за координатными границами сцены. На рис. 10.56 показано пересечение лучом поверхности и единичные векторы, исполь- зуемые для расчета интенсивности отраженного света. Единичный вектор и идет по направлению пути луча, N — единичная нормаль к поверхности, R — единичный
10.11. Методы построения хода лучей 833 Рис. 10.56. Единичные векторы на поверхности объекта, кото- рый пересекается лучом, иду- щим вдоль направления и Рис. 10.57. Путь преломленного и отраженного луча Т при прохожде- нии через прозрачный материал вектор отражения, L — единичный вектор, указывающий направление к точечному источнику света, а Н — единичный вектор, лежащий на полпути между L и V. В алгоритме построения хода луча направление наблюдения V = —и. Путь вдоль на- правления L называется теневым лучом. Если любой объект пересекает теневой луч между поверхностью и точечным источником света, элемент поверхности находится в тени. Рассеянный свет на поверхности вычисляется как kaIa', диффузное отражение, обусловленное источником, пропорционально • L); а компонент зеркального отражения пропорционален /с5(Н • N)”s. Как обсуждалось в разделе 10.3, направле- ние зеркального отражения для вторичного луча R зависит от нормали к поверхности и направления падающего луча: R = и - (2и • N)N. (10.63)
834 Глава 10. Модели освещения и методы визуализации поверхностей Для прозрачной поверхности также требуется получить вклад интенсивности от све- та, переданного (преломленного) через материал. Источник этого вклада можно лока- лизировать, построив вторичный луч вдоль направления пропускания Т, как показано на рис. 10.57. Единичный вектор пропускания Т можно получить по векторам и и N: Т = — и — ( cos0r — — cosdi ) N. 7]r \ ?7r / (10.64) Параметры гц и т]г — это показатели преломления материала, в котором распростра- няется падающий свет, и материала, в котором распространяется преломленный свет, соответственно. Угол преломления вг можно вычислить по закону Снелла: cos вг (10.65) \ 2 — ) (1 — COS2 0Д JJr / После того как для пикселя построено двоичное дерево, вклады интенсивности сум- мируются, начиная с низа (заключительные узлы) дерева. Интенсивность поверхно- сти от каждого узла дерева затухает с расстоянием от “родительской” поверхности (следующий узел вверх по дереву) и прибавляется к интенсивности родительской поверхности. Интенсивность, присвоенная пикселю, — это сумма интенсивностей (с учетом затухания) в корневом узле дерева луча. Если первичный луч, исходящий от пикселя, не пересекает объект на сцене, дерево хода луча пустое, и пикселю присва- ивается значение фоновой интенсивности. РАСЧЕТ ПЕРЕСЕЧЕНИЯ ЛУЧА С ПОВЕРХНОСТЬЮ Луч можно описать его началом Ро и единичным вектором направления и, как пока- зано на рис. 10.58. Координаты любой точки Р, лежащей на луче на расстоянии s от Ро, можно вычислить по следующему уравнению луча. Р = Ро + SU. (10.66) Рис. 10.58. Описание луча через вектор нача- ла Ро и единичный вектор направления и
10.11. Методы построения хода лучей 835 Изначально вектор Ро можно установить в положение Рр;х пикселя на плоскости проекции или использовать в этом качестве опорную точку проекции. Единичный вектор и изначально вычисляется по положениям пикселя, через который проходит луч, и опорной точки проекции: _ Р pix Р ргр |Ppix — Рргр | (10.67) Хотя вектор и не обязательно должен быть единичным, такой выбор упрощает неко- торые расчеты. Чтобы найти точку пересечения луча с поверхностью Р, используем уравнение поверхности (формула (10.66)). В результате получим значение параметра з, который представляет расстояние от Ро до точки пересечения пути луча с поверхностью. С каждой пересеченной поверхностью векторы Ро и и обновляются для вторич- ных лучей в этой точке пересечения. Для вторичных лучей направление отражения u — R, а направление прохождения — Т. Когда обнаруживается пересечение вторич- ного луча с поверхностью, решается система из уравнения луча и уравнения поверх- ности, из которой находятся координаты пересечения. Затем обновляется бинарное дерево и генерируется следующий набор отраженных и преломленных лучей. Для большинства распространенных форм, включая сплайновые поверхности, были разработаны эффективные алгоритмы нахождения пересечения луча с поверх- ностью. Общая процедура выглядит так: объединить уравнение луча с уравнением, описывающим поверхность, и найти из этой системы параметр s. Во многих случаях для определения точек пересечения с поверхностью используются численные методы нахождения корней и последовательные расчеты. Для сложных объектов часто удобно преобразовать уравнение луча в локальную систему координат, в которой определен объект. Кроме того, во многих случаях расчет интенсивности для сложного объекта можно упростить, преобразовав объект в более удобную форму. Например, постро- ить ход луча через эллипсоид можно, преобразовав уравнения луча и поверхности в задачу пересечения сферы. На рис. 10.59 показана сцена, содержащая несколько объектов и текстурные узоры, полученная с построением хода лучей. Рис. 10.59. Сцена с построе- нием хода лучей, демонстри- рующая глобальное отраже- ние текстурных узоров по- верхности (перепечатано с разрешения Sun Microsystems)
836 Глава 10. Модели освещения и методы визуализации поверхностей Рис. 10.60. Луч, пересекающий сферу радиуса г с центром в точке Рс ПЕРЕСЕЧЕНИЕ ЛУЧОМ СФЕРЫ При построении хода лучей простейшими объектами являются сферы. Если дана сфе- ра с радиусом г и центром в точке Рс (рис. 10.60), то любая точка Р на поверхности удовлетворяет уравнению сферы: |Р — Рс|2 — г2 — 0. (10.68) Подставляя уравнение луча (10.66) для точки Р в предыдущее уравнение, получаем: |Р0 - SU - Рс|2 - г2 = 0. (10.69) Если представить Рс — Ро как ДР и расписать скалярное произведение, получим квадратное уравнение: 52-2(и.ДР)5 + (|ДР|2-г2) = 0, (10.70) решение которого — s = и • Д Р ± У(и-ДР)2 - |ДР|2 + г2. (10.71) Если дискриминант отрицательный, то либо луч не пересекает сферу, либо сфера лежит позади Pq. В любом случае сферу можно исключить из дальнейшего рассмот- рения, поскольку предполагается, что сцена находится перед плоскостью проекции. Если дискриминант неотрицательный, то координаты пересечения с поверхностью из уравнения луча (10.66) определяются меньшим из двух решений уравнения (10.71). На рис. 10.61 показана сцена с построенным ходом лучей, содержащая “снежинку”, сформированную блестящими поверхностями, на примере которых видно глобаль- ное отражение от поверхностей, возможное при использовании техники построения хода лучей. Чтобы снизить время расчетов, можно использовать некоторые оптимизации зада- чи пересечения луча со сферой. Кроме того, уравнение (10.71) подвержено ошибкам
10.11. Методы построения хода лучей 837 Рис. 10.61. “Сфера-снежинка”, визуализированная с помощью построения хода лучей. В изображении использовано 7 381 сфер и 3 источника света (перепечатано с разрешения Эрика Хайнса (Eric Haines), Autodesk, Inc.) округления при обработке небольшой сферы, расположенной далеко от начала луча. Следовательно, если г2 < |ДР|2, можно потерять член г2 в случайной ошибке |ДР|2. В большинстве случаев этого можно избежать, следующим образом переупорядочив вычисления для точки, лежа- щей на расстоянии s от начала луча: s — и • ДР ± ^/г2 — | ДР — (и • ДР)и|2. (10.72) ПЕРЕСЕЧЕНИЯ ЛУЧА С МНОГОГРАННИКОМ Расчет пересечения лучом многогранника сложнее, чем задача со сферой. Следова- тельно, часто более эффективно обработать многогранник, проверив вначале, пересе- кает ли луч некоторый граничный объем. Например, на рис. 10.62 показан многогран- ник, расположенный внутри сферы. Если луч не пересекает граничную сферу, много- гранник можно исключить из дальнейших проверок. В противном случае нужно опре- делить передние грани фигуры — многоугольники, удовлетворяющие неравенству и • N < 0, (10.73)
838 Глава 10. Модели освещения и методы визуализации поверхностей Рис. 10.62. Многогранник, вписанный в сферу где N — нормаль к поверхности многоугольника. Для каждой грани многогранника, удовлетворяющей условию (10.73), записывается уравнение плоскости N«P = -D (10.74) для точки поверхности Р, также удовлетворяющей уравнению луча (10.66). В при- веденном выражении N — (А, В, С) и D — четвертый параметр плоскости. Точка Р принадлежит и плоскости, и лучу, если N • (Ро + su) = -D, (10.75) а расстояние от начала луча до плоскости равно Решая этой уравнение, находим точку на бесконечной плоскости, содержащей грань-многоугольник, хотя эта точка может находиться вне границ многоугольника (рис. 10.63). Таким образом, нужно выполнить проверку типа “внутри или снаружи” (раздел 3.15) и определить, пересекает ли данный луч эту грань многогранника. Дан- ная проверка выполняется для каждой грани, удовлетворяющей неравенству (10.73). Наименьшее расстояние s до пересекаемого многоугольника определяет точку пере- сечения поверхности многогранника. Если ни одна из точек пересечения, найден- ных из уравнения (10.76), не относится к внутренним точкам, луч не пересекает многогранник. СОКРАЩЕНИЕ ВЫЧИСЛЕНИЙ ПРИ РЕШЕНИИ ЗАДАЧИ ПЕРЕСЕЧЕНИЯ ЛУЧОМ ОБЪЕКТА Расчет точки пересечения луча с поверхностью может занимать до 95% времени обработки в методе построения хода луча. Для сцены с большим числом объектов большая часть времени обработки для каждого луча — это проверка объектов, невиди- мых по ходу луча. Таким образом, было разработано несколько методов сокращения времени обработки, которое тратится на эти расчеты.
10.11. Методы построения хода лучей 839 Один способ сократить расчеты пересечений — замкнуть группы соседствующих объектов в граничный объем, например, сферу или куб (рис. 10.64). Затем можно про- верить, пересекает ли луч этот граничный объем. Если нет, вписанные поверхности исключаются из дальнейших проверок на пересечение. Данный подход можно рас- ширить и включить в рассмотрение иерархии замыкающих объемов. Следовательно, несколько граничных объемов заключаются в больший объем, и проверки на пересе- чение выполняются иерархически. Вначале проверяется внешний граничный объем; затем (при необходимости) — меньшие внутренние граничные объемы и т.д. МЕТОДЫ ДЕЛЕНИЯ ПРОСТРАНСТВА Другой путь сокращения расчетов — использовать процедуры деления пространства. Всю сцену можно замкнуть в куб, затем последовательно делить его, пока каждая подобласть (ячейка) не будет содержать не более, чем заданное минимальное чис- ло поверхностей. Например, можно потребовать, чтобы каждая ячейка содержала не более одной поверхности. Если доступны возможности параллельной и векторной об- работки, максимальное число поверхностей на ячейку можно определить по размеру векторного регистра и числу процессов. Деление пространства куба можно пред- ставить в октодереве или BSP-дереве. Кроме того, можно выполнить равномерное
840 Глава 10. Модели освещения и методы визуализации поверхностей Рис. 10.65. Пересечение луча с кубом, вмещающим все объекты на сцене Рис. 10.66. Прохождение луча через подобласть (ячейку) куба, вме- щающего сцену деление, на каждом шаге разбивая куб на восемь равных октантов, или адаптивное деление, разбивая только те области куба, которые содержат объекты. Затем через отдельные ячейки куба строится путь лучей, причем проверки на пересечение выполняются только в ячейках, содержащих поверхности. Первая пере- сеченная лучом поверхность является видимой поверхностью для этого луча. Стоит отметить, что существует определенная связь между размером ячейки и числом по- верхностей на ячейку. Если снижать максимальное число разрешенных поверхностей на ячейку, сокращается объем вычислений, необходимых для проверок пересечения поверхности, но при этом также сокращается размер ячейки, так что для определения пути луча через ячейки требуется больше вычислений. На рис. 10.65 иллюстрируется пересечение луча пикселя с передней гранью куба, окружающего сцену. Точка пересечения на передней грани куба определяет исходную ячейку, которую пройдет луч. Чтобы провести луч через ячейки куба, можно опреде- лить координаты точек входа и выхода (рис. 10.66). В каждой непустой ячейке прове- ряется возможность пересечения луча с поверхностью. Описанная обработка продол- жается, пока луч не пересечет поверхность объекта или не выйдет из граничного куба.
10.11. Методы построения хода лучей 841 Для данного единичного вектора направления и и точки входа луча Pin в ячей- ку определяются потенциальные грани выхода ячейки — грани, удовлетворяющие неравенству и • Nfc > 0, (10.77) где Nfc представляет единичный вектор нормали к поверхности для грани к ячейки. Если единичные векторы нормали для граней поверхности на рис. 10.66 пущены по осям декартовой системы координат, тогда f (±1,0,0) Nfc = { (0,±1,0) Ц0,0,±1), (10.78) и можно определить три потенциальные плоскости выхода, просто проверив знак каждого компонента и. Положения выхода каждой потенциальной плоскости полу- чаются из уравнения луча: Pout,/с — Pin ± (10.79) где ед, — расстояние по лучу от Pjn до POut,fc- Подставляя уравнение луча в уравнение плоскости для каждой грани ячейки, получаем Nfc • Pout.fc = -Dk, (10.80) и расстояние по лучу до каждой потенциальной грани выхода вычисляется следую- щим образом: Dk Nfc • Р;п /inon “ = Nt.u ' (1°'81) Наименьшее вычисленное значение Sk определяет грань выхода из ячейки. Если гра- ни ячейки выравнены по плоскостям декартовой системы координат, векторы нор- мали Nfc — это единичные векторы осей (10.78), и вычисления в уравнении (10.81) можно упростить. Например, если потенциальная плоскость выхода характеризуется вектором нормали (1,0, 0), то для этой плоскости получаем: •Д/с *до •5/с (10.82) где u = (ux,uy,uz), Xk = — Dk — координаты потенциальной плоскости, a xq — координата входной грани ячейки.
842 Глава 10. Модели освещения и методы визуализации поверхностей Рис. 10.67. Пример пробной плоскости выхода с пронумерованными секторами Рис. 10.68. Сцена с параллельным по- строением хода лучей, содержащая 37 сфер и 720 многоугольных поверхно- стей. В алгоритме построения хода лу- чей используется 9 лучей на пиксель и дерево с глубиной 5. На машине А1- liant FX/8 использование методов деле- ния пространства позволяет в 10 раз со- кратить время обработки по сравнению со стандартным алгоритмом построения хода лучей (перепечатано с разрешения Ли-Хьян Куэк (Lee-Hian Quek), Oracle Corporation, Рэдвуд Шорз, Калифорния) Процедуру прохождения через ячейку можно модифицировать для ускорения об- работки. Например, пробную плоскость выхода к можно выбрать перпендикулярно направлению наибольшего компонента и. Данная пробная плоскость выхода затем делится на секторы, как показано в примере на рис. 10.67. Истинную плоскость вы- хода определяет сектор в пробной плоскости, содержащий Pout,fc- Например, если точка пересечения POut,fc находится в секторе 0 плоскости на рис. 10.67, пробная плоскость является действительной плоскостью выхода, и искомый результат полу- чен. Если же точка пересечения находится в секторе 1, истинная плоскость выхода — верхняя плоскость, и нужно просто рассчитать точку выхода на верхней границе ячей- ки. Подобным образом, сектор 3 указывает, что истинная грань выхода — это нижняя плоскость; секторы 4 и 2 дают левую и правую грани ячейки соответственно. Если пробный выход попадает в сектор 5, 6, 7 или 8, необходимы два дополнительных расчета, чтобы определить истинную плоскость выхода. Отметим, что дальнейше- го повышения производительности можно достичь, реализовав описанные методы в машине с параллельной векторной обработкой.
10.11. Методы построения хода лучей 843 Рис. 10.69. Визуализация приведенной сцены с построением хода лучей требует 24 секунды на параллельном компьютере KSR1 (Kendall Square Research) с 32 процессорами. Роденовский Мыс- литель смоделирован 3 036 примитивами. Для получения глобальных эффектов освещения по 1 675 776 обработанным лучам использовались два источника света и один первичный луч на пиксель {перепечатано с разрешения М. Дж. Ки- тиса (М. J. Keates) и Р. Дж. Хаббольда (R. J. Hubbold), факультет информации, Манчестер- ский университет, Великобритания) Сцена на рис. 10.68 была получена построением хода лучей с использованием методов деления пространства. Без деления пространства расчет занимал в 10 раз больше времени. Если удалить со сцены многоугольники, выигрыш от использова- ния деления пространства еще больше — для сцены, содержащей 2 048 сфер и ни одного многоугольника, тот же алгоритм выполняется в 46 раза быстрее стандартного алгоритма построения хода лучей. На рис. 10.69 иллюстрируется другая сцена, для создания которой применялось построение хода лучей с использованием деления пространства и методы параллель- ной обработки. Данное изображение скульптуры Родена Мыслитель визуализирова- лось за 24 секунды при использовании более 1,5 миллионов лучей. Для визуализации сцены, изображенной на рис. 10.70, использовалась схема бу- фера света, являющаяся разновидностью пространственного деления. На рисунке в каждой точке источника света центрирован куб, и каждая сторона куба делится с ис- пользованием квадратной сетки. Затем для ускорения обработки лучей тени записыва- ется упорядоченный список объектов, на которые падает свет через каждый квадрат. Для определения эффектов освещенности поверхности вычисляется квадрат каждого луча тени, и далее луч тени обрабатывается со списком объектов для этого квадрата. Число проверок пересечения в программах построения хода лучей также можно сократить с помощью процедур направленного деления, рассмотрев секторы, содер- жащие пучок лучей. В пределах каждого сектора поверхности можно упорядочить по глубине, как показано на рис. 10.71. Затем каждый луч нужно проверить только с объектами, лежащими в секторе, содержащем этот луч.
844 Глава 10. Модели освещения и методы визуализации поверхностей Рис. 10.70. Комнатная сцена, освещенная 5 источниками света (панель а), визуализированная с исполь- зованием метода светового буфера и построением хода лучей для обработки лучей тени. Крупный план (панель б) части комнаты, показанной на панели а, иллюстрирует глобальные эффекты освещенности. Комната смоделирована с использованием 1 298 многоугольников, 4 сфер, 76 цилиндров и 35 поверх- ностей второго порядка. Время визуализации — 246 минут на машине VAX 11/780 по сравнению с 602 минутами без использования буферов света (перепечатано с разрешения Эрика Хайнса (Eric Haines) и Дональда П. Гринберга (Donald Р. Greenberg), Program of Computer Graphics, Университет Корнелла) Рис. 10.71. Направленное деление про- странства. Для лучей пикселей в ука- занном секторе в порядке глубины вы- полняются проверки пересечения с по- верхностями, лежащими в секторе Иь/и^АЦИЯ ЭФФЕКТОВ ФОКУСИРОВКИ КАМЕРЫ Чтобы смоделировать на сцене эффект наблюдения через камеру, нужно задать фо- кусное расстояние и другие параметры выпуклой линзы (или апертурной диафрагмы камеры), которая размещается перед плоскостью проекции. Затем параметры линзы задаются так, чтобы некоторые объекты на сцене были в фокусе, а остальные — нет. Фокусное расстояние линзы — это расстояние от центра линзы до фокуса F, кото- рый является точкой схождения набора параллельных лучей, проходящих через линзу
10.11. Методы построения хода лучей 845 Рис. 10.72. Вид сбоку тонкой выпуклой линзы. Параллельные лучи фокусиру- ются линзой в точке на фокальной плоскости, расположенной на расстоянии f от центра линзы (рис. 10.72). Типичное значение фокусного расстояния для 35-миллиметровой каме- ры — f = 50 мм. Апертурные диафрагмы камеры обычно описываются параметром п, называемым диафрагментарным числом, и являющимся отношением фокусного расстояния к диаметру апертуры: f 2г (10.83) Таким образом, радиус г или диафрагментарное число п и фокусное расстояние f можно использовать, чтобы задать параметры камеры. Чтобы сымитировать эффекты наблюдения с помощью камеры в более точной модели фокусировки, можно исполь- зовать формат пленки (высоту и ширину) и фокальное расстояние. В алгоритмах построения хода луча эффекты фокусировки обычно определяются с использованием уравнения тонкой линзы из геометрической оптики: 1 £ _ 1 d + f (10.84) Параметр d — это расстояние от центра линзы до положения объекта, a di — расстоя- ние от центра линзы до плоскости изображения, на которой данный объект находится в фокусе. Объект и его изображения расположены с разных сторон линзы на линии, проходящей через центр линзы, и d > f (рис. 10.73). Следовательно, чтобы сфоку- сироваться на определенном объекте, который находится на расстоянии d от линзы, плоскость пикселей нужно расположить на расстоянии di за линзой.
846 Глава 10. Модели освещения и методы визуализации поверхностей объекта изображения Рис. 10.73. Параметры тонкой линзы. Объект, расположенный на расстоянии d от линзы, находится в фокусе на плоскости изображения, проходящей на расстоянии di от линзы Для точки сцены на некотором расстоянии d' dee проекция на плоскости изоб- ражения будет не в фокусе. Если d' > d, точка находится в фокусе перед плоскостью изображения, а если d' < d — за ней. Проекция точки в d1 на плоскости изобра- жения приблизительно представляется небольшой окружностью, именуемой пятном рассеяния, и диаметр этого пятна можно вычислить следующим образом: \d'-d\f *'С — 1 па Параметры камеры можно выбрать так, чтобы минимизировать размер пятна рассе- яния для некоторого диапазона расстояний, именуемого глубиной поля этой камеры. Кроме того, для каждого пикселя строятся несколько лучей, охватывающих область линзы, а более подробно соответствующие методы распределенных лучей рассмот- рены в следующем разделе. (10.85) ПОСТРОЕНИЕ ЛУЧЕЙ БЕЗ НАЛОЖЕНИЯ Двумя основными методами предотвращения наложения, используемыми в алгорит- мах построения хода лучей, являются передискретизация и адаптивная дискретиза- ция. Дискретизация в построении хода лучей является расширением методов защиты от наложения, рассмотренных в разделе 4.17. При передискретизации и адаптивной дискретизации пиксель рассматривается как конечная квадратная область, а не про- сто отдельная точка. В схеме передискретизации в каждой области-пикселе обычно используется несколько равномерно расположенных лучей (выборок). В адаптивной
10.11. Методы построения хода лучей 847 Рис. 10.74. Передискретиза- ция с четырьмя лучами на пиксель, по одному на каж- дый угол Рис. 10.75. Деление пикселя на девять подпикселей с использованием по одному лучу на каждый угол подпикселя дискретизации применяются неравномерно размещенные лучи в некоторых областях пикселя. Например, чтобы лучше оценить интенсивность пикселей, возле краев объ- екта можно использовать больше лучей. (Другой метод дискретизации — случайным образом распределить лучи по области пикселя. Данный подход будет рассмотрен в следующем разделе.) При использовании нескольких лучей на пиксель интенсивность лучей, исходящих из пикселей, усредняется и дает общую интенсивность пикселя. Простая процедура передискретизации иллюстрируется на рис. 10.74. Здесь ге- нерируется по одному лучу на каждый угол пикселя. Если интенсивности, вычислен- ные для четырех лучей, не равны (приблизительно), или если некоторый небольшой объект лежит между четырьмя лучами, область пикселя делится на подпиксели, и процесс повторяется. Например, пиксель на рис. 10.75 делится на девять подпиксе- лей, и далее используются 16 лучей, по одному на каждый угол подпикселя. Затем применяется адаптивная дискретизация, и подпиксели, накрывающие малый объект или не имеющие лучей с приблизительно равной интенсивностью, снова разбиваются на элементы. Данный процесс деления может продолжаться, пока лучи подпикселей не будут иметь приблизительно равные интенсивности, или пока не будет достигнут верхний предел (скажем, 256) числа лучей на пиксель.
848 Глава 10. Модели освещения и методы визуализации поверхностей Raytracers’ Recess • Parallel camera models • Stereo clipping Рис. 10.76. Сцена, сгенерированная методами построения хода лучей с адаптивным делением (перепечатано с разрешения Джерри Фарма (Jerry Farm)) Рис. 10.77. Начала лучей расположены в центрах подпикселей На рис. 10.76 представлен пример сцены, визуализированной с использованием построения хода лучей и адаптивного деления. Для создания реалистичных мягких оттенков (полутеней) использовался неточечный источник света. Было сгенериро- вано примерно 26 миллионов первичных лучей, 33,5 миллионов теневых лучей и 67,3 миллиона отраженных лучей. Для разработки шахматных фигур использовались методы каркасно-шарнирных фигур (раздел 13.8). Шаблоны текстуры древесины и мраморной поверхности генерировались с использованием методов объемного тек- стурирования (раздел 10.16) на основе функции шума. Вместо того, чтобы пускать лучи из углов пикселей, можно генерировать лучи, исходящие из центров подпикселей, как показано на рис. 10.77. При таком подходе лучам можно присваивать весовые коэффициенты согласно одной из схем дискрети- зации, рассмотренных в разделе 4.17. Другой метод построения сцен с защитой от наложения — это считать луч, ис- ходящий из пикселя, конусом, как показано на рис. 10.78. На каждый пиксель гене- рируется только один луч, но теперь этот луч имеет конечное поперечное сечение. Чтобы определить, какой процент области пикселя охвачен объектами, вычисляется
10.11. Методы построения хода лучей 849 Рис. 10.78. Пучок лучей пикселя пересечение конуса пикселя с поверхностью объектов. Для сферы это требует по- иска пересечения двух окружностей. Для многогранника нужно найти пересечение окружности с многоугольником. РАСПРЕДЕЛЕННОЕ ПОСТРОЕНИЕ ХОДА ЛУЧЕЙ В данном методе стохастической дискретизации лучи согласно различным парамет- рам модели освещенности распределяются случайно. В число параметров освещенно- сти входят площадь пикселя, направления отражения и преломления, площадь линзы камеры и время. Таким образом, эффекты наложения замещаются низкоуровневым шумом, который улучшает качество изображения и позволяет более точно моделиро- вать глянец и полупрозрачность поверхности, конечные апертуры камеры, конечные источники света и отображение движущихся объектов с расфокусировкой. Распреде- ленное построение хода лучей, по сути, предлагает расчет по методу Монте-Карло кратных интегралов, появляющихся при точном физическом описании освещения поверхности. Дискретизация пикселей выполняется путем случайного распределения несколь- ких лучей по площади пикселя. Однако полностью случайный выбор положений лучей может привести к образованию кластера лучей в маленькой области площа- ди пикселя, в то время как большие части пикселя будут без выборок. Наилучшую аппроксимацию распределения света по области пикселя дает метод дрожания в регулярной сетке подпикселей. Для этого область пикселя (единичный квадрат) изна- чально делится на 16 подобластей, показанных на рис. 10.79, и в каждой подобласти генерируется случайная дрожащая точка. Случайные положения лучей находятся путем небольшого смещения координат центра каждой подобласти на небольшие ве- личины 5Х и 6У, где —0,5 < 5Х,5У < 0,5. Затем точка со случайным отклонением выбирается как (х + 5Х, у + 5У), где (х, у) — центр пикселя.
850 Глава 10. Модели освещения и методы визуализации поверхностей Рис. 10.79. Дискретизация пикселя с использованием 16 подпикселей и дро- жащее положение луча возле центра каждой подобласти • • • • • • • • • • • • • • • • Всем 16 лучам присваиваются целые коды от 1 до 16, а затем с помощью таблицы соответствий находятся другие параметры, такие как угол отражения и время. Путь каждого луча подпикселя по сцене обрабатывается, и определяется вклад данного луча в интенсивность. Затем 16 интенсивностей лучей усредняются и используются в качестве общей интенсивности пикселя. Если интенсивности подпикселя меняются значительно, пиксель можно разбить на меньшие части. Чтобы сымитировать эффект линз камеры, нужно обработать лучи пикселей, про- ходящие через линзу, расположенную перед плоскостью пикселей. Как отмечалось ранее, присутствие камеры имитируется с использованием фокусного расстояния и других параметров, так что выбранные объекты будут находиться в фокусе. Затем лучи подпикселей распределяются по площади апертуры. Предполагая, что исполь- зуется 16 лучей на пиксель, площадь апертуры можно разделить на 16 зон. Затем с каждым подпикселем сопоставляется центральная точка одной из зон, а для определе- ния выборочного распределения пикселя используется следующая процедура. Возле центра каждой зоны рассчитывается смещенное положение, и луч проектируется на сцену из этой смещенной точки зоны через фокус линзы. Фокус луча размещается на расстоянии f от линзы вдоль прямой, проходящей через центр линзы, как показа- но на рис. 10.80. Если плоскость пикселей расположена на расстоянии di от линзы (рис. 10.73), точки вдоль луча рядом с плоскостью объекта (фокальная плоскость), расположенной на расстоянии d перед линзой, находятся в фокусе. Другие точки вдоль луча выглядят размытыми. Чтобы улучшить отображение объектов, находя- щихся не в фокусе, увеличивается число лучей подпикселей. Пути отражения и передачи также распределяются по пространственной обла- сти. Чтобы смоделировать глянцевый блеск поверхности, лучи, отраженные от точки поверхности, распределяются вокруг направления зеркального отражения R соглас- но присвоенным кодам лучей (рис. 10.81). Максимальный диапазон R делится на 16 угловых зон, и каждый луч отражается в смещенном положении от центра зоны, соответствующей его целому коду. Чтобы определить максимальное распределение углов отражения, можно использовать модель Фонга (cos”s ф). Если материал про- зрачный, преломленные лучи распределяются вокруг направления пропускания Т подобно тому, как это делается при моделировании полупрозрачности (раздел 10.4).
10.11. Методы построения хода лучей 851 I ( Положение подпикселя Плоскость изображения Рис. 10.80. Распределение лучей подпикселей по линзе камеры с фокусным рас- стоянием / Неточечный источник света Рис. 10.81. Моделирование глянцевого блеска и полупрозрачности путем распределения лучей подпикселей возле направления отра- жения R и направления передачи Т Рис. 10.82. Распределение лучей тени по конечному источнику света Для обработки неточечных источников света по площади источника распределя- ется несколько лучей тени (рис. 10.82). Источник света делится на зоны, и с лучами тени соотносятся смещенные направления в сторону различных зон. Кроме того, зоны могут взвешиваться согласно интенсивности источника света в этой зоне и раз- меру проекции зоны на поверхность объекта. Затем в зоны с большими весовыми коэффициентами направляется больше лучей тени. Если некоторые лучи тени пересе- кают непрозрачные объекты, находящиеся между поверхностью и источником света, в этой точке поверхности генерируется полутень (частично освещенная область). Од-
852 Глава 10. Модели освещения и методы визуализации поверхностей Рис. 10.83. Области тени и полутени, созданные солнечным затмением, наблюдаемым с поверхности Земли нако, если все лучи тени блокируются, точка поверхности находится в тени (сплошная темная область) этого источника света. На рис. 10.83 иллюстрируются области тени и полутени поверхности, частично закрытой от источника света. Для получения размытости, вызванной движением, лучи распределяются во вре- мени. Суммарное время кадра и деление времени кадра определяются согласно ди- намике движения, требуемой для данной сцены. Временные интервалы помечаются целыми кодами, а каждому лучу присваивается смещенное время в пределах интер- вала, соответствующего коду луча. Затем объекты перемещаются на их положения, определенные для этого момента времени, и строится ход луча по сцене. Для сильно размытых объектов используются дополнительные лучи. Чтобы сократить расчеты, в исходных проверках пересечения лучом поверхности можно использовать ограни- чивающие кубы или сферы. Следовательно, ограничивающий объект перемещается согласно требованиям движения и проверяется на возможное пересечение лучом. Если луч не пересекает граничный объект, отдельные поверхности, замкнутые в гра- ничном объеме, обрабатывать не надо. На рис. 10.84 показана сцена с размытостью, вызванной движением. Данное изображение визуализировано с использованием рас- пределенного построения хода лучей при размере 4096 на 3550 пикселей и 16 лучах на пиксель. Помимо размытости, отображены тени и полутени, порожденные нето- чечными источниками света, освещающими стол для бильярда. Дополнительные примеры объектов, визуализированных с использованием мето- дов распределенного построения хода лучей, приведены на рис. 10.85 и 10.86. На рис. 10.87 иллюстрируется результат фокусировки, преломления и эффектов защиты от наложения с помощью распределенного построения хода лучей. 10.12. МОДЕЛИ ДИФФУЗНОГО ОТРАЖЕНИЯ Хотя стандартная модель освещения дает разумные результаты во многих прило- жениях, существует множество эффектов освещения, которые неточно описываются простыми аппроксимациями этой модели. Более точно эффекты освещения можно смоделировать, рассмотрев законы физики, описывающие распространение лучистой энергии на освещенной сцене. Подобный метод вычисления цветов пикселей обычно называется моделью диффузного отражения.
10.12. Модели диффузного отражения 853 Рис. 10.84. Сцена 1984, которая визуализирова- лась с использованием распределенного по- строения хода лучей. Эффекты освещения включают размытость, вызванную движением, полутени и отражение от поверхности света от нескольких неточечных излучателей (перепе- чатано с разрешения Pixar. © 1984, Pixar) Рис. 10.85. Раскрашенное алюминиевое колесо, демон- стрирующее эффекты отражения и затенения, сгенери- рованные методами распределенного построения ходу лучей (перепечатано с разрешения Стефана Уэстина (Stephen Н. Westin), Program of Computer Graphics, Уни- верситет Корнелла) СЛАГАЕМЫЕ ЛУЧИСТОЙ ЭНЕРГИИ В квантовой модели света энергия излучения переносится отдельными фотонами. Для монохроматического света энергия каждого фотона вычисляется следующим образом ^photon,/ — hf, (10.86) где частота f, измеряемая в герцах (единицах за секунду), характеризует цвет света. Синий свет имеет высокую частоту в видимой полосе электромагнитного спектра, а красный свет — низкую. Частота также определяет частоту осцилляции амплитуды электрического и магнитного компонентов излучения. Параметр h — это постоянная Планка, имеющая значение 6,6262 х 10-34 Дж • с, независимо от частоты света.
854 Глава 10. Модели освещения и методы визуализации поверхностей Рис. 10.86. Комнатная сцена, визуализированная с использованием методов распре- деленного построения хода лучей (перепечатано с разрешения Джона Снайдера (John Snyder), Джеда Ленгила (Jed Lengyel), Девендры Калры (Devendra Kalra) и Эла Барра (Al Barr), Computer Graphics Lab, Калифорнийский технологический институт. © 1988, Caltech) Суммарная энергия монохроматического счета равна es= £ hf- <10-87) по всем фотонам Энергия излучения на определенной частоте света также называется спектральным излучением. В то же время, любое реальное световое излучение, даже излучение от “монохроматического” источника, ведется в области частот. Следовательно, общая энергия излучения — это сумма по всем фотонам на всех частотах: Е = hf. (10.88) f по всем фотонам Величина энергии излучения, переданной за единицу времени, называется потоком излучения Ф: dE Ф = —. (10.89) dt
10.12. Модели диффузного отражения 855 Рис. 10.87. Сцена, демонстрирующая фокусировку, защиту от наложения и эффек- ты освещенности, возможные при объединении методов построения хода лучей и диффузного отражения. Для получения эффектов отражения использовались ре- алистичные физические модели освещения (перепечатано с разрешения Питера Ширли (Peter Shirley), факультет информатики, Университет штата Юта) Поток излучения также именуется мощностью излучения и измеряется в ваттах (Дж • с). Чтобы получить эффекты освещения поверхностей на сцене, нужно вычислить поток излучения на единичную площадь излучающей поверхности. Эта величина называется диффузным отражением В или энергетической светимостью Лф В-М <I090> и измеряется в Вт/м2. Кроме того, часто используется интенсивность I — мера по- тока излучения в определенном направлении на единицу телесного угла на единицу площади проекции, единица измерения которой — “ватт на метр квадратный на сте- радиан”. Иногда, правда, интенсивность определяется просто как поток излучения в определенном направлении. В зависимости от смысла, вкладываемого в термин “интенсивность”, яркость можно определить как интенсивность на единичную площадь проекции или как поток излучения (или диффузного отражения) на единицу телесного угла.
856 Глава 10. Модели освещения и методы визуализации поверхностей Направление переноса энергии Рис. 10.88. Энергия видимого излучения, поступающая с точки поверхности в направлении (в, ф) в телесном угле dw dA cos0 Рис. 10.89. Для единичного элемента поверхности площадь проекции, перпендикулярной направлению передачи энер- гии, равна cos ф СТАНДАРТНАЯ МОДЕЛЬ ДИФФУЗНОГО ОТРАЖЕНИЯ Чтобы точно описать диффузное отражение от поверхности, в модели диффузного отражения вычисляется взаимодействие всех поверхностей сцены через энергию из- лучения. Поскольку получающуюся в результате систему уравнений решить крайне сложно, в стандартной модели диффузного отражения предполагается, что все по- верхности являются малыми непрозрачными идеальными диффузными отражателями (ламбертовскими поверхностями). Чтобы применить модель диффузного отражения, нужно определить дифферен- циал потока излучения dB, покидающего каждую точку поверхности на сцене, а затем просуммировать энергетические вклады по всем поверхностям и получить энергию, передаваемую между поверхностями. На рис. 10.88, иллюстрирующем передачу энер- гии излучения от поверхности, dB — это поток видимого излучения, исходящий от точки поверхности в направлении, определяемом углами в и ф, в дифференциальный телесный угол dw за единицу времени на единицу площади поверхности. Интенсивность I диффузного излучения в направлении (в, ф) можно описать как энергию излучения за единицу времени на единицу площади проекции на единицу телесного угла, или Предполагая, что поверхность — это идеальный диффузный отражатель (раздел 10.3), интенсивность I можно считать константой для всех направлений наблюдения. Та- ким образом, dB/dw пропорционально площади проекции поверхности (рис. 10.89). Чтобы получить общую скорость излучения энергии от точки поверхности, нужно
10.12. Модели диффузного отражения 857 Рис. 10.90. Общая энергия излучения точки поверх- ности равна сумме энергетических вкладов по всем направлениями полусферы с центром в этой точке поверхности просуммировать излучение по всем направлениям. Следовательно, нужно опреде- лить общую энергию, покидающую полусферу с центром в точке поверхности, как показано на рис. 10.90. Эта энергия равна В= / dB. (10.92) Jполусфера Для идеального диффузного отражателя I — константа, так что поток излучения В можно выразить следующим образом: B = I / cos ф du. (10.93) Jполусфера Кроме того, дифференциальный элемент телесного угла doj можно выразить (см. приложение А) как dS djjj = — = поэтому р2тг гтг/2 В = I / cos ф sin ф dtp df) = Jo Jo = 1тг. (10.94) Модель отражения света от различных поверхностей формируется путем введения “оболочек” поверхностей (рис. 10.91). Каждая поверхность в оболочке является либо отражателем, либо излучателем (источником света), либо комбинацией отражатель- излучатель. Введем параметр диффузного отражения В^ — общую скорость энергии излучения, покидающей поверхность к, на единицу площади. Параметр падающей энергии Hk — это сумма вкладов энергии излучения от всех поверхностей в обо- лочке, поступающих на поверхность к за единицу времени на единицу площади.
858 Глава 10. Модели освещения и методы визуализации поверхностей Рис. 10.91. Замыкание поверхностей, используемое в модели диффузного отражения Следовательно, Hk = ^BjFjk, (10.95) где параметр Fjk называется форм-фактором поверхностей.; и к. Форм-фактор Fjk — это доля энергии излучения поверхности j, достигшей поверхности к. Для сцены с п поверхностями в оболочке энергия излучения от поверхности к описывается уравнением диффузного отражения: Вк = Ек + ркНк = = Ек + Bj Fjk. (10.96) j=l Если поверхность к не является источником света, тогда Ек = 0. В противном случае Ек — это скорость излучения энергии с поверхности к на единицу площади (Вт/м2). Параметр рк — это коэффициент отражения для поверхности к (процент падающего света, отраженного во всех направлениях). Данный коэффициент отражения связан с коэффициентом диффузного отражения, используемым в эмпирической модели осве- щения. Плоские и выпуклые поверхности не могут “видеть” сами себя, так что са- мопадения света не происходит, и форм-фактор Fkk для таких поверхностей равен 0. Чтобы получить эффекты освещения различных поверхностей в оболочке, нужно решить систему уравнений диффузного отражения для п поверхностей и получить массивы значений Ек, ркп Fjk. Следовательно нужно решить такую систему: (1 - PkFkk)Bk - р/с У2 BjFjk = Ек к = 1,2,3, ... ,п (10.97)
10.12. Модели диффузного отражения 859 ИЛИ Рис. 10.92. Передача дифференциальной величины энергии излучения dBj от элемента поверхности с площадью dAj элементу поверхности dAk 1 - Pl-Fll -P1F12 1 - P2F22 • PiFln to to bO t— — 'Ex- E2 pnFn\ ~P2Fn2 1 Рп^пп_ _Bn _En _ (10.98) Затем нужно выразить значения интенсивности Ik, разделив значения диффузного отражения Вк на тг. Для цветных приложений можно вычислить отдельные RGB- компоненты диффузного отражения (BkR, B^g, Вкв), используя цветные компонен- ты рк и Ек. Перед тем как решать уравнение (10.97), нужно определить значения форм- факторов Fjk. Для этого следует рассмотреть передачу энергию от поверхности j к поверхности к (рис. 10.92). Скорость падения энергии излучения на небольшой элемент поверхности dA к от элемента площади dAj равна dBj dAj — (Ij cos</>j dw) dAj. (10.99) В то же время, телесный угол dw можно записать через проекцию элемента площади dAk, перпендикулярную направлению dBj: dA cos <i>kdA к dw = —у =-----------—------- /V» zrv £ (10.100)
860 Глава 10. Модели освещения и методы визуализации поверхностей Следовательно, уравнение (10.99) можно выразить в форме I, cos ф, cos фь dAj dAk dB} dAj = —3-----(10.101) Форм-фактор, связывающий две поверхности, — это процент энергии, излученной площадью dAj, который дошел до dAk'- энергия, падающая на dA k FdAj,dAk = —------------------------— — J общая энергия, покидающая dAj = Ij COS (f>j cos фк dAj dAk 1 (io 102) r2 Bj dAj' Кроме того, Bj = irlj, поэтому „ cos ф-i cos фь dAk FdA^dA, = —-----10.103) J 7ГГ2 и доля излученной энергии с площади dAj, пришедшей на всю поверхность к, равна „ f cos ф,- cos фк , , FdAj,Ak = / -------2----c^fc’ (10.104) J surf j где A k — площадь поверхности к. Затем форм-факторы, связывающие две поверхно- сти, можно определить как среднее по площади приведенных выше выражений, что равно „ 1 Г Г cos ф-t cos фк Fjk = -- / ---2 dAk dAj. (Ю.105) Aj Jsurf, Jsurffc m Два интеграла в уравнении (10.105) вычисляются с использованием методов числен- ного интегрирования при наложении следующих условий: • Fjk = 1 для всех к (сохранение энергии); • AjFjk = AkFkj (равномерное отражение света); • Fjj = 0 для всех j (предполагается, что используются только плоские или выпуклые участки поверхности). Чтобы применить модель диффузного отражения, разделим каждую поверхность на сцене на множество маленьких многоугольников. При уменьшении размера мно- гоугольников улучшается реализм изображения сцены, но при этом также увели- чивается время ее визуализации. Чтобы ускорить вычисление форм-факторов, мож- но аппроксимировать полусферу полукубом. В результате сферическая поверхность
10.12. Модели диффузного отражения 861 заменяется набором линейных (плоских) поверхностей. Вычислив форм-факторы, можно численно решить систему линейных уравнений (10.97), например, используя гауссово исключение или LU-разложение (приложение А). В качестве альтернатив- ного варианта можно взять аппроксимированные значения Bj и решить систему линейных уравнений с помощью метода Гаусса-Зайделя. В таком случае при каж- дой итерации вычисляется оценка диффузного отражения участка поверхности к с подстановкой полученных ранее значений диффузного отражения в уравнение диф- фузного отражения: п Ек — Ек + рк EjFjk- г=1 При такой схеме вычислений сцену можно отображать на каждом этапе, что позволит наблюдать улучшение визуализации поверхностей. Данный процесс продолжается, пока последовательные значения диффузного отражения отличаются на величину, превышающую предварительно заданную точность. МЕТОД ПРОГРЕССИВНОГО УТОЧНЕНИЯ ДИФФУЗНОГО ОТРАЖЕНИЯ Хотя метод диффузного отражения дает крайне реалистичные изображения, для рас- чета форм-факторов необходимо достаточно большое время обработки, кроме то- го, требуется значительная память для хранения данных. Используя прогрессивное уточнение, можно реструктурировать итеративный алгоритм диффузного отражения, ускорив расчеты и сократив память, требуемую на каждой итерации. Из уравнения диффузного отражения следует, что энергия излучения, переданная между двумя участками поверхностями, вычисляется таким образом: Вк согласно Bj = pkBjFjk. (10.106) И, наоборот, Bj согласно Bk=pjBkFkj для всех j, (10.107) что можно переписать следующим образом: Bj согласно В к = pjBkFjk А? Ак для всех j. (10.108) Данное соотношение является основой подхода прогрессивного уточнения при расче- те диффузного отражения. Используя один участок поверхности к, можно вычислить все форм-факторы Fjk и рассмотреть перенос света от участка к остальным поверхно- стям среды. В данной процедуре вычислить и записать требуется только значения па-
862 Глава 10. Модели освещения и методы визуализации поверхностей раметров для одного полукуба и соотнесенных с ним форм-факторов. На следующей итерации данные значения параметров заменяются значениями для другой выбранной точки. Кроме того, прогрессивное улучшение можно отображать в ходе визуализации поверхности при переходе от обработки одного участка к обработке другого. Итак, изначально задается Вк = Ек для всех участков поверхности. Затем вы- бирается участок с наибольшим значением диффузного отражения (самый яркий излучатель света), и рассчитывается следующая аппроксимация диффузного отраже- ния всех остальных участков. Данный процесс повторяется на каждом этапе, так что вначале выбираются источники света с наибольшей энергией излучения, а затем — другие участки согласно объему света, полученному от источников. Этапы простого алгоритма прогрессивного уточнения выстраиваются в следующую схему. для каждого участка к /* Задается полукуб, и вычисляются форм-факторы F [j][к]. */ для каждого участка j { dRad = rho [j] * В [k] * F [j] [k] * A [j] / A [kJ; dB [j] = dB [j] + dRad; В [j] = В [j] + dRad; ) dB [k] = 0; Поскольку диффузное отражение — это мера энергии излучения на единицу поверх- ности, на каждом этапе выбирается участок с наибольшим значением А.Вк Ак- Кроме того, для всех участков поверхности выбираются исходные значения ДВк = В к = Ек- Описанный алгоритм прогрессивного уточнения аппроксимирует реальное распро- странение света по сцене как функцию времени. Отображение визуализированной поверхности на каждом этапе дает последова- тельность изображений, на которых темная сцена плавно переходит в полностью освещенную. После первого этапа освещенными поверхностями являются только ис- точники света и те неизлучающие участки, которые видны с выбранного излучателя. Чтобы получить более полезные первоначальные изображения сцены, можно задать уровень рассеянного света, чтобы все участки немного освещались. Затем на каж- дом этапе итерации уровень рассеянного света снижается согласно объему энергии излучения, переданной на сцену. На рис. 10.93 показана сцена, визуализированная с использованием модели диф- фузного освещения с прогрессивным уточнением. Различные условия освещенности и визуализации диффузного освещения иллюстрируются на рис. 10.94-10.96. Методы построения хода лучей часто комбинируются с моделями диффузного отражения для получения высокореалистичных диффузных и зеркальных эффектов, как показано на рис. 10.87.
864 Глава 10. Модели освещения и методы визуализации поверхностей Рис. 10.95. Имитация башенной лестницы в здании Центра теории инженерии в Университете Корнел- ла, визуализированной с помощью метода диффуз- ного отражения с прогрессивным уточнением (пе- репечатано с разрешения Кейт Хоуи (Keith Howie) и Бена Трамбо (Ben Trumbore), Program of Computer Graphics, Университет Корнелла. © 1990, Cornell University Program of Computer Graphics) процедура называется отображением среды, а иногда — построением отражений (хотя отражение среды позволяет также смоделировать эффекты прозрачности). Дру- гое название отражения среды — “метод построения хода лучей для бедных” (“the poor person’s ray-tracing method”), поскольку он является дешевой и быстрой аппроксима- цией более точной техники визуализации глобального освещения, рассмотренной в разделах 10.11 и 10.12. В данном методе на поверхности огражденной вселенной определяется отра- жение (карта) среды. На карте среды указывается такая информация, как значения интенсивностей для источников света, неба и других фоновых объектов. На рис. 10.97 огражденная вселенная показана в виде сферы, но часто для определения поверхно- стей среды, окружающих объекты на сцене, используются куб или цилиндр. Чтобы визуализировать поверхность объекта, области пикселей проектируются на поверхность объекта, а затем все спроектированные области пикселей отража- ются на карту среды, чтобы указать для этого пикселя значения интенсивности на поверхности. Если объект прозрачен, на карту среды также можно преломить спроек- тированную область пикселя. Процесс отражения среды для показа спроектированной области пикселя иллюстрируется на рис. 10.98. Интенсивность пикселя определяется усреднением значений интенсивности в пересекаемой части карты среды.
10.13. Отображение среды 865 Рис. 10.96. Имитация двух схем освещения для парижской мансарды из постановки Богемы в Метро- политен Опера. Полностью освещенный дневной вид мансарды представлен на панели а, а ночной вид показан на панели б (перепечатано с разрешения Джулии Дорси и Марка Шепарда (Mark Shepard), Program of Computer Graphics, Университет Корнелла. © 1991, Cornell University Program of Computer Graphics) Рис. 10.97. Сферически замкнутая вселенная с картой среды на поверхности сферы точка проекции Рис. 10.98. Проектирование области пик- селя на поверхность с последующим нало- жением области на карту среды
866 Глава 10. Модели освещения и методы визуализации поверхностей 10.14. ОТОБРАЖЕНИЕ ФОТОНОВ Хотя метод диффузного отражения позволяет точно отображать глобальные эффек- ты освещения для простых сцен, его трудно применять при увеличении сложности сцены. Для очень загроможденных сцен время визуализации и требования к памяти становятся неприемлемыми, кроме того, многие эффекты освещения трудно смо- делировать корректно. Общим методом моделирования глобального освещения на сложных сценах является эффективное и точное отображение фотонов. Основная идея в отображении фотонов заключается в отделении информации об освещении от геометрии сцены. По сцене прослеживаются пути лучей от всех источников света, и информация об освещении, полученная из анализа пересече- ния лучами объектов, записывается в карту фотонов. Затем применяются методы распределенного построения хода лучей и последовательные алгоритмы, подобные реализованным в схеме визуализации диффузного отражения. Источниками света могут быть точки, направленные прожекторы или любые дру- гие конфигурации. Интенсивность, присвоенная источнику света, делится между его лучами (фотонами), а направления лучей распределяются случайно. Если точечный источник не является направленным (раздел 10.1), он моделируется путем генерации лучей равномерно по всем направлениям. Для других источников света на источнике выбираются случайные точки, из которых в случайных направлениях генерируются лучи. Для более яркого света генерируется больше лучей, чем для маломощных ис- точников света. Кроме того, для источников света могут строиться карты проекций, в которых хранится бинарная информация о том, находятся ли в какой-либо области пространства объекты. Чтобы предоставлять информацию об объектах в больших пространственных областях, в алгоритме также могут использоваться граничные сфе- ры. На сцене может генерироваться любое число лучей, и с увеличением их числа повышается точность эффектов освещения. 10.15. СЛОЖЕНИЕ ДЕТАЛЕЙ ПОВЕРХНОСТИ До этого момента рассматривались методы визуализации, позволяющие отображать гладкие поверхности объектов. Стоит, впрочем, отметить, что большинство объектов не имеют гладких, ровных поверхностей. Чтобы точно смоделировать такие объекты, как кирпичная стена, гравийная дорога, ворс ковра, дерево и человеческая кожа, нуж- но использовать текстуру поверхности. Кроме того, некоторые поверхности содержат узоры, которые нужно учесть в процедурах визуализации. Поверхность вазы может содержать роспись; стакан для воды — иметь гравировку; теннисный корт содержит разметку — маркировку аллей, зон и базовых линии, а шоссе с четырехполосным движением имеет разделительные полосы и такие “узоры”, как нефтяные разливы и следы от покрышек.
10.15. Сложение деталей поверхности 867 в) Рис. 10.99. Этапы моделирования н визуализации при разработке анимированного доктора Аки Росс из фильма Final Fantasy: The Spirits Within: каркасная модель Аки (панель а); структура поверхности кожи и одежды (панель б); конечная визуализированная фигура, включая волосы и детали кожи и одежды (панель е) (перепечатано с разрешения Square Pictures, Inc. © 2001, FFFP) Базовые этапы моделирования и визуализации объекта с деталями поверхности иллюстрируются на рис. 10.99. Вначале для создания общей схемы можно использо- вать каркасный рисунок объекта. Далее уровни поверхности заполняются в пределах контуров объекта, и получается визуализированное гладкое изображение структуры. Затем к внешним уровням добавляются детали поверхности. В контексте примера на рис. 10.99 детали поверхности включают такие элементы одежды, как швы, тиснение и текстура ткани, а также такие особенности кожи, как поры, родинки, веснушки. Увеличенное компьютерное изображение особенностей кожи данного персонажа по- казано на рис. 10.100, а на рис. 10.101 сымитированы особенности кожи более старого героя. Дополнительные примеры сцен, визуализированных с деталями поверхности, представлены на рис. 10.102. Чтобы добавить к поверхностям детали, можно использовать различные методы, в том числе следующие:
868 Глава 10. Модели освещения и методы визуализации поверхностей а) б) Рис. 10.100. Детали кожи анимированного доктора Аки Росс из фильма Final Fantasy: The Spirits Within (перепечатано с разрешения Square Pictures, Inc. © 2001, FFFP) Рис. 10.101. Детали лица и текстура поверхности кожи анимированного доктора Сида, представляющего 70-летнего мужчину в фильме Final Fantasy: The Spirits Within (перепечатано с разрешения Square Pictures, Inc. © 2001, FFFP)
10.15. Сложение деталей поверхности 869 Рис. 10.102. Сцены, иллюстрирующие компьютерную генерацию деталей поверхности различных объ- ектов: а) кактусы с добавленными колючками и цветами (перепечатано с разрешения Деборы Р. Фоулер (Deborah R. Fowler), Пржемислава Прузинкевича (Przemyslaw Prusinkiewicz) и Джоанны Баттжес (Jo- hannes Battjes), Университет Калгари. © 1992): б) ракушки с различными узорами и гофрированными поверхностями (перепечатано с разрешения Деборы Р. Фоулер, Ганса Мэйнхарда (Hans Meinhardt) и Пржемислава Прузинкевича, Университет Калгари. © 1992): в) стол с фруктами (перепечатано с разрешения SOFTIMAGE, Inc.'y, г) поверхностные узоры на шахматных фигурах и шахматной доске, полученные методами отображения текстуры (перепечатано с разрешения SOFTIMAGE, Inc.) • поместить маленькие объекты, такие как почки, цветы или колючки, на большие поверхности; • смоделировать узоры поверхности небольшими многоугольными областями; • отобразить на поверхность массивы текстур или использовать процедуры моди- фикации интенсивности; • модифицировать вектор нормали к поверхности, чтобы создать локализованные бугорки; • модифицировать вектор нормали к поверхности и касательный вектор к поверх- ности, чтобы отобразить направленные узоры на дереве и других материалах.
870 Глава 10. Модели освещения и методы визуализации поверхностей 10.16. МОДЕЛИРОВАНИЕ ДЕТАЛЕЙ ПОВЕРХНОСТИ МНОГОУГОЛЬНИКАМИ Простой метод добавления деталей к поверхности заключается в моделировании узо- ров или других характеристик поверхности с использованием многоугольных граней. Для крупномасштабных деталей моделирование многоугольниками может дать хо- рошие результаты. Некоторыми примерами подобных крупномасштабных деталей являются клетки шахматной доски, разделительные полосы шоссе, плитка линоле- ума, цветочные узоры и буквенные обозначения на боку грузового фургона. Кроме того, можно смоделировать нерегулярную поверхность с помощью небольших, слу- чайным образом ориентированных многоугольных граней при условии, что грани не слишком малы. Многоугольники с узорами поверхности обычно накладываются на большие мно- гоугольники поверхности и обрабатываются вместе с родительской поверхностью. Алгоритмы детектирования видимых поверхностей обрабатывают только родитель- ский многоугольник, но параметры освещения вначале применяются к многоуголь- никам с деталями поверхности, а затем — к родительским. Применять при модели- ровании сложных или мелких деталей поверхности методы многоугольников непрак- тично. Например, с помощью многоугольных граней сложно точно смоделировать структуру поверхности изюма. 10.17. НАЛОЖЕНИЕ ТЕКСТУРЫ Общий метод добавления деталей к объекту — отобразить узоры в геометрическое описание объекта. Текстурные узоры могут определяться либо в массиве цветных значений, либо как процедура, модифицирующая цвета объектов. Данный метод реа- лизации деталей объекта на сцене называется текстурным отображением или нало- жением узора, а текстуры можно определить как одно-, двух- или трехмерные узоры. Любая спецификация текстуры называется пространством текстуры, для работы с которым вводятся текстурные координаты, меняющиеся в диапазоне от 0 до 1,0. Функции текстуры в графическом пакете часто позволяют задавать в виде опции несколько компонентов цвета для каждой точки узора. Например, каждая специфи- кация цвета в текстурном узоре может состоять из четырех RGBA-компонентов, трех RGB-компонентов, одного значения интенсивности для оттенка синего, индекса в таблице цветов или одного значения яркости (взвешенное среднее RGB-компонентов цвета). Компонент текстурного описания часто называется текселем (texel, texture ele- ment — элемент текстуры), но при использовании этого термина возникает определен- ная путаница. Иногда текселем называется точка в пространстве текстуры, соответ- ствующая набору компонентов цвета (например, триплету RGB), а иногда — отдель- ный элемент массива текстур (например, значение красного компонента RGB-цвета).
10.17. Наложение текстуры 871 ЛИНЕЙНЫЕ ТЕКСТУРНЫЕ УЗОРЫ Одномерный текстурный шаблон можно задать в массиве (один индекс) кодов цвета, которые определяют последовательность цветов в линейном пространстве текстур. Например, можно задать список из 32 цветов RGB, обращаться к которому можно с помощью значений индекса, меняющихся от 0 до 95. Первые три элемента мас- сива содержат RGB-компоненты первого цвета, следующие три — RGB-компоненты второго цвета, и т.д. Данный набор цветов или любой непрерывный поднабор цветов можно затем использовать для формирования рельефной полосы (каймы) вдоль пери- метра многоугольника, полосы вокруг цилиндра или цветного узора для отображения изолированного отрезка. Для работы с линейным узором в пространстве текстур используется одно ко- ординатное значение s. Для спецификации RGB-цветов значение s = 0,0 обозна- чает первый трехэлементный RGB-цвет в массиве, значение s — 1,0 — последние три компонента RGB-цвета, а значение s = 0,5 относится к средним трем RGB- компонентам массива. Например, если имя массива текстуры — colorArray, то s = 0,0 соответствует трем значениям массива colorArray [0], colorArray [1] и colorArray [2]. Чтобы отобразить линейный текстурный узор на сцену, одной точке простран- ства присваивается координатное значение s, а со вторым положением в пространстве сопоставляется другое значение s. Затем раздел массива цветов, соответствующий за- данному диапазону в координатах s, используется для генерации разноцветной линии между двумя точками пространства. Для расчета позиций массива, которые будут со- поставлены с пикселями вдоль отрезка, в процедуре наложения текстуры обычно используется линейная функция. Если число цветов текстуры, заданных для линии, мало, каждому цвету может присваиваться большой блок пикселей в зависимости от длины линии. Например, если заданный диапазон в координатах s захватывает один RGB-цвет (три элемента RGB) в массиве текстур, все пиксели линии отображаются этим цветом. Однако, если в точки линии нужно отобразить много цветов, каждому цвету присваивается меньше пикселей. Кроме того, поскольку некоторые пиксели мо- гут отображаться в позиции массива, соответствующие местам между цветами RGB, для определения цвета, который будет присвоен пикселю, могут использоваться раз- личные схемы. Существует простой метод отображения цветов — присваивать всем пикселям значения ближайших цветов массива. Есть и альтернативный вариант — ес- ли пиксель отображается в положение между двумя элементами массива, цвет пикселя вычисляется как линейная комбинация ближайших двух цветных элементов массива. Некоторые процедуры отображения текстур позволяют использовать значения текстурных координат, не входящие в диапазон 0-1,0. Данные ситуации могут воз- никнуть, когда требуется отобразить несколько копий текстуры на объекты, или ко- гда вычисленные значения s находятся вне единичного интервала. Если значениям текстурных координат разрешается выходить из диапазона 0-1,0, можно просто про-
872 Глава 10. Модели освещения и методы визуализации поверхностей Рис. 10.103. Двухмерные координаты тек- стурного пространства, указывающие по- зиции в массиве кодов цвета, состоящем из т строк и п столбцов. Каждая позиция массива может указывать на несколько ком- понентов цвета игнорировать целую часть любого значения s. В этом случае значение -3,6, например, будет указывать на ту же позицию в пространстве текстур, что и значение 0,6 или 12,6. Однако, если значения вне диапазона 0-1,0 недопустимы, можно просто принудитель- но ввести их в единичный интервал. Любое рассчитанное значение, которое меньше 0, переводится в 0, а любое значение, превышающее 1,0, устанавливается в 1,0. ПОВЕРХНОСТНЫЕ ТЕКСТУРНЫЕ УЗОРЫ Текстура поверхности обычно определяется с помощью прямоугольного цветного узора, а для задания точек в пространстве текстур используются двухмерные коорди- наты (s, t). Спецификации каждого цвета в текстурном узоре можно записать в масси- ве с тремя индексами. Если текстурный узор определяется с помощью шаблона 16 на 16 RGB-цветов, например, массив этого узора содержит 16 х 16 х 3 = 768 элементов. На рис. 10.103 иллюстрируется двухмерное пространство текстур. Значения s и t меняются от 0 до 1,0. В первой строке массива перечислены коды цветов, расположен- ные внизу прямоугольного текстурного узора, а в последней строке массива перечис- лены коды цветов, расположенные вверху. Координаты (0, 0) в пространстве текстур обозначают первый набор компонентов цвета в первой позиции первой строки, а точка (1,0; 1,0) обозначает последний набор компонентов цвета в последней позиции последней строки массива. Разумеется, цвета в массиве текстур можно перечислить и иначе. Если указывать цвета в порядке от вершины вниз, начало двухмерного про- странства текстур будет в левом верхнем углу прямоугольного узора. Отметим, что размещение начала пространства текстур в нижнем левом углу обычно упрощает про- цедуры отображения в пространственную систему координат, связанную со сценой. Наложение поверхностной текстуры на объект производится с использованием тех же процедур, что заданы для отображений линейной текстуры на сцену. Коорди- наты (s, £) пространства текстур для четырех углов текстурного шаблона (рис. 10.103) могут присваиваться четырем точкам пространства на сцене, и для присвоения кодов цвета спроектированным положениям пикселей в заданной области пространства ис-
10.17. Наложение текстуры 873 Преобразование наблюдения и проектирования Преобразование поверхностной текстуры Рис. 10.104. Системы координат для двухмерного пространства текстур, пространства объектов и пространства изображений пользуется линейное преобразование. Возможны и другие отображения. Например, три координаты пространства текстур можно присвоить вершинам треугольника. Точки на поверхности таких объектов, как участки кубических сплайнов или сегменты сферы, можно описать координатами пространства объекта uv, а спроекти- рованные положения пикселей указываются в декартовых координатах ху. Наклады- вать поверхностные текстуры можно двумя способами: отображая либо текстурный узор на плоскость проекции; либо каждую область пикселя на поверхность объекта с последующим отображением этой области в пространство текстур. Отображение текстурного узора в координаты пикселей иногда называется текстурным сканиро- ванием, а отображение из координат пикселей в пространство текстур называется сканированием порядка пикселей или обратным сканированием. На рис. 10.104 схе- матически изображены две возможные последовательности преобразований между тремя пространствами. Простой метод отображения точек пространства текстур в пространство объектов предлагают параметрические линейные преобразования: и = u(s, £) = aus + but -У cu: ' ; ’ (10.109) v = v(s, t) = avs + bvt + cv. Преобразование из пространства объектов в пространство изображений выполняет- ся объединением преобразования точки наблюдения и проективных преобразований. Недостатком отображения из пространства текстур в пространство пикселей являет- ся то, что выбранный текстурный участок обычно не согласовывается с границами пикселя, поэтому требуются дополнительные вычисления для определения исполь- зованной доли пикселя. Наиболее распространенным методом отображения текстуры является отображение из пространства пикселей в пространство текстур (рис. 10.105). Он не требует деления пикселя (и связанных с этим расчетов) и позволяет легко применять процедуры защиты от наложения (фильтрацию). Эффективная процедура защиты от наложения должна спроектировать немного большую область пикселя, включающую центры соседних пикселей, как показано на рис. 10.106, и применить пирамидальную функцию для взвешивания значений интенсивности в текстурном узоре. В то же время, отображение из пространства изображений в пространство
874 Глава 10. Модели освещения и методы визуализации поверхностей Спроектированная площадь пикселя Прямоугольный массив узора Рис. 10.106. Расширенная область пикселя, включаю- щая центры соседних пикселей Рис. 10.105. Отображение текстуры путем проектирования областей пикселей в пространство текстур текстур требует вычислений обратного преобразования точки наблюдения с проек- тированием и обратного преобразования текстурного отображения М^1. В приведенном ниже примере данный подход иллюстрируется на отображении опреде- ленного шаблона на цилиндрическую поверхность. ПРИМЕР 10.1. Отображение поверхностной текстуры Чтобы проиллюстрировать этапы отображения поверхностной текстуры, рассмот- рим перенос узора, показанного на рис. 10.107, а, на цилиндрическую поверх- ность. Параметрами поверхности являются цилиндрические координаты и — в, V — Z
10.17. Наложение текстуры 875 Рис. 10.107. Отображе- ние текстурного узора, определенное в единич- ном квадрате (панель а) на цилиндрическую поверх- ность (панель б) И 0 < 0 < тг/2, 0 < z < 1. Параметрическое представление поверхности в декартовой системе координат выглядит следующим образом: х = г cos и, у = г sin и, Z = V. Структуру, заданную в форме матрицы, можно отобразить на поверхность с помощью следующего линейного преобразования, переводящего точку в про- странстве текстур (s,t) = (0,0) в левый нижний угол элемента поверхности (ж, У,-г) = (г, 0,0). и = S7t/2, V = t. Далее выбирается точка наблюдения и выполняется обратное преобразование точ- ки наблюдения из координат пикселей в декартовы координаты цилиндрической поверхности. Затем декартовы координаты поверхности переводятся в параметры поверхности uv с помощью следующей формулы: и = tg-1(y/x), v = z, и спроектированные положения пикселей отображаются в пространство текстур с помощью такого преобразования: s = 2и/тг, t = v. После этого коды цветов узора, полученные в каждой спроектированной области пикселя, усредняются, и получается конечный цвет пикселя.
876 Глава 10. Модели освещения и методы визуализации поверхностей Рис. 10.108. Сцена, характеристики объектов на которой смоделированы с ис- пользованием методов объемного текстурирования (перепечатано с разрешения Питера Ширли (Peter Shirley), факультет информатики, Университет штата Юта) ОБЪЕМНЫЕ ТЕКСТУРНЫЕ УЗОРЫ В дополнение к линейным и поверхностным узорам можно задать набор цветов для точек в трехмерной области пространства. Данные текстуры часто называются объемными текстурными узорами или текстурами объемного объекта. Чтобы задать объемную текстуру, используются трехмерные координаты (s, t, г) в пространстве текстур. Само трехмерное пространство текстур определяется в пределах единичного куба, причем координаты текстуры меняются от 0 до 1,0. Объемный текстурный узор можно записать в массиве с четырьмя индексами, где первые три индекса обозначают строку, столбец и глубину. Четвертый индекс используется для выбора в узоре компонента определенного цвета. Например, в объ- емной текстуре в цветах RGB с 16 строками, 16 столбцами и 16 плоскостями глубины можно записать массив с 16 х 16 х 16 х 3 = 12,288 элементами. Чтобы отобразить все пространство текстур в трехмерный блок, координаты вось- ми углов пространства текстур присваиваются восьми пространственным точкам сце- ны. Другой вариант — отобразить такой сегмент плоскости в текстурном простран- стве, как плоскость глубины или одна грань куба текстур, в плоскую область на сцене. Кроме того, возможны иные применения отображения объемных текстур.
10.17. Наложение текстуры 877 Объемное текстурирование позволяет реализовывать вид изнутри, например, ча- стичные разрезы и сечения трехмерных объектов, отображаемых с текстурными узо- рами. Таким образом, кирпичи, шлакоблоки или древесные материалы могут иметь одинаковые текстурные узоры, изображенные во всем объеме объекта. На рис. 10.108 показана сцена, на которой с использованием методов объемных текстур отображены текстура древесины и другие узоры материалов. УЗОРЫ С СОКРАЩЕННОЙ ТЕКСТУРОЙ В анимации и других приложениях размер объекта часто меняется. Если такие объ- екты отображены с текстурными узорами, то при изменениях нужно применить про- цедуры отображения текстуры к модифицированным размерам объекта. Если размер текстурированного объекта уменьшается, текстурный узор применяется к меньшей области, что может привести к искажению текстуры. Чтобы избежать этого, созда- ется ряд узоров с сокращенной текстурой (texture reduction patterns), которые также можно использовать при уменьшении масштаба отображенного размера предмета. Обычно каждый сокращенный узор вдвое меньше предыдущего. Например, если дан двухмерный шаблон 16 на 16, нужно задать четыре дополнительных узора с сокращенными размерами 8 на 8, 4 на 4, 2 на 2 и 1 на 1. Для любой проекции объекта затем можно применить подходящий сокращенный узор и минимизировать искажение. Данные сокращенные узоры часто называются MIP maps или mip maps1, где термин “MIP” является аббревиатурой латинского выражения multum in parvo, что можно перевести как “больше в малом [объекте]”. МЕТОДЫ ПРОЦЕДУРНОГО ТЕКСТУРИРОВАНИЯ Другой метод добавления текстурного узора к объекту — использовать процедур- ное определение применяемого изменения цвета. Данный подход позволяет избежать расчета преобразований, фигурирующих при отображении узоров, представленных в массиве, в описания объектов. Кроме того, процедурное текстурирование снимает вы- сокие требования к памяти, возникающие, если на сцену нужно наложить множество больших текстурных узоров, особенно объемных текстур. Процедурная текстура формируется путем расчета изменений свойств или ха- рактеристик объекта. Волокна древесины или узор мрамора, например, можно изоб- разить на объекте, используя гармонические функции (синусоиды), определенные в области трехмерного пространства. Затем на гармонические вариации накладываются случайные возмущения, чтобы разрушить симметричные узоры. Сцена на рис. 10.109 визуализирована с использованием процедурных описаний узоров, типичных для по- верхностей каменной кладки, полированного золота и банановых листьев. 1В литературе также встречается термин mipmap. - Прим, перев.
878 Глава 10. Модели освещения и методы визуализации поверхностей Рис. 10.109. Сцена, визуализированная с исполь- зованием VG Shaders и смоделированная с помо- щью RenderMan и применением многоугольников (для создания граней камней), поверхностей вто- рого порядка и бикубических участков. Помимо текстурных массивов использовались процедур- ные методы, что позволило создать душную ат- мосферу джунглей и полог леса, демонстрирую- щие эффект пятнистого освещения (перепечатано с разрешения VALIS Group из Graphics Gems III, отредактировано Дэвидом Кирком (David Kirk). © 1992, Academic Press, Inc.) 10.18. ОТОБРАЖЕНИЕ ШЕРОХОВАТОСТИ Для того чтобы добавить мелкие детали поверхности, можно использовать массивы текстур, однако они обычно неэффективны для моделирования шероховатых поверх- ностей таких объектов, как апельсины, клубника и изюм. Детали интенсивности света, хранящиеся в массиве текстур для этих объектов, задаются независимо от параметров освещения, таких как направление на источник света. Лучший метод мо- делирования шероховатости поверхности — это применить функцию возмущений к нормали поверхности, а затем использовать возмущенный вектор нормали в расче- тах модели освещения. Данный метод называется отображением шероховатости поверхности (bump mapping). Если обозначить через Р(п, и) точку на параметрической поверхности, можно получить нормаль к поверхности в этой точке: N = PuxPv, (10.110) где Ри и Р„ — частные производные Р по параметрам и и v. Чтобы обеспечить колебания нормали поверхности, можно модифицировать вектор точки поверхности, добавив к нему небольшую функцию возмущений, называемую буферной функцией'. Pz(u, v) = P(u, v) -|- b(u, v) n. (10.111)
10.18. Отображение шероховатости 879 При этом шероховатость поверхности в направлении единичной нормали к поверх- ности п равна N/|N|. Затем вычисляется возмущенная нормаль к поверхности: N^P^xP;. (10.112) Частная производная Р' по и равна р; = А(р+(>„) = = Ри + Ьип + Ьпи. (10.113) Предполагая, что амплитуда функции колебаний b мала, можно пренебречь послед- ним членом в приведенном выше выражении, так что получаем P^«Pu + bun. (10.114) Аналогично Pt«Pp + Mi. (10.115) Возмущенная нормаль к поверхности равна N' = Ри х Рк + Ьк(Ри X п) + Ьи(п х Рк) + ЬЛ(п х п). Но П X п = 0, поэтому N'= N + Ьк(Ри х п) + Ьи(п х Рк). (10.116) Последний этап — нормировать N' для использования в расчетах модели освещения. Существует несколько способов задания функции шероховатости b(u,v). Мож- но, конечно, провести аналитическое выражение, но вычисления сокращаются, если просто получить параметры бугорков, используя таблицу соответствий. С помощью таблицы шероховатости значения b быстро определяются путем линейной интерпо- ляции и последовательных расчетов. Затем частные производные Ьи и bv аппроксими- руются с использованием конечных разностей. Отметим, что таблицу шероховатости можно задать со случайными узорами, или формами знаков. Случайные узоры по- лезны при моделировании нерегулярных поверхностей, таких как изюм, тогда как повторяющиеся узоры можно использовать, например, для моделирования поверх- ности апельсина. Чтобы избежать наложения, области пикселей делятся на части, а затем интенсивности полученных подпикселей усредняются.
880 Глава 10. Модели освещения и методы визуализации поверхностей а) Рис. 10.110. Визуализация характеристик шероховатой поверхности с использованием отображения шероховатости (перепечатано с разрешения: а) Питера Ширли (Peter Shirley), факультет информатики, Университет штата Юта', б) SOFTIMAGE, Inc.) 6) На рис. 10.110 приведены примеры поверхностей, визуализированных с помо- щью отображения шероховатости. Пример комбинированных методов визуализации поверхности приведен на рис. 10.111. Броня витражного рыцаря йз фильма Моло- дой Шерлок Холмс (“Young Sherlock Holmes”) была визуализирована с объединением отображения шероховатости, среды и наложения текстуры. Карта окружающей сре- ды объединялась с картой шероховатости, чтобы создать эффект отражения фонового освещения и шероховатости поверхности. Затем для создания общего эффекта, пока- занного на изображении, вводились дополнительные цвета и освещение поверхности, неровности, пятна грязи и пятна на швах и заклепках.
10.19. Отображение кадра 881 Рис. 10.11]. Витражный рыцарь из фильма Молодой Шерлок Холмс. Комбинация отображений шероховатости, среды и текстуры использовалась для визуализации поверхности брони (перепечатано с разрешения Industrial Light & Magic. © 1985, Paramount Pictures/Ambliri) Рис. 10.112. Локальная система координат в точке поверхности 10.19. ОТОБРАЖЕНИЕ КАДРА Данный метод добавления деталей к поверхности является расширением отобра- жения шероховатости. При отображении кадра возмущается и вектор нормали к поверхности N, и локальная система координат (рис. 10.112), привязанная к N. Ло- кальные координаты определяются касательным вектором поверхности Т и вектором бинормали В = Т х N. Отображение кадра используется для моделирования анизотропных поверхно- стей. Сориентируем Т по “волокну” поверхности и применим направленные возму- щения в дополнение к возмущениям шероховатости в направлении вектора N. Таким образом можно смоделировать узор волокна дерева, спиральные узоры в одежде и прожилки в мраморе или подобных материалах. Шероховатость и направленные воз- мущения можно сгенерировать с использованием таблицы соответствий.
882 Глава 10. Модели освещения и методы визуализации поверхностей 10.20. ФУНКЦИИ ОСВЕЩЕНИЯ И ВИЗУАЛИЗАЦИИ OpenGL В OpenGL реализовано множество процедур установки точечных источников света, подбора коэффициентов отражения поверхности и выбора значений других парамет- ров в стандартной модели освещения. Кроме того, можно смоделировать прозрач- ность, а объекты можно отображать с использованием либо плоской визуализации, либо визуализации по Гуро. ФУНКЦИИ OpenGL ДЛЯ ЗАДАНИЯ ТОЧЕЧНЫХ ИСТОЧНИКОВ СВЕТА В описание сцены в OpenGL можно включить несколько источников света, причем с каждым источником можно соотнести такие различные свойства, как положение, тип, цвет, затухание и эффекты направленного освещения. Для задания свойств источника света используется такая функция: glLight* (lightName, lightProperty, propertyvalue); К имени функции добавляется код суффикса i или f, в зависимости от типа дан- ных соответствующего значения. Для векторных данных также добавляется код суф- фикса v, а параметр propertyvalue является указателем на массив. Каждый ис- точник света снабжается идентификатором, и параметру lightName присваивается значение одной из символьных констант OpenGL GL_LIGHT0, GL_LIGHT1, ..., GL_LIGHT7, хотя в некоторых реализациях OpenGL разрешено больше восьми ис- точников света. Таким образом, параметру lightProperty должно присваиваться значение одной из десяти символьных констант свойства OpenGL. После того как для источника света будут заданы все свойства, свет включается командой glEnable (lightName); Однако еще нужно активизировать процедуры освещения OpenGL, и для этого вы- зывается команда glEnable (GL_LIGHTING); Затем поверхности объектов визуализируются с использованием расчета освещения, в котором учитываются вклады от всех включенных источников света. ПОЛОЖЕНИЕ И ТИП ИСТОЧНИКА СВЕТА OpenGL В OpenGL для идентификации положения источника света используется символь- ная константа свойства GL_POSITION. В действительности указанная символьная константа используется для одновременного задания двух свойств источника све- та: положения и типа. При освещении сцены в OpenGL могут использоваться два класса источников. Точечный излучатель может располагаться вблизи освещаемых объектов (локальный источник), или его можно считать бесконечно удаленным от
10.20. Функции освещения и визуализации OpenGL 883 сцены. Данная классификация не зависит от положения, выбранного для источника света. Для близлежащего источника свет излучается во всех направлениях, и положе- ние источника света фигурирует в расчетах освещения. В то же время, излученный свет от удаленного источника может поступать только в одном направлении, и это направление одинаково для всех поверхностей сцены, независимо от выбранного по- ложения источника света. Направление исходящих лучей источника, отнесенного к удаленным, вычисляется как направление от выбранного положения источника света к началу координат. Чтобы задать тип света и координаты источника, используется четырехэлемент- ный вектор, компоненты которого — числа с плавающей запятой. Первые три эле- мента этого вектора дают точку в глобальных координатах, а четвертый элемент используется для обозначения типа источника света. Если четвертому элементу век- тора положения присвоить значение 0.0, свет будет принадлежать очень удаленному источнику (в OpenGL это называется направленным (directional) светом), а заданное положение источника света используется только для определения направления света. В противном случае свет идет от локального источника (в OpenGL это называется локальным (positional) светом), и положение источника используется в процедурах освещения для определения направления света к каждому объекту на сцене. В сле- дующем примере кода свет 1 идет от локального источника, расположенного в точке (2,0; 0,0; 3,0), а свет 2 — от удаленного источника, излучающего в отрицательном направлении оси у. GLfloat lightlPosType [ ] = {2.0, 0.0, 3.0, 1.0}; GLfloat light2PosType [ ] = {0.0, 1.0, 0.0, 0.0}; glLightfv (GL_LIGHT1, GL_POSITION, lightlPosType); glEnable (GL_LIGHT1); glLightfv (GL_LIGHT2, GL_POSITION, light2PosType); glEnable (GL_LIGHT2); Если тип и положение источника света не задаются, значения по умолчанию равны (0.0,0.0,1.0,0.0), что указывает на удаленный источник, лучи света от которого распространяются по отрицательному направлению оси z. Положение источника света включается в описание сцены и вместе с положе- ниями объектов преобразовывается в координаты наблюдения с помощью матриц геометрического преобразования и преобразования точки наблюдения. Следователь- но, если требуется зафиксировать источник света относительно объектов на сцене, его положение задается после указания в программе геометрических преобразований и преобразований точки наблюдения. Однако, если требуется, чтобы источник света двигался при изменении точки наблюдения, его положение задается перед специ- фикацией преобразования точки наблюдения. Кроме того, если необходимо, чтобы источник света двигался вокруг стационарной сцены, к его положению можно при- менить преобразование трансляции или вращения.
884 Глава 10. Модели освещения и методы визуализации поверхностей ЦВЕТА ИСТОЧНИКОВ СВЕТА OpenGL В отличие от реальных источников, свет в OpenGL имеет три различных свойства цветов RGBA. В данной эмпирической схеме эффекты освещения сцены позволя- ют изменять три цвета источника света. Данные цвета задаются с использованием символьных констант свойств цвета GL_AMBIENT, GL_DIFFUSE и GL_SPECULAR. Чтобы задать все эти цвета, указывается четырехэлементный массив значений с пла- вающей точкой. Компоненты каждого цвета задаются в порядке (R, G, В, А), и альфа- компонент используется только при активных процедурах смешивания цветов. Как можно догадаться из названий символьных констант свойств цвета, один цвет источ- ника света дает вклад в фоновое (ambient) освещение сцены, другой цвет используется при расчете диффузного освещения (diffuse), а третий задает эффекты зеркального от- ражения на поверхности. Реальные источники света характеризуются одним цветом, но три цвета источников OpenGL позволяют создавать различные эффекты освеще- ния. Ниже приведен пример кода, в котором цвет фонового освещения локального источника света GL_LIGHT3 — черный, а цвет диффузного освещения и зеркального отражения — белый. GLfloat blackColor [ ] GLfloat whiteColor [ ] {0.0, 0.0, 0.0, 1.0}; {1.0, 1.0, 1.0, 1.0}; glLightfv (GL_LIGHT3, glLightfv (GL_LIGHT3, glLightfv (GL_LIGHT3, GL_AMBIENT, blackColor); GL_DIFFUSE, whiteColor); GL_SPECULAR, whiteColor) Значения по умолчанию для источника света 0 — черное фоновое освещение, белое диффузное и зеркальное отражение. Все остальные источники света характе- ризуются по умолчанию тремя черными цветами. КОЭФФИЦИЕНТЫ РАДИАЛЬНОГО ЗАТУХАНИЯ ИНТЕНСИВНОСТИ ИСТОЧНИКОВ СВЕТА OpenGL Радиальное затухание интенсивности можно применить к свету, излучаемому ло- кальным источником OpenGL, и процедурам расчета освещения OpenGL, в которых данное затухание вычисляется согласно уравнению (10.2), в котором di — расстоя- ние от положения источника света до объекта. Тремя константами свойств OpenGL для радиального затухания интенсивности являются GL_CONSTANT_ATTENUATION, GL_LINEAR_ATTENUATION и GL_QUADRATIC_ATTENUATION, которые соответ- ствуют коэффициентам ао, ai и в уравнении (10.2). Для задания всех коэффициен- тов затухания могут использоваться положительные целые числа или положительные величины с плавающей запятой. Например, значения коэффициентов радиального за- тухания можно задать следующим образом:
10.20. Функции освещения и визуализации OpenGL 885 Рис. 10.113. Круговой конус света, излучен- ного источником OpenGL. Угловые границы конуса света, измеряемые от оси конуса, рав- ны 0(, а через а обозначен угол между осью и вектором направления на объект glLightf (GL_LIGHT6, GL_CONSTANT_ATTENUATION, 1.5); glLightf (GL_LIGHT6, GL_LINEAR_ATTENUATION, 0.75); glLightf (GL_LIGHT6, GL_QUADRATIC_ATTENUATION, 0.4); После того как значения заданы, ко всем трем цветам (фоновое освещение, диф- фузное и зеркальное отражение) применяется функция радиального затухания. По умолчанию значения коэффициентов затухания - ао — 1,0, — 0, 0 и а% = 0, 0. Следовательно, по умолчанию радиального затухания нет: /;,radatten — 1;0- Хотя радиальное затухание может давать более реалистичные изображения, соответству- ющие расчеты являются объемными. НАПРАВЛЕННЫЕ ИСТОЧНИКИ СВЕТА (ПРОЖЕКТОРЫ) OpenGL Для локальных источников света (тех, которые расположены не на бесконечности) можно также задать эффект направленного освещения. Это ограничивает свет, излу- чаемый источником, конусообразной областью пространства. Определим коническую область вектором направления вдоль оси конуса и угловым отклонением 0/ от оси ко- нуса, как показано на рис. 10.113. Кроме того, для источника света можно задать пока- затель углового затухания а/, определяющий, насколько уменьшается интенсивность света при удалении от центра конуса к его поверхности. Вдоль любого направления в конусе вычисляется коэффициент углового затухания cosa; а (уравнение (10.5)), где cos а вычисляется через скалярное произведение вектора оси конуса и вектора — направления на объект. Значения фоновой, диффузной и зеркальной составляющей цвета света при угле а вычисляются умножением компонентов интенсивности на
886 Глава 10. Модели освещения и методы визуализации поверхностей данный коэффициент углового затухания. Если a > 0/, объект находится вне конуса источника света, и объект данным источником не освещается. Для лучей света, распо- ложенных внутри конуса, также можно ввести радиальное затухание интенсивности. В OpenGL существует три константы свойств для создания направленных эффек- тов: GL_SPOT_ DIRECTION, GL_SPOT_CUTOFF и GL_SPOT_EXPONENT. Направ- ление света задается вектором в глобальных координатах, компоненты которого — целые числа и величины с плавающей запятой. Угол конуса 0/ задается в граду- сах как целое число или величина с плавающей запятой, и этот угол может быть равен 180° или любым значениям от 0° до 90°. Если угол конуса равен 180°, ис- точник света излучает во всех направлениях (360°). Значение параметра затухания интенсивности задается в форме целого числа или величины с плавающей запятой из диапазона 0-128. Приведенные ниже команды задают направленные эффекты для источника света 3, так что ось конуса идет по положительному направлению оси х, угол конуса 0/ равен 30°, а параметр затухания равен 2,5. GLfloat dirVector [ ] = {1.0, 0.0, 0.0); glLightfv (GL_LIGHT3, GL_SPOT_DIRECTION, dirVector); glLightf (GL_LIGHT3, GL_SPOT_CUTOFF, 30.0); glLightf (GL_LIGHT3, GL_SPOT_EXPONENT, 2.5); Если направление излучения для источника света не задается, по умолчанию счи- тается, что свет распространяется параллельно отрицательному направлению оси z; т.е. (0.0, 0.0, —1.0). Кроме того, по умолчанию угол конуса равен 180°, и коэффици- ент затухания — 0. Таким образом, по умолчанию используется точечный источник света, излучающий во всех направлениях без углового затухания. ПАРАМЕТРЫ ГЛОБАЛЬНОГО ОСВЕЩЕНИЯ OpenGL Некоторые параметры освещения OpenGL можно задать на глобальном уровне. Дан- ные значения используются для контроля за ходом некоторых расчетов освещения, и значение глобального параметра можно задать с помощью следующей функции. glLightModel* (paramName, paramValue); В зависимости от типа значения параметра добавляется код суффикса i или f. Кроме того, для векторных данных также прибавляется код суффикса v. Параметру param- Name присваивается символьная константа OpenGL, идентифицирующая устанавли- ваемое глобальное свойство, а параметру paramValue присваивается одно значение или набор значений. Используя функцию glLightModel, можно задать глобальный уровень фонового освещения, указать, как следует вычислить зеркальные “зайчики”, или применить модель освещения к невидимым граням многоугольной поверхности.
10.20. Функции освещения и визуализации OpenGL 887 Помимо фонового цвета, порожденного отдельными источниками света, можно как глобальную величину задать независимое значение фонового освещения OpenGL. Это дает всего лишь еще одну возможность, используемую при эмпирических вы- числениях освещения. Чтобы задать эту опцию, применим символьную константу GL_LIGHT_MODEL_AMBIENT. В следующем выражении, например, задается общее фоновое освещение сцены — слабоинтенсивный (темный) синий цвет, альфа-фактор равен 1,0. globalAmbient! ]={0.0, 0.0, 0.3, 1.0 } glLightModelfv (GL_LIGHT_MODEL_AMBIENT, globalAmbient); Если глобальный уровень фонового освещения не задан, по умолчанию исполь- зуется слабоинтенсивный белый (темно-серый) цвет (0.2, 0.2, 0.2, 1.0). Расчет зеркального отражения требует значения нескольких векторов, включая вектор V от точки поверхности к точке наблюдения. Чтобы ускорить расчет зеркаль- ного отражения, в процедурах OpenGL используется постоянное направление вектора V вне зависимости от положения точки поверхности относительно точки наблюде- ния. Данный постоянный единичный вектор идет в положительном направлении оси z, (0.0,0.0,1.0), и это — значение V по умолчанию. В то же время, если требуется отка- заться от значения по умолчанию и использовать реальную точку наблюдения (начало системы координат наблюдения), то для расчета V вводится следующая команда. glLightModeli (GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE); Хотя расчет зеркального отражения требует больше времени при использова- нии реальной точки наблюдения, в результате получаются более реалистичные изоб- ражения. Если параметр “локальный наблюдатель” имеет значение по умолчанию GL_FALSE (или 0, или 0.0), расчет поверхности для вектора V опускается. Если в расчете освещения OpenGL фигурируют поверхностные текстуры, “зайчи- ки” на поверхности могут быть тусклыми, а текстурные узоры искажаться зеркаль- ными членами. Следовательно, как вариант, текстурные узоры могут применяться только к незеркальным членам, которые вносят вклад в цвет поверхности. Данные незеркальные члены включают эффекты фонового освещения, излучения с поверх- ности и диффузного отражения. Используя эту возможность, процедуры освещения OpenGL генерируют два цвета в каждом цикле расчета освещения поверхности: вкла- ды зеркального и незеркального цветов. Текстурные узоры накладываются только на незеркальный цвет, затем два цвета объединяются. Чтобы использовать описанную возможность ввода двух цветов, вызывается команда glLightModeli (GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);
888 Глава 10. Модели освещения и методы визуализации поверхностей Если текстурные узоры не используются, разбивать цвет на два члена необя- зательно, причем, если эту опцию не вызывать, расчет освещения выполня- ется более эффективно. По умолчанию данное свойство задано со значением GL_SINGLE_COLOR, и цвет зеркального отражения не отделяется от других ком- понентов цвета поверхности. В некоторых приложениях может потребоваться отобразить задние поверхности объекта. Пример — вид твердого тела в разрезе, при котором в дополнение к перед- ним поверхностям нужно показать некоторые задние. Впрочем, по умолчанию при расчете освещения наложенные свойства материала применяются только к перед- ним граням. Чтобы применить расчет освещения к передним и задним граням, учтя соответствующие свойства материалов, используется команда glLightModeli (GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE); При выполнении этой команды векторы нормали к поверхности обращаются, и расчет освещения ведется с использованием свойств материалов, приписанных задним граням. Чтобы отключить двусторонний расчет освещения, в функции gl- LightModel используется значение по умолчанию GL_FALSE (или 0, или 0.0). ФУНКЦИЯ СВОЙСТВ ПОВЕРХНОСТИ OpenGL Коэффициенты отражения и другие оптические свойства поверхностей задаются с использованием функции glMaterial* (surfFace, surfProperty, propertyvalue); К функции добавляется код-суффикс i или f в зависимости от типа данных свойств, если же свойства можно задавать вектором значения, также добавляется код V. Параметру surfFace присваивается одна из символьных констант GL_FRONT, GL_BACK или GL_FRONT_AND_BACK; параметр surf Property — символьная кон- станта, определяющая параметр поверхности, например, Zsurf, ka, kj, ks или ns; a параметру propertyvalue присвоено соответствующее значение. Все свойства, исключая параметр зеркального отражения ns, задаются как векторные значения. Чтобы установить все свойства освещенности объекта, используется последователь- ность функций glMaterial, затем выдаются команды, описывающие геометрию объекта. Значение RGBA для цвета излучения с поверхности /surf выбирается с исполь- зованием символьной константы свойства поверхности GL_EMISSION. Например, в следующем выражении задается светло-серый (грязно-белый) цвет излучения с пе- редних поверхностей. surfEmissionColor [ ] = {0.8, 0.8, 0.8, 1.0); glMaterialfv (GL_FRONT, GL_EMISSION, surfEmissionColor);
10.20. Функции освещения и визуализации OpenGL 889 По умолчанию цвет излучения с поверхности — черный (0.0, 0.0, 0.0, 1.0). Хотя цвет излучения с поверхности можно задать, это излучение не будет освещать другие объекты на сцене. Чтобы это исправить, необходимо определить поверхность как источник света, используя методы, рассмотренные в разделе 10.3. Используя символьные константы GL_AMBIENT, GL_DIFFUSE и GL_SPECULAR, зададим значения коэффициентов отражения от поверхности. Чтобы изображение вы- глядело реалистично, коэффициентам фонового и диффузного освещения нужно при- своить одинаковые векторные значения, и это можно сделать, используя символьную константу GL_AMBIENT_AND_DIFFUSE. По умолчанию значения коэффициентов фонового освещения равны (0.2, 0.2, 0.2, 1.0), значения коэффициентов диффузно- го отражения — (0.8, 0.8, 0.8, 1.0), наконец, значения коэффициентов зеркального отражения — (1.0, 1.0, 1.0, 1.0). Чтобы задать показатель зеркального отражения, используем константу GL_SHININESS. Данному свойству можно присвоить любое значение из диапазона 0-128, значение по умолчанию — 0. Например, в приведен- ном ниже блоке кода задаются значения трех коэффициентов отражения и показатель зеркального отражения. Коэффициенты диффузного отражения и фонового света за- даны так, что поверхность отображается в светло-синем цвете при освещении белым светом; показателю зеркального отражения присвоено значение 25.0. diffuseCoeff [ ] = 0.2, 0.4, 0.9, 1.0; specularCoeff [ ] =1.0, 1.0, 1.0, 1.0; glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, diffuseCoeff); glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, specularCoeff); glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, 25.0); Компоненты коэффициентов отражения также можно задать с использованием ко- дов таблицы цветов, и для этой цели в OpenGL вводится символьная константа GL_COLOR_INDEXES. Индексы таблицы цветов задаются в форме трехэлементного массива целых чисел или величин с плавающей запятой, значения по умолчанию — (0, 1, 1). МОДЕЛЬ ОСВЕЩЕНИЯ OpenGL В OpenGL эффекты освещения поверхности вычисляются с использованием базовой модели освещения (10.19) с некоторыми вариациями способа задания параметров. Уровень фонового освещения является суммой компонента фонового освещения, со- отнесенного с источником света, и заданного глобального уровня фонового света. В расчете диффузного отражения используются компоненты света источников, отвеча- ющие за интенсивность диффузного отражения, а вычисления зеркального отражения основываются на зеркальных компонентах света.
890 Глава 10. Модели освещения и методы визуализации поверхностей Кроме того, единичному вектору V, задающему направление от точки поверхно- сти к точке наблюдения, можно присвоить постоянное значение (0.0, 0.0, 0.0), если не используется наблюдение с позиции локального наблюдателя. Для источника све- та, расположенного “на бесконечности”, единичный вектор направления света L и вектор хода лучей от источника противоположны. АТМОСФЕРНЫЕ ЭФФЕКТЫ OpenGL Применив для получения цветов поверхности модель освещения OpenGL, можно указать цвет атмосферы на сцене и объединить цвета поверхности с цветом атмосфе- ры. Кроме того, для имитации наблюдения сцены через замутненную или дымную атмосферу можно использовать функцию атмосферного затухания. Различные атмо- сферные параметры задаются с использованием функции glFog, представленной в разделе 9.14: glEnable (GL_FOG); glFog* (atmoParameter, paramValue); Чтобы указать тип данных, к функции добавляется код-суффикс i или f, при использовании векторных данных дополнительно добавляется суффикс v. Чтобы задать цвет атмосферы, параметру atmoParameter присваивается зна- чение символьной константы GL_FOG_COLOR. Например, можно указать, что атмо- сфера имеет голубовато-серый (стальной) цвет: GLfloat atmoColor [4] = 0.8, 0.8, 1.0, 1.0; glFogfv (GL_FOG_COLOR, atmoColor); По умолчанию цвет атмосферы черный (0.0, 0.0, 0.0, 0.0). Далее можно выбрать функцию атмосферного затухания, которая будет исполь- зоваться при объединении цвета объекта с цветом атмосферы. Чтобы это сделать, применяется символьная константа GL_FOG_MODE: glFogi (GL_FOG_MODE, atmoAttenFunc); Если параметру atmoAttenFunc присвоено значение GL_EXP, в качестве функции атмосферного затухания используется уравнение (10.31). При значении GL_EXP2 функция атмосферного затухания задается согласно уравнению (10.32). Для лю- бой экспоненциальной функции значение плотности атмосферы задается следую- щим образом^ glFog (GL_FOG_DENSITY, atmoDensity);
10.20. Функции освещения и визуализации OpenGL 891 Третья возможность при выборе атмосферного поглощения — использовать ли- нейную функцию затухания с глубиной (раздел 9.13). В данном случае параметру atmoAttenFunc присваивается значение GL_LINEAR. По умолчанию значение па- раметра atmoAttenFunc — GL_EXP. Выбранная функция атмосферного поглощения применяется для расчета цвета объекта, определяемого смешанным влиянием цвета поверхности и атмосферы. В процедуре создания атмосферных эффектов OpenGL для этого используется уравне- ние (10.33). ФУНКЦИИ ПРОЗРАЧНОСТИ OpenGL Некоторые эффекты прозрачности можно сымитировать в OpenGL, используя проце- дуры смешивания цветов, описанные в разделе 4.3. Однако в общем случае прямо реализовать прозрачность в программе OpenGL невозможно. Для простой сцены, содержащей несколько прозрачных и несколько непрозрачных поверхностей, можно скомбинировать цвета объектов, используя альфа-сопряжение (alpha blending), задав степень прозрачности и обработав поверхности в порядке увеличения глубины. От- метим, впрочем, что в операциях смешивания цветов OpenGL игнорируются эффекты преломления, и обработка прозрачных поверхностей на сложных сценах с разнооб- разными условиями освещения или анимацией может быть весьма длительной. Кроме того, OpenGL не предлагает прямых средств имитации внешнего вида поверхности полупрозрачного объекта (такого как зернистая поверхность пластмассы или панель “морозного” стекла), который диффузно рассеивает свет, проходящий сквозь полупро- зрачный материал. Таким образом, чтобы отобразить полупрозрачные поверхности или эффекты освещения, порожденные преломлением, потребуется написать соб- ственную программу. Чтобы сымитировать эффекты освещенности, характерные для полупрозрачных объектов, можно использовать комбинацию текстуры поверхности и свойств материала. Для учета эффектов преломления можно сместить положения пикселей для поверхностей, расположенных за полупрозрачным объектом, используя уравнение (10.29). Чтобы отнести объекты на сцене к полупрозрачным, используется параметр “аль- фа” в таких командах описания RGBA-цвета поверхности, как glMaterial и gl- Color. Для поверхности значение параметра “альфа” можно положить равным коэф- фициенту прозрачности (уравнение (10.30)) этого объекта. Например, цвет прозрач- ной поверхности можно задать такой функцией. glColor4f (R, G, В, А); В этом случае значение параметра альфа устанавливается равным А = kt. Полностью прозрачная поверхность имеет альфа-фактор А = 1.0, а непрозрачная — А = 0.0.
892 Глава 10. Модели освещения и методы визуализации поверхностей После присвоения значений прозрачности активизируются функции смешивания цветов OpenGL и обрабатываются поверхности, начиная с наиболее отдаленных объ- ектов к объектам, ближайшим к точке наблюдения. После активизации смешивания цветов каждый цвет поверхности объединяется со всеми накладывающимися поверх- ностями, уже занесенными в буфер кадра, с использованием соотнесенных с ними альфа-факторов. Коэффициенты смешивания цветов задаются так, чтобы все компоненты цвета текущей поверхности (объект-“источник”) умножались на (1 — Л) = (1 — kt), и все компоненты цвета соответствующих позиций буфера кадра (“цель”) умножались на величину А = kt: glEnable (GL_BLEND); glBlendFunc (GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA); Затем два цвета смешиваются согласно уравнению (10.30), где альфа-фактор равен kt, а в буфере кадров используются цвета поверхности, расположенной за обраба- тываемым прозрачным объектом. Например, если А = 0, 3, то для каждой точки поверхности новый цвет в буфере кадров является суммой 30% текущего цвета бу- фера и 70% отраженного цвета объекта. (Альтернативно в качестве альфа-фактора можно использовать показатель непрозрачности, а не показатель прозрачности. Если положить А равным показателю непрозрачности, в функции glBlendFunc придется поменять местами значения двух аргументов.) Проверку видимости можно выполнить с использованием функций буфера глуби- ны OpenGL, описанных в разделе 9.14. При обработке каждой видимой непрозрачной поверхности записываются цвета поверхности и глубина поверхности. Однако при обработке видимой прозрачной поверхности нужно записать только ее цвета, посколь- ку поверхность не затеняет фоновые поверхности. Следовательно, при обработке каж- дой прозрачной поверхности буферу глубины с помощью функции glDepthMask присваивается статус “только чтение”. Если объекты обрабатывать в порядке уменьшения глубины, режим записи буфера глубины выключается, а затем снова включается при обработке каждой прозрачной поверхности. В качестве альтернативы можно разделить объекты на два класса, как в следующем примере кода. glEnable (GL_DEPTH_TEST); /* Обработать все непрозрачные поверхности. */ glEnable (GL_BLEND); glDepthMask (GL_FALSE); glBlendFunc (GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA); /* Обработать все прозрачные поверхности. */ glDepthMask (GL_TRUE); glDisable (GL_BLEND); glutSwapBuffers ( );
10.20. Функции освещения и визуализации OpenGL 893 Если прозрачные объекты не обрабатываются в строгом порядке от фона к переднему плану, данный подход раскрашивает поверхности не всегда точно. Впрочем, для про- стых сцен он является простым и эффективным методом генерации приблизительных представлений эффектов прозрачности. ФУНКЦИИ ВИЗУАЛИЗАЦИИ ПОВЕРХНОСТИ OpenGL Поверхности можно отобразить с помощью процедур OpenGL, используя либо ви- зуализацию поверхностей постоянной интенсивности, либо визуализацию Гуро. В OpenGL нет процедур для применения визуализации поверхностей по Фонгу, постро- ения хода лучей или методов диффузного отражения. Метод визуализации выбирается с помощью функции glShadeModel (surfRenderingMethod); Визуализация поверхностей постоянной интенсивности выбирается путем присво- ения символьного значения GL_FLAT параметру surfRenderingMethod. Для затенения по методу Гуро (по умолчанию) используется символьная константа GL_SMOOTH. Когда функция glShadeModel применяется к мозаичной криволинейной по- верхности, такой как сфера, аппроксимированная многоугольной сеткой, процедуры визуализации OpenGL используют для расчета цвета многоугольника векторы нор- мали к поверхности в вершинах многоугольника. Декартовы компоненты вектора нормали к поверхности в OpenGL задаются командой glNormal3* (Nx, Ny, Nz); В этой функции используются суффиксы-коды b (byte), s (short), i (integer), f (float) и d (double). Кроме того, если в массиве задаются векторные компоненты, прибавляет- ся код-суффикс v. Значения типа byte, short и integer преобразуются в формат с плавающей запятой (float) из диапазона от -1,0 до 1,0. Функция glNormal за- дает компоненты вектора нормали к поверхности как значения параметра состояния, которые применяются ко всем последующим командам glVertex, а по умолчанию вектор нормали идет в положительном направлении оси z: (0.0, 0.0, 1.0). При плоской визуализации поверхностей для каждого многоугольника требуется только один вектор нормали к поверхности. Таким образом, нормаль ко всем много- угольникам можно, например, задать следующим образом. glNormal3fv (normalvector); glBegin (GL_TRIANGLES) ; glVertex3fv (vertexl); glVertex3fv (vertex2); glVertex3fv (vertex3); glEnd ( );
894 Глава 10. Модели освещения и методы визуализации поверхностей Если к заданному выше треугольнику нужно применить процедуру визуализации Гуро, потребуется указать вектор нормали для каждой вершины. glBegin (GL_TRIANGLES); glNormal3fv (normalvector1) ; glVertex3fv (vertexl); glNormal3fv (normalVector2) ; glVertex3fv (vertex2); glNormal3fv (normalvector3) ; glVertex3fv (vertex3); glEnd ( ); Хотя векторы нормали не нужно задавать как единичные векторы, если их все же нормировать на единицу, вычисления сокращаются. Любая неединичная нормаль к поверхности автоматически преобразовывается в единичную, если включить в про- грамму команду glEnable (GL_NORMALIZE); Данная команда также ренормирует векторы нормали, если они изменились при геометрических преобразованиях, таких как масштабирование или сдвиг. Другая возможность — обозначить список векторов нормали, которые будут объ- единены или соотнесены с массивом вершин (разделы 3.17 и 4.3). Для создания массива векторов нормали используются следующие выражения. glEnableClientState (GL_NORMAL_ARRAY); glNormalPointer (dataType, offset, normalArray); Параметру dataType присваивается постоянное значение GL_BYTE, GL_SHORT, GL_INT, GL_FLOAT (значение по умолчанию) или GL_DOUBLE. Число байтов между последовательными векторами нормали в массиве normalArray задается парамет- ром offset, значение по умолчанию которого — 0. ОПЕРАЦИИ ФОРМИРОВАНИЯ ПОЛУТОНОВОГО ИЗОБРАЖЕНИЯ OpenGL В некоторых системах с помощью OpenGL можно изобразить разнообразные цветные и полутоновые эффекты. Шаблоны и операции полутоновой аппроксимации являются аппаратно-зависимыми, и обычно их эффект незаметен в системах с полноцветны- ми графическими возможностями. Однако, если система может предоставить лишь малое число битов на пиксель, цветовые настройки RGBA можно аппроксимиро- вать полутоновыми шаблонами. Процедуры построения полутоновых изображений активизируются включенной по умолчанию командой glEnable (GL_DITHER); Отключить указанные процедуры можно с помощью команды glDisable (GL_DITHER);
10.21. Текстурные функции OpenGL 895 10.21. ТЕКСТУРНЫЕ ФУНКЦИИ OpenGL OpenGL предлагает обширный набор текстурных функций и позволяет задавать узор линии, поверхности, внутреннего объема области пространства, а также вводить в текстурные узоры другие подузоры. Стоит отметить, что наложить текстурный узор и работать с ним можно по-разному. Кроме того, текстурные узоры используются для имитации отображения среды. Текстурные процедуры OpenGL можно использовать только в цветовом режиме RGB (RGBA), хотя некоторые параметры можно задать, используя индекс таблицы цветов. ФУНКЦИИ ЛИНЕЙНЫХ ТЕКСТУР OpenGL Параметры одномерного текстурного узора RGBA задаются в одноиндексном массиве цветов с помощью, например, следующей команды. glTexImagelD (GL_TEXTURE_1D, 0, GL_RGBA, nTexColors, 0, dataFormat, dataType, lineTexArray); glEnable (GL_TEXTURE_1D); Первому аргументу функции glTexImagelD присваивается символьная константа GL_TEXTURE_1D, чтобы указать, что массив текстур определяется для одномерного объекта — линии. Если неизвестно, поддерживает ли система текстурные узоры с за- данными параметрами, используем символьную константу GL_PROXY_TEXTURE_1D и зададим значение первого аргумента функции glTexImagelD. Это позволяет вна- чале запросить систему (процедуры запроса рассмотрены в следующем разделе), а затем определить элементы массива текстуры. Второму и пятому аргументу функции в нашем примере присвоим значение 0. Первое значение 0 (второй аргумент) означает, что данный массив не является сокра- щенной версией некоторого большего массива текстур. Значение 0 пятого аргумента означает, что вокруг текстуры не нужно создавать рамочку. Если бы данному аргу- менту было присвоено значение 1 (единственная другая возможность), текстурный узор был бы отображен с однопиксельной границей вокруг него (это полезно, ко- гда нужно соединить данный узор с соседним текстурным узором). Для третьего аргумента значение GL_RGBA означает, что каждый цвет текстурного узора задает- ся четырьмя значениями RGBA. До этого момента мы использовали три RGB-кода, но RGBA-значения часто обрабатываются эффективнее, поскольку они согласова- ны с границами областей памяти процессора. Есть множество других спецификаций цвета, включая задание цвета единственным значением интенсивности или яркости. Параметру nTexColors (четвертый аргумент) присваивается положительное целое число, указывающее число цветов в линейном текстурном узоре. Поскольку пятый аргумент имеет значение 0 (параметр рамки), число цветов в текстурном шаблоне должно быть степенью двойки. Если пятому аргументу присвоено значение 1, число цветов в текстурном узоре будет равно 2 плюс степень двойки. Чтобы обеспечить со-
896 Глава 10. Модели освещения и методы визуализации поверхностей пряжение цвета с соседними узорами, используется два цвета. Вообще, можно задать одноиндексный текстурный узор, включающий до 64+2 цветов, а некоторые реализа- ции OpenGL допускают еще более разнообразные текстурные узоры. Параметры, опи- сывающие цвета текстуры и границы узора, хранятся в массиве lineTexArray. В рассмотренном примере границы не используются, и каждая последовательная груп- па из четырех элементов в массиве представляет один компонент цвета текстурного узора. Следовательно, число элементов в lineTexArray равно 4 х nTexColors. Конкретизируем наш пример: если требуется определить текстурный узор, состоящий из 8 цветов, массив текстуры должен содержать 4 х 8 = 32 элемента. Параметры dataFormat и dataType подобны аргументам функций glDraw- Pixels и glReadPixels (раздел 3.19). Параметру dataFormat присваивается символьная константа OpenGL, чтобы указать, как задаются коды цвета в массиве текстуры. Например, можно использовать символьную константу GL_BGRA, чтобы указать, что компоненты цвета задаются в порядке “синий, зеленый, красный, альфа- фактор”. Чтобы указать тип данных BGRA или RGBA, можно присвоить парамет- ру dataType значение константы GL_UNSIGNED_BYTE. Другие значения, которые можно присвоить параметру dataType, зависят от выбранного формата данных, включая GL_INT и GL_FLOAT. На объект сцены можно наложить несколько копий текстуры или любой непре- рывный поднабор цветов текстуры. При отображении группы текстурных элементов в одну или несколько областей пикселей границы текстурных элементов обычно не вы- ровнены по границам пикселей. Область пикселя может вмещаться в границы одного текстурного элемента RGB (или RGBA), или же она может захватывать несколько текстурных элементов. Чтобы упростить расчет отображения текстуры, используем следующие функции и сопоставим с каждым пикселем цвет ближайшего текстурного элемента. glTexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST) ; glTexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); Первая функция используется процедурами текстурирования, когда область текстур- ного узора нужно увеличить, чтобы она вмещалась в заданную координатную область сцены, а вторая функция используется, когда текстурный узор нужно уменьшить. (В OpenGL данные операции с текстурой называются увеличением (magnifying — MAG) и уменьшением (minifying — MIN).) Хотя присвоение цвета ближайшей текстуры пик- селю выполняется быстро, это может привести к эффектам наложения. Чтобы рас- считать цвет пикселя как линейную комбинацию цветов наложенных на него текстур, вместо символьной константы GL_NEAREST используется GL_LINEAR. С помощью функции glTexParameter можно задать еще несколько параметров, и такая воз- можность будет рассмотрена в следующем разделе.
10.21. Текстурные функции OpenGL 897 Задание текстурных узоров OpenGL для сцены чем-то похоже на задание векторов нормали к поверхности, RGB-цветов или других параметров. Узор нужно соотнести с некоторым объектом, но, в отличие от использования одного цвета, здесь есть набор цветовых значений. Для одномерного пространства текстур коды цвета зада- ются одной координатой s, значение которой в текстурном пространстве меняется от 0,0 до 1,0 (раздел 10.16). Следовательно, текстурный узор применяется к объектам на сцене через присвоение значений текстурной координаты точкам объекта. Конкретное значение s в одномерном пространстве текстур выбирается с помощью следующей команды. glTexCoordl* * (sCoord); Данная функция снабжается суффиксами-кодами b (byte), s (short), i (integer), f (float) и d (double), в зависимости от типа данных параметра текстурной координа- ты sCoord. Кроме того, если значение координаты s дается в виде массива, можно использовать суффикс v. Как и при использовании цвета и других подобных па- раметров, координата s — это параметр состояния, который применяется ко всем позднее определенным точкам в глобальных координатах. Значение координаты s по умолчанию — 0,0. Чтобы отобразить линейный текстурный узор в участок сцены, заданный в гло- бальных координатах, указываются координаты s конечных точек отрезка. Затем (раз- личными способами) на объект могут накладываться цвета текстуры, в OpenGL по умолчанию каждый код цвета пикселя умножается на соответствующий код цвета в текстурном узоре. Если цвет линии белый (1.0, 1.0, 1.0, 1.0) (цвет объектов на сцене по умолчанию), линия будет отображаться только с цветами текстуры. В приведенном ниже примере создается четырехэлементный линейный текстур- ный узор из чередующихся зеленых и красных точек. Далее весь текстурный узор, определенный в промежутке от 0,0 до 1,0, присваивается прямому отрезку. Поскольку цвет линии — белый (по умолчанию), линия отображается в цветах текстуры. GLint k; GLubyte texLine [16]; // 16-элементный массив текстуры. /* Определяется два зеленых элемента текстурного узора. */ /* Каждый цвет текстуры задается в четырех позициях * массива. */ for (к = 0; к <= 2; к += 2) { texLine [4*к] = 0; texLine [4*к+1] = 255; texLine [4*к+2] = 0; texLine [4*к+3] = 255; 1
898 Глава 10. Модели освещения и методы визуализации поверхностей /* Определяется два красных элемента текстурного узора. */ for (к = 1; к <= 3; k += 2) { texLine [4*k] = 255; texLine [4*k+l] = 0; texLine [4*k+2] = 0; texLine [4*k+3] = 255; } glTexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri (GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexImagelD (GL_TEXTURE_1D, 0, GL_RGBA, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, texLine); glEnable (GL_TEXTURE_1D); /* Весь диапазон цветов текстуры присваивается отрезку. */ glBegin (GL_LINES); glTexCoordlf (0.0); glVertex3fv (endPtl); glTexCoordlf (1.0); glVertex3fv (endPt2); glEnd ( ); glDisable (GL_TEXTURE_1D); Сегмент линии отображается в виде чередующихся зеленых и красных элементов. Координате s можно присвоить любые значения s. Например, внутренние красный и зеленый цвета текстурного узора отображаются на линию с помощью следующих выражений. glBegin (GL_LINES); glTexCoordlf (0.25); glVertex3fv (wcPtl); glTexCoordlf (0.75); glVertex3fv (wcPt2); glEnd ( ); Таким образом, первая половина линии красная, а вторая — зеленая. Кроме того, можно использовать значения s, лежащие вне диапазона 0,0-1,0. Например, если присвоить значение s = —2.0 одному концу линии и значение s = 2.0 другому концу, текстурный узор отобразится в отрезок четыре раза. В этом случае линия будет состоять из 16 зеленых и 16 красных сегментов. Для значений координаты s вне единичного интервала целые части отбрасываются, если не задать, что значения
10.21. Текстурные функции OpenGL 899 Рис. 10.114. Примеры отображения текстурного узора OpenGL на белый отрезок s принудительно устанавливаются на 0 или 1. На рис. 10.114 показаны некоторые возможные линейные узоры, которые можно отобразить с помощью массива, содер- жащего RGB-значения двух зеленых и двух красных цветов. При формировании текстурных узоров OpenGL можно использовать огромное число параметров и опций. Однако, перед тем, как перейти к рассмотрению процедур работы с текстурой, изучим базовые функции, необходимые для генерации двух- и трехмерных текстурных узоров. ФУНКЦИИ OpenGL ДЛЯ ПОВЕРХНОСТНЫХ ТЕКСТУР Параметры двухмерного пространства текстур RGBA можно задать, используя функ- ции, подобные использованным в приведенном выше примере одномерного текстур- ного узора: glTex!mage2D (GL_TEXTURE_2D, 0, GL_RGBA, texWidth, texHeight, 0, dataFormat, dataType, surfTexArray); glEnable (GL_TEXTURE_2D); Единственное отличие — нужно задать и ширину (число столбцов), и высоту (число строк) массива текстуры с тремя индексами. Ширина и высота должны быть степенями 2 (если граница не используется) или 2 плюс степень 2 (если есть граница). Снова используем цветовые компоненты RGBA и примем, что узор не имеет границ и не является сокращенным вариантом большего текстурного узора. Таким образом, размер массива, записанный в surfTexArray, равен 4 х texWidth х texHeight. Для двухмерного текстурного узора присвоим элементам массива текстуры коды цве- тов в восходящем (от низа массива к верху) порядке. Начиная с левого нижнего угла цветного узора зададим элементы первой строки массива RGBA-значений, со- ответствующие верхней строке пространства текстур, а элементам нижней строки массива будут присвоены RGBA-значения, соответствующие верху прямоугольного пространства текстур (рис. 10.103).
900 Глава 10. Модели освещения и методы визуализации поверхностей Как и для линейных текстурных узоров, пикселям поверхности на сцене могут присваиваться цвета ближайших элементов текстуры или интерполированный цвет текстур. Одна из этих опций задается теми же двумя функциями glTexParameter, что использовались для одномерных текстур. Одна функция задает используемую опцию при увеличении узора, чтобы он заполнял соответствующую область, а дру- гая задает опцию, используемую при сокращении узоров. Кроме того, двухмерный текстурный узор можно растягивать в одном направлении и сжимать в другом. На- пример, следующие команды указывают, что спроектированные точки поверхности отображаются с использованием ближайшего цвета текстуры. glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); Чтобы присвоить пикселям поверхности интерполированный цвет текстур, вместо символьной константы GL_NEAREST используется константа GL_LINEAR. Координаты в двухмерном пространстве текстур выбираются с помощью команды glTexCoord2* * (sCoord, tCoord); Пространство текстур нормируется так, чтобы узор задавался координатами, при- надлежащими диапазону 0,0-1,0. Однако можно использовать любые координаты в пространстве текстур, чтобы повторять узор на поверхности. Текстурные координаты можно задавать в различных форматах, и, чтобы указать формат данных, использует- ся суффикс b, s, i, f или d. Кроме того, если текстурные координаты предлагаются в форме массива, также добавляется суффикс v. Чтобы проиллюстрировать функции OpenGL для двухмерного пространства тек- стур, ниже приведен фрагмент кода, в котором узор 32 на 32 вначале задается, а затем отображается в четырехугольную поверхность. Каждый цвет текстуры задается че- тырьмя компонентами RGBA, кроме того, узор не имеет границы. GLubyte texArray [32][32] [4]; /* Далее в texArray заносятся цветовые компоненты * текстуры. */ /* Выбирается опция "цвет ближайшего". */ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
10.21. Текстурные функции OpenGL 901 glTex!mage2D (GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, texArray); glEnable (GL_TEXTURE_2D); /* Весь диапазон цветов текстуры отображается * в четырехугольник. */ glBegin (GL_QUADS); glTexCoord2f (0.0, 0.0); glVertex3fv (vertexl); glTexCoord2f (1.0, 0.0); glVertex3fv (vertex2); glTexCoord2f (1.0, 1.0); glVertex3fv (vertex3); glTexCoord2f (0.0, 1.0); glVertex3fv (vertex4); glEnd ( ) ; glDisable (GL_TEXTURE_2D) ; ФУНКЦИИ OpenGL ДЛЯ ОБЪЕМНЫХ ТЕКСТУР Функции в трехмерном пространстве текстур являются простыми расширениями функций двухмерного пространства. Например, массив текстуры с четырьмя индек- сами без границы можно задать следующим образом: glTex!mage3D (GL_TEXTURE_3D, 0, GL_RGBA, texWidth, texHeight, texDepth, 0, dataFormat, dataType, volTexArray); glEnable (GL_TEXTURE_3D) ; RGBA-цвета текстур хранятся в массиве volTexArray, который содержит 4 х texWidth х texHeight х texDepth элементов. Отметим, что ширина, высота и глубина массива должны быть степенями 2 или 2 плюс степень 2. В следующем выражении указывается, что пиксели отображаются с использова- нием цвета ближайшего элемента текстуры. glTexParameteri (GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri (GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); Чтобы значения пикселя определялись линейной интерполяцией цветов текстуры, вместо константы GL_NEAREST используется GL_LINEAR. Для выбора трехмерных координат текстуры используется функция glTexCoord3* (sCoord, tCoord, rCoord); Затем каждая выбранная точка в пространстве текстур соотносится с точкой сцены во внешней системе координат.
902 Глава 10. Модели освещения и методы визуализации поверхностей ОПЦИИ ЦВЕТА ТЕКСТУРНЫХ УЗОРОВ OpenGL Элементы пространства текстур можно задать множеством способов. Третий аргу- мент в функциях glTexImagelD, glTexImage2D и glTexImagelD используется для задания общего формата и числа цветовых компонентов каждого элемента узора. Для этого доступно примерно 40 символьных констант. Например, каждому элемен- ту текстуры может присваиваться набор RGBA-значений, набор RGB-значений, одно альфа-значение, одно значение интенсивности красного, одно значение освещенности или пара “значение освещенности и альфа-фактор”. Кроме того, некоторые константы также задают размер в битах. Константа OpenGL GL_R3_G3_B2, например, задается использованием однобайтового (8 бит) RGB-цвета с 3 бит, выделенными для красно- го компонента, 3 бит, выделенными для зеленого компонента, и 2 бит, выделенными для синего компонента. Затем в текстурных функциях используется параметр dataFormat, с помощью которого задается конкретный формат элементов текстуры. Значение этого параметра можно выбирать из 11 символьных констант. Это позволяет задать каждый элемент текстуры как индекс в таблице цветов, отдельное альфа-значение, отдельное значе- ние освещенности, пару “освещенность-альфа”, отдельное значение интенсивности одного RGB-компонента, три RGB-компонента или четыре компонента специфика- ции RGBA в порядке BGRA. Кроме того, параметру dataType присваивается такое значение, как GL_BYTE, GL_INT, GL_FLOAT или символьная константа, задающая тип данных и размер в битах. Значение параметра “тип данных” можно выбирать из набора, включающего 20 символьных констант. ОПЦИИ ОТОБРАЖЕНИЯ ТЕКСТУРЫ В OpenGL Элементы текстуры можно так применить к объекту, чтобы текстурные значения объ- единялись с текущими компонентами цвета объекта, или же использовать текстурные значения, чтобы заменить цвет объекта. Метод отображения текстуры выбирается с помощью функции glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, applicationMethod); Если параметру applicationMethod присвоено значение GL_REPLACE, тогда цвет, освещенность, интенсивность или альфа-фактор текстуры заменяет соответ- ствующее значение объекта. Например, текстурный узор из альфа-факторов заменяет альфа-факторы объекта. Подобные операции замены используются, когда текстурные узоры заданы только значениями освещенности или интенсивности. В таких случаях узор из значений интенсивности зеленого компонента замещает зеленый компонент объекта.
10.21. Текстурные функции OpenGL 903 Если параметру applicationMethod присвоить значение GL_MODULATE, это приведет к “модуляции” цветовых значений объекта. Следовательно, текущие значе- ния объекта умножаются на значения текстуры. Конкретные результаты зависят от формата элементов в текстурном узоре, поэтому, например, альфа-факторы модулиру- ют альфа-факторы, а значения интенсивности модулируют значения интенсивности. По умолчанию текстурный узор применяется со значением GL_MODULATE. Если цвет объекта — белый (по умолчанию), модуляция дает тот же результат, что и замена, в зависимости от того, как заданы элементы текстурного узора. Кроме того, в операции отображения текстуры можно использовать символьную константу GL_DECAL, при этом альфа-факторы RGBA будут использоваться как ко- эффициенты прозрачности. В этом случае объект рассматривается так, как будто он прозрачный, а цветная текстура нанесена на фоновый объект. Если текстурный узор содержит только RGB-значения без альфа-факторов, цвет текстуры замещает цвет объекта. Кроме того, в некоторых случаях, например, когда текстурный узор содер- жит только альфа-факторы, возможности пометить объект нет. Если параметру applicationMethod присвоить значение GL_BLEND, проце- дуры текстурирования выполняют смешивание цветов с использованием цвета, за- данного функцией glTexEnv* (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, blendingColor); Согласно типу переходного цвета к функции прибавляется суффикс i или f. Если переходной цвет представлен в массиве, также добавляется суффикс v. ТЕКСТУРНОЕ ОБРАМЛЕНИЕ В OpenGL Если координаты в пространстве текстур не принадлежат диапазону 0-1, узоры, опи- санные в массиве текстуры, можно повторить с помощью команды glTexParameter* (texSpace, texWrapCoord, GL_REPEAT); Узоры копируются с использованием только дробной части координаты в про- странстве текстур. При этом параметру texSpace присваивается одно из сим- вольных значений GL_TEXTURE_1D, GL_TEXTURE_2D или GL_TEXTURE_3D, а параметр texWrapCoord обозначает координаты в пространстве текстур с использованием констант GL_TEXTURE_WRAP_S, GL_TEXTURE_WRAP_T или GL_TEXTURE_WRAP_R. Чтобы ввести текстурные координаты в единичный интервал, вместо GL_REPEAT используется символьная константа GL_CLAMP. Если при активизированной данной опции значение координаты больше 1, оно превращается в 1. Подобным образом, если значение координаты меньше 0, оно превращается в 0. В конкретном пространстве текстур можно задать любую комбинацию повторения и ограничения координат. По умолчанию для всех координат используется параметр GLJREPEAT.
904 Глава 10. Модели освещения и методы визуализации поверхностей КОПИРОВАНИЕ ТЕКСТУРНЫХ УЗОРОВ OpenGL ИЗ БУФЕРА КАДРОВ По значениям, записанным в буфере кадров, можно получить либо исходный узор, либо подузор. Приведенная ниже функция устанавливает двухмерный узор для теку- щего состояния текстуры с использованием блока RGBA-значений пикселей. glCopyTex!mage2D (GL_TEXTURE_2D, 0, GL_RGBA, х0, у0, texWidth, texHeight, 0); Значения 0 в списке аргументов указывают, что данный узор не является сокращенной версией и не имеет границы. Точка (хО, уО) в буфере кадров, отсчитываемая от левого нижнего края буфера, соответствует левому нижнему углу блока цветов пикселей размером texWidth на texHeight. Чтобы получить блок цветов пикселей как текстурный подузор, можно использо- вать знакомую функцию: glCopyTexSubImage2D (GL_TEXTURE_2D, 0, xTexElement, yTexElement, x0, yO, texSubWidth, texSubHeight); Данный блок значений пикселей помещается в текущий узор в точке элемента тексту- ры (xTexElement, yTexElement). Параметры texSubWidth и texSubHeight задают размер блока пикселей, левый нижний угол которого находится в точке (хО, уО) буфера кадров. МАССИВЫ КООРДИНАТ ТЕКСТУРЫ OpenGL Текстурные координаты задаются не только с помощью информации о цвете, векторов нормали к поверхности и меток краев многоугольников, но и в виде списков, которые можно объединять или соотносить с массивами вершин (разделы 3.17 и 4.3). glEnableClientState (GL_TEXTURE_COORD_ARRAY); glTexCoordPointer (nCoords, dataType, offset, texCoordArray); Параметру nCoords присваивается значение 1, 2, 3 или 4, обозначающее размер текстурного узора. Значение по умолчанию 4 используется для формирования про- странства текстур в форме однородных координат, когда координаты точки в про- странстве текстур рассчитываются делением значений первых трех координат на чет- вертую. Данная форма полезна, например, когда текстурный узор — это перспективная фотография. Параметру dataType присваивается постоянное значение GL_SHORT, GL_INT, GL_FLOAT (по умолчанию) или GL_DOUBLE. Смещение в байтах между координатами в массиве texCoordArray задается в параметре offset, значение которого по умолчанию — 0.
10.21. Текстурные функции OpenGL 905 ПРИСВОЕНИЕ ИМЕН ТЕКСТУРНЫМ УЗОРАМ OpenGL Часто в приложении бывает полезно использовать несколько текстурных шаблонов, так что OpenGL позволяет создавать несколько именованных текстурных узоров. В таких случаях просто задается, какие именованные текстуры применяются в любой момент времени. Это более эффективный метод, включающий многократные вызо- вы функции glTexImage, поскольку каждое обращение к glTexImage требует создания узоров заново, возможно, по кодам цвета в файле данных. Чтобы присво- ить имя текстурному узору, перед определением шаблона выбирается положительное (без знака) целое число. Например, в следующем выражении зелено-красный линей- ный узор, использованный в предыдущем примере, называется текстурой 3, а затем активизируется. glBindTexture (GL_TEXTURE_1D, 3); glTexImagelD (GL_TEXTURE_1D, 0, GL_RGBA, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, texLine); glBindTexture (GL_TEXTURE_1D, 3); Первый оператор glBindTexture присваивает имя узору, а второй вызывает glBindTexture, выделяя данный шаблон как текущее состояние текстуры. Если создано несколько текстурных узоров, можно снова вызвать процедуру glBind- Texture с другим именем узора, чтобы наложить эту текстуру на некоторый объ- ект на сцене. Для двух- или трехмерного узора меняется первый аргумент функции glBindTexture на GL_TEXTURE_2D либо GL_TEXTURE_3D. При первом упо- треблении имени текстуры создается текстурный узор с использованием в качестве параметров узора значений по умолчанию. Чтобы удалить один или несколько существующих текстурных узоров, использу- ется команда glDeleteTextures (nTextures, texNamesArray); Параметр nTextures задает число имен узоров, перечисленных в массиве tex- NamesArray. Можно также указать OpenGL выбрать такое имя узора, чтобы нам не требовалось следить за уже использованными именами. Например, так. static GLuint texName; glGenTextures (1, texName); glBindTexture (GL_TEXTURE_2D, texName); В качестве иллюстрации ниже приведен фрагмент кода, в котором получается список из шести неиспользованных имен текстур, одно из которых затем применяется для создания узора.
906 Глава 10. Модели освещения и методы визуализации поверхностей static GLuint texNamesArray [6]; glGenTextures (1, texNamesArray [3]); glBindTexture (GL_TEXTURE_2D, texNamesArray [3]); В OpenGL есть команда запроса, позволяющая определить, используется ли имя текстуры для существующего узора: gllsTexture (texName); Данная функция возвращает значение GL_TRUE, если texName — имя существующе- го узора, в противном случае возвращается значение GL_FALSE. Значение GL_FALSE также возвращается, если texName ~ 0, или если произошла ошибка. ТЕКСТУРНЫЕ ПОДУЗОРЫ OpenGL Когда текстура определена, можно определить другой узор (подузор), позволяющий модифицировать любую часть или весь исходный узор. Текстурные значения в поду- зоре замещают заданные значения исходного узора. Данный процесс обычно эффек- тивнее создания текстуры заново с новыми элементами. Например, приведенная ниже функция задает набор RGBA-кодов, которым заменяется участок двухмерной тексту- ры, не имеющий границы и не являющийся сокращенным вариантом большего узора. glTexSub!mage2D (GL_TEXTURE_2D, 0, xTexElement, yTexElement, GL_RGBA, texSubWidth, texSubHeight, 0, dataFormat, dataType, subSurfTexArray); Параметры xTexElement и yTexElement используются для выбора текстурного элемента с целыми координатами в исходном узоре, где точка (0, 0) относится к тек- стурному элементу в левом нижнем углу узора. Подузор так вставляется в исходный узор, что его левый нижний угол располагается в точке (xTexElement, yTex- Element). Параметры TexSubWidth и TexSubHeight задают размер подузора. Число цветовых элементов в массиве subSurfTexArray для текстурного узора RGBA равно 4 х texSubWidth х texSubHeight. Другие параметры не отличаются от используемых в функции glTexImage, и подобные подузоры можно задать для одно- и трехмерных текстур. СОКРАЩЕННЫЕ ТЕКСТУРНЫЕ УЗОРЫ OpenGL Для объектов с уменьшенными размерами можно использовать процедуры OpenGL при создании ряда сокращенных текстурных узоров, называемых MIP-образами (раз- дел 10.17). Одним из способов создания последовательности сокращенных узоров является многократный вызов функции glTexImage с использованием возрастаю- щих целых значений второго аргумента (“номер уровня”) функции. Для исходного узора номер сокращенного уровня — 0. Сокращенному узору, являющемуся полови-
10.21. Текстурные функции OpenGL 907 ной размера исходного узора, присваивается номер уровня 1, при втором сокращении размера вдвое присваивается номер 2, и так далее при последующих сокращениях. Функция соруТехImage также генерирует сокращенный узор при указании номера уровня 1 или больше. В качестве альтернативного варианта можно указать OpenGL генерировать со- кращенные узоры автоматически. Например, сокращенные узоры RGBA получаются для поверхностной текстуры 16 на 16 с использованием следующей функции GLU. gluBuild2DMipmaps (GL_TEXTURE_2D, GL_RGBA, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, surfTexArray); Данная функция генерирует полный набор из четырех узоров с сокращенными раз- мерами: 8 на 8, 4 на 4, 2 на 2 и 1 на 1. Кроме того, с помощью указанной выше команды можно выбрать сокращение gluBuild2DMipmapLevels (GL_TEXTURE_2D, GL_RGBA, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0, minLevel, maxLevel, surfTexArray); Данная функция создает сокращенные узоры для диапазона номеров уровней, задан- ного параметрами minLevel и maxLevel. В каждом случае строится MIP-образ для текущего текстурного узора, заданного на уровне номер 0. Метод определения цветов пикселей по сокращенным узорам выбирает- ся с использованием функции glTexParameter и символьной константы GL_TEXTURE_MIN_FILTER. Например, в следующей функции задается процеду- ра отображения для двухмерного текстурного узора. glTexParameter (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); Данная функция задает, что процедуры текстурирования должны использо- вать сокращенные узоры, наиболее точно согласующиеся с размером пиксе- ля (MIPMAP_NEAREST). Затем пикселю присваивается цвет ближайшего тек- стурного элемента (GL_NEAREST) в данном сокращенном узоре. С помощью символьной константы GL_LINEAR_MIPMAP_NEAREST задается линейная ком- бинация цветов текстуры из ближайшего сокращенного узора. С помощью GL_NEAREST_MIPMAP_LINEAR (значение по умолчанию) задается средний цвет, вычисляемый по ближайшим элементам текстуры в каждом сокращенном узоре, бли- жайшем к размеру пикселя. Наконец, GL_LINEAR_MIPMAP_LINEAR вычисляет цвет пикселя, используя линейную комбинацию цветов текстуры из набора ближайшего по размеру сокращенного узора.
908 Глава 10. Модели освещения и методы визуализации поверхностей ГРАНИЦЫ ТЕКСТУРЫ OpenGL Когда на объект накладывается несколько текстур или множество копий одной тексту- ры, а цвета пикселей вычисляются методом линейной интерполяции цветов текстур, на краях соседних узоров могут быть заметными эффекты наложения. Этого мож- но избежать, включив в каждый узор границу, причем так, чтобы цвета границы согласовывались с цветами краев текстур соседних узоров. Обозначить цвет границы текстуры можно несколькими способами. Код цвета соседнего узора можно скопировать на границу другого узора, используя функцию glTexSublmage. Другой вариант — прямо указать цвета границы в массиве тексту- ры, заданном с помощью функции glTexImage. Еще одна альтернатива — задать цвет границы, используя процедуру glTexParameter. Например, цвет границы двухмерного узора можно присвоить с помощью команды glTexParameterfv (GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, bordercolor); Здесь параметру borderColor присваивается четырехэлементный набор цветовых компонентов RGBA. По умолчанию цвет границы — черный (0.0, 0.0, 0.0, 0.0). ЗАМЕСТИТЕЛИ ТЕКСТУРЫ В OpenGL В любой функции glTexImage первый элемент можно положить равным символь- ной константе, называемой текстурным представителем (texture proxy). Задача этой константы — хранить определение текстурного узора, пока не будет решено, доста- точно ли ресурсов для обработки данного узора. Для двухмерного узора константа представления равна GL_PROXY_TEXTURE_2D, и подобные константы доступны для линейных и объемных текстурных узоров. После того как текстурный представитель задан, используется функция glGetTexLevelFunction и определяется, примени- мы ли конкретные значения параметров. В качестве примера применения представителя текстуры ниже приведен фраг- мент кода, в котором системе посылается запрос, чтобы определить, можно ли ис- пользовать высоту, заданную для двухмерного узора. GLint texHeight; glTex!mage2D (GL_PROXY_TEXTURE_2D, 0, GL_RGBA12, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glGetTexLevelParameteriv (GL_PROXY_TEXTURE_2D, 0, GL_RGBA12, GL_TEXTURE_HEIGHT, &texHeight); Если система не поддерживает запрошенную высоту узора (в данном слу- чае 16), параметру texHeight присваивается значение 0. В противном слу- чае возвращается запрошенное значение. Аналогично можно формировать запро- сы относительно других параметров узора, используя такие символьные констан- ты, как GL_TEXTURE_WIDTH, GL_TEXTURE_DEPTH, GL_TEXTURE_BORDER и
10.21. Текстурные функции OpenGL 909 GL_TEXTURE_BLUE_SIZE. В каждом случае возврат значения 0 указывает, что за- прошенное значение параметра в функции glTexImage предоставить невозможно. Для данных в формате с плавающей запятой вместо суффикса i используется код f. Даже если для предложенной текстуры был получен положительный ответ, может оказаться, что сохранить узор в памяти невозможно. Это может произойти, если доступная память занята другим узором. АВТОМАТИЧЕСКОЕ ТЕКСТУРИРОВАНИЕ ПОВЕРХНОСТЕЙ ВТОРОГО ПОРЯДКА В OpenGL есть процедуры для автоматической генерации текстурных координат в определенных приложениях. Эта возможность особенно полезна, если трудно непо- средственно определить для объекта координаты поверхности, взамен этого можно использовать функцию GLU для применения этих процедур к поверхностям второго порядка. Чтобы отобразить текстурный узор на поверхность второго порядка, вначале уста- навливаются параметры пространства текстур. Затем вызывается следующая функ- ция, и определяется объект второго порядка, как описано в разделе 8.6. gluQuadricTexture (quadSurfObj, GL_TRUE) Параметр quadSurfObj в этой функции — имя объекта второго порядка. Если тек- стурирование поверхности нужно отключить, символьная константа GL_TRUE заме- няется константой GL_FALSE. ОДНОРОДНЫЕ ТЕКСТУРНЫЕ КООРДИНАТЫ Положение в четырехмерном пространстве текстур задается следующим образом: glTexCoord4* (sCoord, tCoord, rCoord, htexCoord); Текстурные координаты преобразовываются с использованием матрицы 4 на 4 так же, как изменяются координаты сцены: каждая координата делится на однородные параметр (раздел 5.2). Таким образом, значения текстурных координат s, t и г в приведенной выше функции делятся на однородный параметр htex, и получается реальная точка в текстурном пространстве. Однородные координаты в текстурном пространстве полезны, когда на одном дис- плее отображаются множественные перспективные эффекты. Например, перспектив- ная проекция объекта может включать текстурный узор, полученный с помощью дру- гого преобразования перспективного проектирования. Затем текстурный узор можно модифицировать, используя однородные текстурные координаты, чтобы выравнять перспективное изображение текстуры. Отметим, что однородные текстурные коор- динаты позволяют получать множество других эффектов, облегчающих наложение текстур.
910 Глава 10. Модели освещения и методы визуализации поверхностей ДОПОЛНИТЕЛЬНЫЕ ВОЗМОЖНОСТИ ТЕКСТУР OpenGL В OpenGL есть функции для выполнения множества других операций с текстурами. Если получен текстурный узор (с фотографии или из другого источника), размеры ко- торого не представлены степенью 2, OpenGL предлагает функцию для модификации размера узора. В некоторых реализациях OpenGL есть процедуры множественного текстурирования, позволяющие накладывать на объект несколько текстурных узоров. Отображение среды можно имитировать в OpenGL через создание текстурной карты в форме сферической поверхности, а текстурные координаты для сферических узоров можно сгенерировать автоматически. В общем случае объект освещается лучистой энергией, поступающей от излучате- лей света и отражающих поверхностей сцены. Источники света можно смоделировать точечными объектами или же они могут иметь ненулевые размеры. Кроме того, ис- точники света могут быть направленными, и их можно рассматривать как бесконечно удаленные или как локальные источники света. К распространяемому свету обычно применяется радиальное затухание с использованием обратно-квадратической функ- ции расстояния, а прожекторы могут дополнительно иметь угловое затухание. Отра- жающие поверхности на сцене являются непрозрачными, полностью прозрачными или частично прозрачными. Все эффекты освещения описываются через диффузные и зеркальные компоненты отражения и преломления. Интенсивность света в точке поверхности вычисляется с использованием модели освещения, и базовая модель освещения в большинстве графических пакетов исполь- зует упрощенную аппроксимацию законов физики. Данные расчета освещения дают значение каждого RGB-компонента света, отраженного от точки поверхности, и зна- чение интенсивности света, прошедшего через прозрачный объект. Базовая модель освещения обычно объединяет несколько источников света (точечные излучатели), которые могут быть удаленными, локальными источниками или прожекторами. Рас- сеченный свет для сцены описывается фиксированной интенсивностью для каждого RGB-компонента цвета и для всех поверхностей. Интенсивность диффузного отраже- ния с поверхности считается пропорциональной косинусу угла между направлением нормали к поверхности и направлением на источник. Интенсивность зеркального отражения вычисляется с использованием модели Фонга. Кроме того, эффекты про- зрачности обычно аппроксимируются с помощью единственного коэффициента про- зрачности для материала, хотя точные эффекты преломления можно смоделировать, применяя закон Снелла. Эффекты затенения отдельных источников света можно до- бавить, определив области на сцене, невидимые для источника света. Кроме того, рас- четы, необходимые для получения эффектов отражения и пропускания света для по- лупрозрачных материалов обычно не входят в стандартную модель освещения, но их можно смоделировать, используя методы, рассеяния диффузных компонентов света.
10.21. Текстурные функции OpenGL 911 Значения интенсивности, вычисленные с помощью модели освещения, отобра- жаются в уровни интенсивности, доступные в используемой системе. Чтобы предо- ставить набор уровней интенсивности, увеличивающихся с равно ощущаемым изме- нением яркости, в системах используется логарифмическая шкала интенсивностей. Чтобы скомпенсировать нелинейность устройств отображения на экран, к значениям интенсивности применяется гамма-коррекция. На двухуровневых мониторах можно использовать полутоновые узоры и методы добавления псевдослучайного шума для имитации диапазона значений интенсивности. Полутоновые аппроксимации также можно применять для увеличения числа опций интенсивности в системах, позволяю- щих отображаться более двух интенсивностей на пиксель. Для имитации диапазона интенсивностей, если число точек, которые нужно отобразить на сцене, равно числу пикселей на устройстве отображения, используются методы упорядоченного шума, диффузии ошибок и точечной диффузии. Визуализация поверхностей в графических пакетах выполняется посредством применения расчетов из стандартной модели освещения к процедурам строк раз- вертки, экстраполирующим значения интенсивностей нескольких точек поверхности на все спроектированные на поверхность положения пикселей. При визуализации поверхностей постоянной интенсивности, также называемой плоской визуализаци- ей, для отображения всех точек поверхности используется один рассчитанный цвет. Плоская визуализация поверхности точна для многогранников или многоугольных сеток, аппроксимирующих криволинейные поверхности, если точка наблюдения и ис- точник света находятся далеко от объектов сцены. При визуализации поверхности по Гуро отражение света от мозаичной криволинейной поверхности аппроксимируется путем расчета значений интенсивности в вершинах многоугольника с последующей линейной интерполяцией этих значений по многоугольным граням. Более точной, но и более медленной процедурой визуализации поверхности является визуализа- ция поверхности по Фонгу, при которой интерполируются средние векторы нормали для вершин многоугольников по многоугольным граням. Затем вызывается базовая модель освещения для расчета интенсивностей поверхности в каждой спроектиро- ванной точке поверхности с использованием интерполированных значений векторов нормали к поверхности. В быстрой визуализации поверхности по Фонгу с целью сокращения времени обработки при расчете интенсивности используется разложение в ряд Тейлора. Для получения глобальных эффектов зеркального отражения и пропускания ис- пользуется построение хода лучей по сцене к положениям пикселей. Лучи пикселей отслеживаются по сцене, отражаясь от объектов, а вклады, которые они дают в интен- сивность, накапливаются. Для каждого пикселя строится дерево хода луча, и значения интенсивностей объединяются от заключительных узлов дерева к его корню. Вычис- ления пересечения лучей с объектами можно сократить, используя методы деления пространства, проверяющие возможность пересечения лучом объекта только в подоб-
912 Глава 10. Модели освещения и методы визуализации поверхностей ластях общего пространства. Распределенное построение хода лучей подразумевает использование нескольких лучей на пиксель, случайно присваиваемых таким различ- ным параметрам луча, как направление и время. Это позволяет точно смоделировать глянец и полупрозрачность поверхности, конечную апертуру камеры, неточечные ис- точники света, эффекты затенения и размытость, вызванную движением. Методы диффузного отражения обеспечивают точное моделирование эффектов диффузного отражения, рассчитывая лучевую энергию, переданную между различ- ными участками поверхностей на сцене. Для ускорения расчета диффузного отраже- ния используется прогрессивное уточнение — за раз рассчитывается передача энергии от одного участка поверхности. Крайне фотореалистичные сцены генерируются с ис- пользованием комбинации построения хода лучей и методов диффузного отражения. Быстрым методом аппроксимации глобальных эффектов освещения является отображение среды, когда для хранения информации о фоновом освещении сцены используется массив среды. Затем при данном направлении наблюдения этот массив отображается на объекты сцен. На сложных сценах точную и эффективную модель глобального освещения дает отображение фотонов. В этой модели генерируются случайные лучи, исходящие от источников света, а эффекты освещения для каждого луча хранятся в карте фотонов, которая отделяет информацию об освещении от геометрии сцены. Точность передачи эффектов освещения улучшается при увеличении числа лучей. Для добавления поверхностных деталей к объектам можно использовать мно- гоугольные грани, наложение текстуры, отображение шероховатости или отображе- ния кадра, когда небольшие многоугольные грани могут накладываться на большие поверхности. В качестве альтернативного варианта текстурные узоры можно опреде- лить в одно-, двух- и трехмерном пространствах, что позволяет накладывать текстуры на линию, поверхность или объем пространства. В процедурном наложении тексту- ры используются функции для расчета изменений в эффектах освещения объектов. Отображение шероховатости является средством моделирования нерегулярного пове- дения поверхности через возмущение векторов нормали к поверхности. Отображение кадра — это расширение отображения шероховатости, которое можно использовать для моделирования характеристик анизотропных материалов через разрешение вер- тикальных и горизонтальных вариаций поверхности. Корневая библиотека OpenGL содержит обширный набор функций настройки точечных источников света, задания различных параметров в базовой модели осве- щения, выбора метода визуализации поверхностей, активизации процедур полутоно- вой аппроксимации и применения к объектам узоров из массива текстуры. Резюме по данным функциям освещения, визуализации поверхностей и наложения текстуры предлагается в табл. 10.2 и 10.3.
10.21. Текстурные функции OpenGL 913 ТАБЛИЦА 10.2. Резюме по функциям OpenGL освещения и визуализации поверхностей Функция Описание glLight Задает значение свойства источника света glEnable (lightName) Активизирует источник света glLightModel Задет значения параметра глобального освещения glMaterial Задает значение параметра оптической поверхности glFog Задает значение параметра атмосферы; активизи- рует атмосферные эффекты при вызове функции glEnable glColor4f (R, G, B, A) Задает альфа-фактор для поверхности, чтобы сымитировать прозрачность. В функции glBlendFunc альфа-фактор источника устанавливается равным GL_SRC_ALPHA, а альфа-фактор цели — равным GL_ONE_MINUS_SRC_ALPHA glShadeModel Задает использование визуализации поверхно- стей по Гуро или одноцветную визуализацию поверхностей glNormal3 Задает вектор нормали к поверхности glEnable (GL_NORMALIZE) Устанавливает, что нормали к поверхностям долж- ны преобразовываться в единичные векторы glEnableClientState Активизирует процедуры обработки для массива (GL_NORMAL_ARRAY) векторов нормали к поверхности glNormalPointer Создает список векторов нормали к поверхности, которые будут использоваться с массивом вершин glEnable (GL_DITHER) Активизирует операции применения визуализа- ции поверхностей как шаблоны полутоновой ап- проксимации
914 Глава 10. Модели освещения и методы визуализации поверхностей ТАБЛИЦА 10.3. Резюме по функциям наложения текстуры OpenGL Функция Описание glTexImagelD Задает параметры для настройки одномерного текстурного пространства. (Активизирует текстурирование при вызове команды glEnable) glTex!mage2D Задает параметры для настройки двухмерного текстурного пространства glTexImage3D Задает параметры для настройки трехмерного текстурного пространства glTexParameter glTexCoord Задает параметры для процедур наложения текстуры Задает значение для текстурной координаты в одно-, двух-, трех- или четырехмерном текстурном пространстве glTexEnv Задает параметры текстурной среды, такие как цвет сме- шивания для наложения текстуры glCopyTexImage Копирует блок цветов пикселей из буфера кадров для ис- пользования в качестве текстурного узора. glCopyTexSublmage Копирует блок цветов пикселей из буфера кадров для ис- пользования в качестве текстурного подузора glTexCoordPointer Задает текстурные координаты в списке, который соотно- сится со списком вершин glBindTexture Присваивает текстурному узору имя; также используется для активизации именованного узора glDeleteTextures glGenTextures gllsTexture Удаляет список именованных текстур Автоматически генерирует имена текстур Команда запроса, позволяющая определить, существует ли именованная текстура glTexSublmage gluBuild* Mipmaps Создает текстурный подузор Автоматическая генерация сокращенных текстурных узо- ров для одномерного, двухмерного или трехмерного тек- стурного пространства gluBuild* MipmapLevels Автоматическая генерация сокращенных текстурных узо- ров заданного уровня для одно-, двух- или трехмерного текстурного пространства glGetTexLevel Parameter Запрос к системе, позволяющий определить, поддержива- ется ли указанное значение параметра текстуры gluQuadricTexture Активизирует или деактивизирует текстурирование для по- верхности второго порядка
Упражнения 915 ЛИТЕРАТУРА Базовые модели освещения и методы визуализации поверхностей рассмотрены в работах [3, 23, 24, 104, 135, 240, 257]. Алгоритмы реализации моделей освещения и методов визуализации пред- ставлены в сборниках [8, 122, 151, 176, 244, 297]. Методы построения полутоновых изображений изложены в статье [368]. Дальнейшую информацию по упорядоченному шуму, диффузии ошибок и точечной диффузии можно почерпнуть из книги [178]. Процедуры построения хода лучей обсуждаются в работах [4, 7, 60, 120, 169, 180, 274, 316, 317, 387]. Алгоритмы реализации методов диффузного отражения можно найти в статьях [53, 56-58, 83, 132, 147, 193, 305, 323, 324, 371]. Алгоритм отображения фотонов подробно рассмотрен в публи- кации [163]. Методы наложения текстур и применение текстур обсуждаются в работах [77, 311, 393]. Общее обсуждение распространения энергии, уравнений переноса, процессов визуализации и человеческого восприятия света и цвета приводится в книге [124]. Дополнительные примеры программирования с использованием функций освещения и визу- ализации OpenGL представлены в пособии [400]. Примеры программирования с использованием функций освещения, визуализации и текстурирования также приводятся на Web-сайте Нейта Робин- са (Mate Robins): http://www.cs.utah.edu/~narobins/opengl.html. Полный перечень функций освещения и визуализации OpenGL можно найти в справочнике [320]. УПРАЖНЕНИЯ 10.1. Напишите процедуру реализации уравнения (10.12) для диффузного отражения с использо- ванием одного точечного источника света и визуализации плоской поверхности для граней тетраэдра. Описание объекта нужно подать в таблицах многоугольников, включая векторы нормалей к поверхности для всех граней многоугольника. Дополнительные входные пара- метры включают фоновую интенсивность, интенсивность источника света и коэффициенты отражения поверхности. Вся координатная информация должна задаваться прямо в системе наблюдения. 10.2. Так модифицируйте программу из упражнения 10.1, чтобы она визуализировала многоуголь- ные грани мозаичной сферической поверхности. 10.3. Так модифицируйте программу из упражнения 10.2, чтобы она отображала сферическую поверхность с использованием визуализации по Гуро. 10.4. Так модифицируйте программу из упражнения 10.3, чтобы она отображала сферическую поверхность с использованием визуализации поверхностей по Фонгу. 10.5. Напишите процедуру реализации уравнения (10.17) для различных диффузных и зеркальных отражений с использованием одного точечного источника света и визуализации поверхно- стей по Гуро для многоугольных граней мозаичной сферической поверхности. Описание объекта должно предлагаться в таблицах многоугольников, включая векторы нормали к по- верхности для всех многоугольных граней. Дополнительный вход включает интенсивность фонового освещения, интенсивность источника света, коэффициенты отражения поверхно- сти и параметр зеркального отражения. Вся координатная информация должна задаваться прямо в системе наблюдения. 10.6. Модифицируйте процедуру из предыдущего упражнения, чтобы она отображала многоуголь- ные i-рани с использованием визуализации поверхностей по Фонгу. 10.7. Модифицируйте процедуру из предыдущего упражнения, чтобы она включала функцию линейного затухания интенсивности.
916 Глава 10. Модели освещения и методы визуализации поверхностей 10.8. Модифицируйте процедуру из предыдущего упражнения, чтобы она включала два источника света на сцене. 10.9. Модифицируйте процедуру из предыдущего упражнения, чтобы сферическая поверхность наблюдалась через оконное стекло. 10.10. Обсудите отличия, которые стоит ожидать при наблюдении зеркального отражения, смоде- лированного с помощью (N • Н)Па, по сравнению с (V • R)”s. 10.11. Докажите, что 2а = ф на рис. 10.22, если векторы компланарны, но в общем случае 2а / ф. 10.12. Обсудите, как различные методы детектирования невидимых поверхностей можно объеди- нить с моделью интенсивности для отображения набора многогранников с непрозрачными поверхностями. 10.13. Обсудите, как различные методы детектирования видимых поверхностей можно модифици- ровать для обработки прозрачных объектов. Существует ли вообще метод детектирования видимых поверхностей, не позволяющий обрабатывать прозрачные поверхности? 10.14. Напишите алгоритм, основанный на одном методе детектирования видимых поверхностей, который определит затененные области на сцене, освещаемой удаленным источником света. 10.15. Сколько уровней интенсивности можно отобразить с помощью полутоновой аппроксима- ции с использованием сетки п на п пикселей, где каждый пиксель можно отобразить с т различными интенсивностями? 10.16. Сколько различных комбинаций цветов можно сгенерировать, используя полутоновые ап- проксимации в двухуровневой системе RGB с сеткой 3 на 3 пикселя? 10.17. Напишите процедуру отображения данного набора изменений интенсивности поверхности с использованием полутоновых аппроксимаций с сеткой 3 на 3 пикселя и двумя уровнями интенсивности (0 и 1) на пиксель. 10.18. Напишите процедуру генерации матриц упорядоченного шума с использованием рекуррент- ных соотношений из уравнения (10.48). 10.19. Напишите процедуру отображения данного массива значений интенсивности с использова- нием метода упорядоченного шума. 10.20. Напишите процедуру реализации алгоритма диффузии ошибок для данного массива т на п значений интенсивности. 10.21. Напишите программу реализации базового алгоритма построения хода лучей для сцены, содержащей одну сферу, описанную вокруг шахматной доски. Сцена должна освещаться одним источником света, расположенным в точке наблюдения. 10.22. Напишите программу реализации базового алгоритма построения хода лучей для сцены с любым заданным расположением сфер и многоугольных поверхностей, освещенной данным набором точечных излучателей. 10.23. Напишите программу реализации базового алгоритма построения хода лучей с использова- нием метода деления пространства для любого заданного расположения сфер и многоуголь- ных поверхностей, освещенного данным набором точечных излучателей. 10.24. Напишите программу реализации следующих вариантов распределенного построения хода лучей: дискретизация пикселя с помощью 16 дрожащих лучей на пиксель, распределенные направления отражения (глянец), распределенные направления преломления (полупрозрач- ность) и неточечные излучатели. 10.25. Напишите алгоритм моделирования размытости, вызванной движением объекта, с исполь- зованием распределенного построения хода лучей.
Упражнения 917 10.26. Реализуйте базовый алгоритм диффузного отражения для визуализации внутренних поверх- ностей прямоугольника, если одна внутренняя грань прямоугольника является источником света. 10.27. Предложите алгоритм реализации метода диффузного отражения с прогрессивным уточне- нием. 10.28. Напишите процедуру преобразования карты среды в поверхность сферы. 10.29. Напишите программу отображения данного текстурного узора на любую грань куба. 10.30. Модифицируйте программу из предыдущего упражнения, чтобы узор отображался на одну грань тетраэдра. 10.31. Модифицируйте программу из предыдущего упражнения, чтобы узор отображался в задан- ную область сферической поверхности. 10.32. Напишите программу отображения данного одномерного текстурного узора на заданную грань куба в виде диагональной полоски. 10.33. Модифицируйте программу из предыдущего упражнения, чтобы одномерная текстура отоб- ражалась на поверхность сферы при двух заданных точках сферы. 10.34. Для данной сферической поверхности напишите программу отображения шероховатости для имитации шишковидной поверхности апельсина. 10.35. Напишите процедуру отображения шероховатости для получения колебаний нормали к по- верхности для любой заданной функции возмущений. 10.36. Напишите программу OpenGL для отображения сцены, содержащей сферу и тетраэдр, осве- щаемую двумя источниками света: один — локальный красный источник, другой — уда- ленный белый источник. Задайте параметры поверхности для диффузного и зеркального отражения с помощью визуализации по Гуро и примените квадратную функцию затухания интенсивности. 10.37. Модифицируйте программу из предыдущего упражнения, заменив локальный красный ис- точник света двумя прожекторами, красным и синим. 10.38. Модифицируйте программу из предыдущего упражнения, добавив на сцену дымную атмо- сферу. 10.39. Модифицируйте программу из предыдущего упражнения, чтобы сцена наблюдалась через полупрозрачное оконное стекло. 10.40. Напишите полную программу OpenGL, отображающую набор диагональных линий с ис- пользованием одномерных текстурных узоров, показанных на рис. 10.114. 10.41 Используя двухмерный текстурный узор OpenGL, напишите программу, отображающую черно-белую шахматную доску на синем фоне. 10.42. Модифицируйте программу из предыдущего упражнения, чтобы шахматная доска имела красные и синие квадраты, а фон был белым. 10.43. Используя двухмерный текстурный узор OpenGL, напишите программу отображения бело- го прямоугольника с набором равноотстоящих диагональных красных полосок. Цвет фона сделайте синим. 10.44. Модифицируйте программу из предыдущего упражнения, отобразив текстурный узор на поверхность сферы. 10.45. Модифицируйте программу из предыдущего упражнения, отобразив текстурный узор на поверхность чайника GLUT.
Методы интерактивного ввода и графические интерфейсы пользователя Интерактивный ввод в среде виртуальной реальности NCSA CAVE, сформированной тремя вертикальными стенами, полом, потолком и системой стереоскопической проекции (перепечатано с разрешения Национального центра суперкомпьютерных приложений, Иллинойский университет в Урбана-Шампейн)
11.1. Графические входные данные 11.6. Функции устройств интерактивного 11.2. Логическая классификация устройств ввода OpenGL ввода 11.7. Функции меню OpenGL 11.3. Функции ввода графических данных 11.8. Разработка графического 11.4. Интерактивные технологии построения пользовательского интерфейса изображений 11.9. Резюме 11.5. Среды виртуальной реальности Иля того чтобы писать программы и предоставлять входные данные, можно использовать методы и программные команды, рассмотренные в предыдущих главах, однако часто бывает полезно задавать графический вход интерактивно. Во время выполнения программы, например, может потребоваться изменить точку наблюдения или положение объекта на сцене, указав точку на экране, или изменить параметры анимации, используя альтернативную ко- манду меню. В приложениях разработки координаты контрольных точек для постро- ения сплайнов выбираются интерактивно, а в живописи часто применяются методы интерактивного рисования. Существует несколько типов данных, используемых гра- фической программой, и множество методов интерактивного ввода, предназначенных для обработки этих значений данных. Кроме того, в настоящее время интерфейсы си- стем включают расширенные интерактивные изображения, которые содержат окна, пиктограммы, меню и предполагают использование мыши или другого устройства управления курсором. 11.1. ГРАФИЧЕСКИЕ ВХОДНЫЕ ДАННЫЕ В графических программах используется несколько типов входных данных, напри- мер, координаты, значения атрибутов, спецификации строк знаков, значения геомет- рических преобразований, условия наблюдения и параметры освещения. Многие гра- фические пакеты, включая стандарты ISO и ANSI, предлагают расширенный набор функций ввода, предназначенных для обработки подобных данных. При этом проце- дуры ввода требуют взаимодействия с программами управления окнами и специфиче- скими аппаратными устройствами. Следовательно, некоторые графические системы,
920 Глава 11. Методы интерактивного ввода и графические интерфейсы... особенно предлагающие аппаратно-независимые функции, часто включают относи- тельно мало интерактивных процедур обработки входных данных. Стандартный подход к процедурам ввода в графических пакетах — это класси- фицировать функции согласно типу данных, которые будут обрабатываться каждой функцией. Данная схема позволяет с любого физического устройства, такого как кла- виатура или мышь, вводить данные любого класса, хотя почти все устройства ввода работают с некоторыми типами данных лучше, чем с другими. 11.2. ЛОГИЧЕСКАЯ КЛАССИФИКАЦИЯ УСТРОЙСТВ ВВОДА При классификации функций ввода согласно типу данных любое устройство, исполь- зуемое для ввода заданных данных, называется логическим устройством ввода для данных этого типа. Стандартная классификация логических устройств по входным данным приведена ниже. LOCATOR STROKE STRING VALUATOR CHOICE PICK Устройство ввода одной точки. Устройство ввода набора точек. Устройство ввода строк. Устройство ввода скалярного значения. Устройство выбора опции из меню. Устройство выбора компонента изображения. УСТРОЙСТВА ВВОДА КООРДИНАТЫ (LOCATOR) Интерактивный выбор координаты обычно сопровождается размещением курсора в некоторой точке отображаемой сцены, хотя в определенных приложениях могут ис- пользоваться и другие методы, например, выбор опции из меню. Для размещения курсора на экране можно использовать мышь, джойстик, трекбол, спейсбол (про- странственный манипулятор), координатный манипулятор (thumbwheel), наборный диск (dial), ручной курсор или цифровое перо. Кроме того, указать условия обра- ботки для выбранного положения можно с помощью различных клавиш, кнопок или переключателей. Клавиатуры используются для ввода координат по-разному. Универсальная кла- виатура обычно имеет четыре клавиши управления курсором, которые перемещают курсор вверх, вниз, влево и вправо. При наличии дополнительных четырех клавиш курсор также можно перемещать по диагонали. Для быстрого перемещения курсора выбранная клавиша удерживается в течение необходимого времени. Иногда клавиату- ра содержит джойстик, джойдиск (joydisk), трекбол или координатный манипулятор для размещения курсора на экране. В некоторых приложениях бывает удобно исполь-
11.2. Логическая классификация устройств ввода 921 зовать клавиатуру для набора различных значений или других кодов, указывающих координаты. Для интерактивного ввода координат можно применить такое устройство, как све- товое перо. Однако световое перо записывает положение точки на экране, детектируя свет от люминофоров экрана, и это требует специальных процедур реализации. УСТРОЙСТВА ВВОДА НАБОРА КООРДИНАТ Данный класс логических устройств используется для ввода последовательности ко- ординат, и в таком качестве могут использоваться физические устройства, названные в предыдущем разделе. Непрерывное движение мыши, трекбола, джойстика или кур- сора преобразуется в ряд входных координат. Одним из наиболее распространенных устройств ввода координат является графический планшет. Чтобы перевести планшет в “непрерывный” режим, его можно активизировать нажатием клавиши. Затем при движении курсора по поверхности планшета генерируется поток координат. Данная процедура используется в системах рисования (paintbrush systems) для получения мазков кистью. Кроме того, этот процесс применяется в технических системах для отслеживания и оцифровки схем. УСТРОЙСТВА ВВОДА СТРОК Основным физическим устройством, используемым для ввода строк, является клави- атура. В приложениях компьютерной графики строки символов обычно используются для пометок на рисунках или графиках. Для генерации палитр символов в специальных приложениях могут использовать- ся и другие физические устройства. Отдельные символы можно изобразить на экране с помощью устройств ввода координат. Затем символ интерпретируется программой распознавания шаблонов, идентифицирующей символы на основе хранящегося в па- мяти словаря предопределенных шаблонов. УСТРОЙСТВА ВВОДА СКАЛЯРНЫХ ЗНАЧЕНИЙ Ввод чисел в графическую программу требуется при задании скалярных значений геометрических преобразований, параметров наблюдения и освещения. В некоторых приложениях скалярный вход также используется для установки физических пара- метров, таких как температура, напряжение или параметры упругости. Типичным физическим устройством, используемым для ввода чисел, является панель наборных дисков. Диски калибруются так, чтобы они давали численные зна- чения из некоторого предопределенного диапазона. Затем вращательные потенцио- метры преобразуют вращение диска в соответствующее напряжение, которое далее будет переведено в число из заданного скалярного диапазона, например, от -10,5 до
922 Глава 11. Методы интерактивного ввода и графические интерфейсы... Рис. 11.1. Графическое представление входа устройства ввода скалярных значений. На изображении показаны ползунок и координатный манипулятор, необходимые для выбора значений скалярных параметров И и s2 суперэллипса, RGB-компонентов, углов враще- ния и параметров масштабирования. Альтернативный вариант — разместить небольшую окружность на цветовом круге для одновременного выбора трех RGB-компонентов. Для небольшого изменения выбранного скалярного значения можно также использовать кла- виши клавиатуры с изображением стрелок 25, 5. Вместо дисков для преобразования линейного движения в скалярные значения иногда применяются ползунковые потенциометры. В качестве устройства ввода скалярных значений можно использовать любую кла- виатуру с набором цифровых клавиш, хотя для быстрого ввода диски и ползунковые потенциометры эффективнее. Для ввода числовых значений можно адаптировать джойстики, трекболы, план- шеты и другие интерактивные устройства, интерпретируя давление или движение устройства в пределах скалярного диапазона. Для одного направления движения, ска- жем, слева направо, можно вводить увеличивающиеся скалярные значения. Движение в противоположном направлении уменьшает скалярное входное значение. Выбранные значения обычно дублируются на экране для контроля. Другим методом ввода чисел является отображение на мониторе графических представлений ползунков, кнопок, вращающихся масштабных линеек и меню. Неко- торые возможные представления средств изменения масштаба иллюстрируются на рис. 11.1. Перемещая курсор с помощью мыши, джойстика, спейсбола или другого устройства, можно выбирать значение по одной из шкал. Для обеспечения обратной связи с пользователем выбранные цвета отображаются в контрольных цветных поло- сах, а в маленьком окне рядом с каждой шкалой указывается выбранное скалярное значение.
11.2. Логическая классификация устройств ввода 923 УСТРОЙСТВА ВЫБОРА В графических программах для выбора условий обработки, значений параметров и форм объектов, которые будут использованы при построении изображения, обыч- но применяется меню. В число распространенных устройств выбора входят такие устройства позиционирования курсора, как мышь, трекбол, клавиатура, сенсорная панель или поля клавиш. Для выбора пункта из меню часто используются функциональные клавиши кла- виатуры или отдельные поля кнопок. Каждая кнопка или функциональная клавиша программируется так, чтобы нажатие на нее вызывало определенную операцию или ввод значения, хотя в некоторых устройствах ввода есть клавиши или кнопки с пред- определенными функциями. Для выбора из перечисленных на экране пунктов меню используется устройство управления курсором. Если выбрано положение курсора (х, у), оно сравнивается с границами в координатном пространстве всех обозначенных пунктов меню. Пункт меню с вертикальными и горизонтальными границами хга;п, хгаах, ут;п и утах вы- бирается, если координаты ввода удовлетворяют неравенствам ^min < % < ^тах, Утт — У < Утах- (111) Для больших меню с относительно небольшим числом отображенных пунктов широ- ко используется сенсорная панель. Выбранная точка на экране сравнивается с коор- динатными границами отдельных пунктов меню, на основе чего определяется, какой процесс будет выполнен. Альтернативные методы выбора входа включают ввод с клавиатуры и голосовой ввод. Для набора команд или пунктов меню может использоваться стандартная клави- атура. При таком методе выбора входа полезен некоторый сокращенный формат. По- зиции меню можно пронумеровать или присвоить короткие имена-идентификаторы. Аналогичную схему кодирования можно использовать в системах голосового ввода, который особенно полезен при небольшом числе альтернатив (20 или меньше). УКАЗКИ Указка используется для выбора части сцены, которая будет преобразовываться или редактироваться. Выбрать компоненты отображенной сцены можно с помощью нескольких различных методов, и любые устройства, позволяющие это сделать, отно- сятся к указкам. Довольно часто для выбора ориентации указки используется курсор. С помощью мыши, джойстика или клавиатуры, например, можно навести указку на нужную точку и нажать клавишу или кнопку для записи координат пикселя. Данную точку теперь можно использовать для выбора всего объекта, грани мозаичной поверх- ности, стороны или вершины многоугольника. В число других методов выбора входят схемы подсветки, выбор объектов по названию или комбинация иных подходов.
924 Глава 11. Методы интерактивного ввода и графические интерфейсы... Рис. 11.2. Расстояния от положения указки до отрезков Используя устройство размещения курсора, можно отобразить указанную точку экрана в точку в глобальных координатах с помощью геометрических преобразо- ваний и преобразований точки наблюдения, заданных для этой сцены. Затем гло- бальные координаты точки можно сравнить с координатами границ объектов. Если указка находится в пределах границ одного объекта, объект, выбранный с ее помо- щью, идентифицирован. Далее можно использовать название, координаты или дру- гую информацию об объекте и применить желаемое преобразование или выполнить необходимое редактирование. Однако, если положение указки находится на границе нескольких объектов, необходимы дополнительные проверки. В зависимости от типа выбираемого объекта и сложности сцены может потребоваться несколько уровней поиска для идентификации объекта, выбранного с помощью указки. Например, если мы пытаемся указать на сферу, которая в координатном пространстве накладывается на некоторый трехмерный объект, положение указки можно сравнивать с коорди- натами отдельных граней поверхностей двух объектов. Если эта проверка не даст результатов, можно проверять границы отдельных отрезков. Если проверки границ не позволяют однозначно определить выбранный объект, можно вычислить расстояние от указки до отдельных отрезков. На рис. 11.2 ил- люстрируется указка, расположенная возле границ двух отрезков. Для двухмерного отрезка с координатами конечных пикселей (a;i,yi) и (.Т2,У2) квадрат расстояния по перпендикуляру от положения указки (х, у) до отрезка вычисляется следующим образом: .2 _ [Д^(а/ — т/i) — Дт/(л; — rri)]2 Да;2 + Ду2 ’ U } где Да; = .Т2 — и Ду — У2~У1- Чтобы упростить операцию выбора отрезка, были предложены другие методы, такие как сравнение расстояний до конечных точек. Выбор с помощью указки можно упростить, если не выполнять проверку границ для граней поверхностей и отрезков объекта. Если указка находится внутри границ нескольких объектов, процедура выбора с помощью указки может просто возвращать список всех возможных выбранных объектов.
11.2. Логическая классификация устройств ввода 925 h Рис. 11.3. Окно выбора с координатами центра (хр,ур), шириной w и высотой h Другой метод выбора с помощью указки заключается в том, что с выбранным по- ложением курсора соотносится окно выбора (pick window). Окно выделения центри- ровано в месте расположения курсора, как показано на рис. 11.3, и, чтобы определить, какие объекты пересекают границы окна, используются процедуры отсечения. Для выбора линий размеры окна w и h можно сделать столь малыми, что границы окна будет пересекать только один отрезок. В некоторых графических пакетах реализован трехмерный выбор, для чего сцена перестраивается с преобразованием точки наблю- дения и проектирования, а в качестве окна отсечения используется окно выбора. При такой перестройке на экране не отображается ничего, но применяются проце- дуры отсечения, позволяющие определить, какие объекты находятся в отображаемом объеме, выделенном с помощью указки. Для каждого объекта в этом объеме может затем в форме списка выдаваться информация о дальнейшей обработке. В данный список включается такая информация, как название объекта и карта глубин, причем информация о глубине может использоваться для выделения ближайшего объекта в выбранном отображаемом объеме. Облегчить выбор позволяет подсветка. Чтобы это реализовать, например, мож- но последовательно подсвечивать те объекты, границы которых накладываются на положение указки (или окно выбора). Во время подсветки объекта пользователь, ис- пользуя клавиатуру, “принимает” или “отклоняет” его. Это продолжается до тех пор, пока пользователь не примет подсвеченный объект в качестве выбранного объекта. Другой вариант — просто последовательно подсвечивать все объекты на сцене, не выбирая положение курсора. Последовательность подсветки инициализируется на- жатием кнопки или функциональной клавиши, а с помощью второй кнопки можно остановить процесс в момент, когда подсвечен желаемый объект. Если при такой схеме придется перебирать множество объектов, для ускорения процесса подсветки используются дополнительные клавиши или кнопки. Одна кнопка инициирует быст- рую последовательную подсветку структур, вторая — останавливает процесс, а третья используется для медленного возврата по последовательности подсвеченных объек- тов. В завершение можно нажать клавишу остановки и закончить процедуру выбора с помощью указки.
926 Глава 11. Методы интерактивного ввода и графические интерфейсы... Если компоненты изображения допускается выбирать по названию, с этой целью используется клавиатура. Этот метод прямой, но менее интерактивный, чем дру- гие методы выбора с помощью указки. Некоторые графические пакеты позволяют называть компоненты изображения на различных уровнях вплоть до отдельных при- митивов. Чтобы облегчить выбор, можно использовать описательные имена, однако отметим, что данный подход имеет и недостатки — обычно он медленнее интерак- тивного выбора на экране, и пользователю обычно нужны запросы, чтобы запомнить имена различных структур. 11.3. ФУНКЦИИ ВВОДА ГРАФИЧЕСКИХ ДАННЫХ Графические пакеты, использующие логическую классификацию устройств ввода, предлагают несколько функций выбора устройств и классов данных. Данные функции позволяют пользователю задать следующие альтернативы. Режим входного взаимодействия для графических программ и устройств ввода. Элемент данных может инициировать программа, устройство, или же они могут работать одновременно. Выбор физического устройства, которое будет обеспечивать ввод согласно опре- деленной логической классификации (например, планшет, используемый как устройство ввода набора точек). Выбор времени ввода и устройства для определенного набора элементов данных. РЕЖИМЫ ВВОДА Для определения взаимодействия программы и устройств ввода в интерактивной гра- фической системе используются различные функции. Программа запрашивает ввод в определенное время при обработке (режим запроса), устройство ввода независимо предоставляет обновленный вход (дискретный режим), или устройство независимо записывает все собранные данные (режим событий). В режиме запроса ввод данных инициирует программа-приложение. Если запра- шиваются входные значения, обработка приостанавливается, пока все запрошенные данные не будут получены. Данный режим соответствует типичной операции ввода в обычном языке программирования. Программа и устройства ввода работают попе- ременно. Устройства переводятся в режим ожидания, пока не будет сделан запрос ввода; далее программа ожидает, пока не будут доставлены данные.
11.3. Функции ввода графических данных 927 В дискретном режиме программа-приложение и устройства ввода работают независимо. Устройства ввода могут работать тогда же, когда программа обраба- тывает другие данные. Новые значения, полученные с устройств ввода, заменяют предыдущие входные значения. Когда программе требуются новые данные, она вы- бирает текущие значения, полученные с помощью устройств и записанные в память. В режиме событий ввод данных в программу-приложение инициируют устрой- ства ввода. Программа и устройства снова работают одновременно, но теперь устрой- ства ввода поставляют данные в очередь ввода, также называемую очередью событий. Все входные данные записываются. Когда программе требуются новые данные, она обращается к очереди данных. Обычно в дискретном режиме и режиме событий может одновременно работать любое число устройств, причем некоторые устройства могут работать в дискретном режиме, тогда как другие — в режиме событий. Однако в режиме запроса в любой момент времени вход может поставлять только одно устройство. Чтобы задать физические устройства для логических классов данных, использу- ются функции из библиотеки ввода. Процедуры ввода в интерактивном пакете могут включать сложную обработку некоторых типов. Например, чтобы получить точку с глобальными координатами, процедура ввода должна обработать входное положение на экране и с его помощью (через преобразования точки наблюдения и т.п.) вер- нуться к исходному описанию сцены. Кроме того, данная обработка также включает использование информации от процедур организации окон на экране дисплея. ОБРАТНАЯ СВЯЗЬ С ДУБЛИРОВАНИЕМ В программе интерактивного ввода обычно можно выполнять запросы и получать входные данные, дублирующиеся на экране вместе с параметрами, связанными с эти- ми запросами или данными. Если это предусмотрено, необходимая информация отоб- ражается в заданной области на экране. Подобная обратная связь может включать, например, информацию о размере окна выбора и минимальном расстоянии выбора, типе и размере курсора, подсветки, используемой в операциях выбора, диапазоне (ми- нимальном и максимальном значении) и разрешении (масштабе) устройства ввода. ФУНКЦИИ ОБРАТНОГО ВЫЗОВА Для аппаратно-независимых графических устройств во вспомогательной библиотеке можно предоставить ограниченный набор функций ввода. В таких случаях процедуры ввода организуются как функции обратного вызова (callback functions) (раздел 2.9), взаимодействующие с программным обеспечением системы. Эти функции задают, какие действия должна предпринять программа при наступлении события ввода. Типичными событиями ввода являются движение мыши, щелчок ею или нажатие клавиши на клавиатуре.
928 Глава 11. Методы интерактивного ввода и графические интерфейсы... 11.4. ИНТЕРАКТИВНЫЕ ТЕХНОЛОГИИ ПОСТРОЕНИЯ ИЗОБРАЖЕНИЙ В графический пакет часто внедряется множество интерактивных методов, помога- ющих строить изображения. Могут предлагаться процедуры размещения объектов, наложения условий, изменения размеров объектов и разработки форм и узоров. ОСНОВНЫЕ МЕТОДЫ РАЗМЕЩЕНИЯ Интерактивно выбрать точку можно с помощью координатно-указательного устрой- ства, записывающего положение на экране. Как эта точка будет использоваться — зависит от выбранной опции обработки. Точка может быть конечной точкой нового сегмента прямой или применяться для размещения некоторого объекта. Например, выбранная точка может быть новым положением центра сферы или же использовать- ся для выбора положения для ввода строки текста, которая должна начинаться или центрироваться в этой точке. Чтобы помочь расположить точку, ее координаты могут дублироваться на экране. Имея указанные координаты, пользователь может интерак- тивно изменять их, используя наборные диски, клавиши управления курсором или другие устройства. ПЕРЕТАСКИВАНИЕ Другим методом интерактивного размещения объектов является выбор объекта и пе- ретаскивание его в новую точку. Используя мышь, например, можно навести курсор на объект, нажать на кнопку мыши, навести курсор на другую точку и отпустить кноп- ку. После этого объект отображается в новом положении. Как правило, при переме- щении курсора по экрану объект также отображается в промежуточных положениях. УСЛОВИЯ Любая процедура изменения значений входных координат с целью получения опре- деленной ориентации или направления объекта называется ограничением, условием или связью. Например, входной сегмент линии можно ограничить горизонтальным или вертикальным положением, как показано на рис. 11.4 и 11.5. Чтобы реализовать этот тип связей, в двух конечных точках сравниваются пары входных координат. Если разность значений у двух конечных точек меньше разности значений х, изображает- ся горизонтальная линия. В противном случае рисуется вертикальная линия. Условия типа “горизонтальный” или “вертикальный” полезны, например, при формировании схем расположения сети дорог, и они устраняют необходимость в точной установке конечных координат.
11.4. Интерактивные технологии построения изображений 929 Выбрать положение первой конечной точки Выбрать положение второй конечной точки вдоль приблизительно Выбрать положение первой конечной точки Выбрать положение второй конечной точки вдоль приблизительно вертикальной линии Рис. 11.5. Условие “вертикальная линия” К входным координатам могут применяться и другие условия, позволяющие по- разному выравнивать объекты. На линии может налагаться условие определенного наклона, например, 45°. Другой пример: входные координаты должны быть располо- жены на предопределенной траектории, например, дуге окружности. СЕТКИ Другой тип ограничений — прямоугольная сетка, отображенная в некоторой части экрана. Если активизировать условия, налагаемые сеткой, входные координаты будут округляться до ближайшего узла сетки. На рис. 11.6 иллюстрируется проведение ли- нии с использованием сетки. Каждое положение курсора в этом примере смещается к ближайшему узлу сетки, а затем между данными двумя точками проводится линия. Сетки облегчают построение объектов, поскольку новую линию легко соединить с ра- нее проведенной, выбрав любую точку вблизи конечного узла одной из отображенных линий. Расстояние между линиями сетки (шаг) часто можно выбирать, и в различных областях экрана могут использоваться частичные сетки или сетки с разными шагами.
930 Глава 11. Методы интерактивного ввода и графические интерфейсы... Выбрать первую конечную точку возле узла сетки Выбрать вторую конечную точку возле второго узла сетки Рис. 11.6. Построение линии, конечные точки которой должны лежать в узлах сетки МЕТОДЫ ЭЛАСТИЧНОЙ ГРАФИКИ Отрезки и другие базовые формы можно построить и разместить, используя методы эластичной графики, позволяющие интерактивно растягивать или сжимать размеры объектов. На рис. 11.7 демонстрируется метод эластичного интерактивного построе- ния отрезка. Вначале на экране выбирается одна конечная точка. Далее при переме- щении курсора отображается линия от начального до текущего положения курсора. Второй конечной точкой является положение, в котором нажимается определенная клавиша. Если используется мышь, построение эластичной линии начинается при нажатии кнопки; положение курсора, в котором кнопка отпускается, считается ко- нечной точкой. Подобные эластичные методы применяются для построения прямоугольников, окружностей и других объектов. На рис. 11.8 демонстрируется эластичное построение прямоугольника, а на рис. 11.9 — окружности. Для реализации описанных принципов используются разные подходы. Например, менять форму и размер прямоугольника можно, независимо перемещая только его верхнюю сторону (или нижнюю, или одну из боковых).
11.4. Интерактивные технологии построения изображений 931 Выбрать положение первой конечной точки При перемещении курсора вытягивается линия от первой точки Линия следует за движением курсора, пока не будет выбрана вторая конечная точка Рис. 11.7. Эластичное построение и размещение отрезка Выбрать окончательное положение противоположной вершины прямоугольника вершины прямоугольника движением курсора Рис. 11.8. Эластичное построение прямоугольника Выбрать положение центра окружности Растянуть окружность движением курсора Выбрать окончательный радиус окружности Рис. 11.9. Эластичное построение окружности ПОЛЕ ТЯЖЕСТИ Иногда при построении фигур требуется соединить линии в точках между концами линий, причем эти точки не совпадают с узлами сетки. Поскольку точно разместить курсор в точке соединения трудно, в графическом пакете может вызываться проце- дура преобразования любого входного положения возле сегмента прямой в точку на I
932 Глава 11. Методы интерактивного ввода и графические интерфейсы... Рис. 11.10. Поле тяжести вокруг линии. Любая выбранная точка в зате- ненной области смещается в точку на линии линии, использующая эту область поля тяжести вокруг линии. Любая выбранная точка в поле тяжести линии перемещается (“притягивается”) к ближайшей точке ли- нии. Поле тяжести вокруг линии иллюстрируется затененной областью, показанной на рис. 11.10. Поля тяжести вокруг концов линий увеличиваются, облегчая разработчику соеди- нение линий в конечных точках. Заданные положения в одной из круговых областей поля тяжести притягиваются к конечным точкам в этой области. Размер полей тяжести выбирается так, чтобы он облегчал размещение, но при этом был достаточно малым, чтобы снизить вероятность наложения на другие линии. Если отображено много линий, поля притяжения могут перекрываться, и точно задать точки будет трудно. Отметим, что, как правило, на экране границы поля тяжести не отображаются. МЕТОДЫ ИНТЕРАКТИВНОГО РИСОВАНИЯ И ЖИВОПИСИ Возможности рисования поставляются во множестве форм. Прямые линии, много- угольники и окружности генерируются с помощью методов, рассмотренных в преды- дущих разделах. Для рисования кривых используются стандартные формы кривых, например, дуги окружности и сплайны, а также процедуры рисования от руки. Сплай- ны строятся интерактивно — задаются контрольные точки или предлагается рисунок от руки, дающий общую форму кривой. Далее система с помощью полиномиальной кривой формирует набор точек. При рисовании от руки кривые генерируются по пу- ти пера по графическому планшету или пути курсора по экрану. После отображения кривой разработчик может менять ее форму, выравнивая положения выбранных точек вдоль траектории кривой. В пакетах рисования также широко используются ширина линий, их стиль и другие параметры. Данные опции реализованы с помощью методов, рассмотренных в разделе 4.5. Во многих системах, особенно в системах, разработанных как рабо- чие станции художников, также есть различные стили рисования кистью, палитры кистей, комбинации цветов, формы объектов и текстуры поверхностей. Некоторые системы рисования меняют ширину линии и мазки кистью согласно давлению руки художника на перо. На рис. 11.11 показана система окон и меню, используемая в па- кете рисования, который позволяет художнику варьировать заданную форму объекта, использовать разные текстуры поверхности и условия освещения сцены.
11.5. Среды виртуальной реальности 933 Рис. 11.11. Схема экрана, демонстрирую- щая одни тип интерфейсов пакета художе- ственного рисования (перепечатано с раз- решения Thomson Digital Image) 11.5. СРЕДЫ ВИРТУАЛЬНОЙ РЕАЛЬНОСТИ Типичная среда виртуальной реальности показана на рис. 11.12. Интерактивный ввод реализуется в этой среде с помощью “информационной” перчатки (раздел 2.4), кото- рая может захватывать и перемещать объекты, отображенные на виртуальной сцене. Компьютерная сцена отображается посредством установленной на шлеме системы наблюдения (раздел 2.1) как стереографическая проекция. Устройства сопровожде- ния вычисляют положение и ориентацию головной гарнитуры и “информационной” перчатки относительно положения объекта на сцене. В описанной системе пользова- тель может двигаться по сцене и переупорядочивать положения объектов с помощью “информационной” перчатки. Другой метод генерации виртуальных сцен — отобразить стереографические про- екции на растровом мониторе с двумя такими же проекциями, отображаемыми в че- редующихся циклах обновления. Далее сцену можно наблюдать сквозь стереографи- ческие очки. Интерактивную манипуляцию объектами можно выполнить с помощью “информационной” перчатки и устройства слежения, позволяющего контролировать положение и ориентацию перчатки относительно положения объектов на сцене. 11.6. ИНТЕРАКТИВНЫЕ ФУНКЦИИ УСТРОЙСТВ ВВОДА OpenGL Поскольку процедуры интерактивного ввода устройствами в программе OpenGL тре- буют сопряжения с системой окон, такой ввод обрабатывается с помощью процедур из Utility Toolkit (GLUT). В GLUT есть функции для получения входа от стандартных устройств, таких как мышь или клавиатура, а также от планшетов, спейсболов, полей
934 Глава 11. Методы интерактивного ввода и графические интерфейсы... Рис. 11.12. Используя головной стереодисплей сопровождения, именуемый BOOM (Fake Space Labs, Inc.), и информационную перчатку Dataglove (VPL, Inc.), иссле- дователь интерактивно манипулирует исследовательскими зондами в нестацио- нарном потоке вблизи реактивного самолета Харриэр. Программное обеспечение разработал Стив Брисои (Steve Bryson); данные предоставлены Harrier (перепеча- тано с разрешения Сэма Юзлтона (Sam Uselton), NASA Ames Research Center) клавиш и наборных дисков. Для каждого устройства задается процедура (функция обратного вызова), которая будет вызываться всякий раз при наступлении события ввода от этого устройства. Данные команды GLUT размещаются в главной процедуре вместе с другими операторами GLUT. Кроме того, объединяя функции из основной библиотеки и библиотеки GLUT, можно реализовать обработку с помощью мыши (GLUT) данных, введенных с помощью указки. ФУНКЦИИ GLUT (МЫШЬ) Чтобы задать (“зарегистрировать”) процедуру, вызываемую, когда указатель мыши находится в окне на экране дисплея и нажимается или отпускается клавиша мыши, используется следующая функция. glutMouseFunc (mouseFcn); Эта функция обратного вызова процедуры mouseFcn, имеющей четыре аргумента: void mouseFcn (GLint button, GLint action, GLint xMouse, GLint yMouse)
11.6. Интерактивные функции устройств ввода OpenGL 935 Параметру button присваивается значение символьной константы GLUT, обо- значающей одну из трех кнопок мыши, а параметру action присваивается сим- вольная константа, определяющая, какое действие мы хотим использовать, чтобы запустить событие активизации мыши. Допустимыми значениями button являются GLUT LEFT BUTTON, GLUT MIDDLE BUTTON и GLUT RIGHT BUTTON. (Ес- ли есть только двухкнопочная мышь, то применяются только обозначения для левой и правой кнопок; при использовании однокнопочной мыши параметру button можно присвоить только значение GLUT_LEFT_BUTTON.) Действием, связанным с пара- метром, может быть GLUT_DOWN или GLUT_UP в зависимости от того, когда нужно инициировать действия — при нажатии или при отпускании клавиши. При вызове процедуры mouseFcn положение курсора мыши в окне на экране дисплея возвра- щается как координата (xMouse, yMouse). Это положение отсчитывается от верхнего левого угла окна на экране дисплея, так что xMouse — это расстояние (в пикселях) от левого края окна на экране дисплея, a yMouse — расстояние (в пикселях) вниз от вершины окна на экране дисплея. Активизируя кнопку мыши, когда курсор находится в пределах окна на экране дисплея, можно выбрать точку для отображения примитива, такого как отдельная точка, отрезок или закрашенная область. Кроме того, мышь можно использовать в качестве указательного устройства, сравнивая возвращенную координату с граница- ми отображенных объектов на сцене. Впрочем, OpenGL предлагает процедуры для использования мыши в качестве указательного устройства, и эти процедуры рассмат- риваются в следующем разделе. В качестве простого примера использования процедуры glutMouseFunc при- ведем программу, изображающую красную точку размера 3 в месте расположения курсора в окне на экране дисплея при каждом щелчке левой кнопкой мыши. По- скольку начало координат для функций-примитивов OpenGL находится в левом ниж- нем углу окна на экране дисплея, в процедуре mousePtPlot нужно использовать транспонированное возвращенное значение yMouse. ♦include <GL/glut.h> GLsizei winWidth = 400, winHeight = 300; /* Исходный размер окна на экране. */ void init (void) { glClearColor (0.0, 0.0, 1.0, 1.0) // Цвет окна выбран синим. glMatrixMode (GL_PROJECTION) ; gluOrtho2D (0.0, 200.0, 0.0, 150.0); )
936 Глава 11. Методы интерактивного ввода и графические интерфейсы... void displayFcn (void) { glClear (GL_COLOR_BUFFER_BIT); /* Очищается окно на экране дисплея. */ glColor3f (1.0, 0.0, 0.0); // Цвет точки выбран красным. glPointSize (3.0); // Размер точки равен 3,0. } void winReshapeFcn (GLint newWidth, GLint newHeight) { /* Обновление точки обзора и проекционных параметров. */ glViewport (0, 0, newWidth, newHeight); glMatrixMode (GL_PROJECTION); glLoadldentity ( ); gluOrtho2D (0.0, GLdouble (newWidth), 0.0, GLdouble (newHe ight)); /* Обновления параметров размера окна. */ winWidth = newWidth; winHeight = newHeight; } void plotPoint (GLint x, GLint y) { glBegin (GL_POINTS); glVertex2i (x, y); glEnd ( ); } void mousePtPlot (GLint button, GLint action, GLint xMouse, GLint yMouse) { if (button == GLUT_LEFT_BUTTON && action == GLUT_DOWN) plotPoint (xMouse, winHeight - yMouse); glFlush ( ); ) void main (int argc, char** argv) { glutlnit (&argc, argv); glutlnitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutlnitWindowPosition (100, 100); glutlnitWindowSize (winWidth, winHeight); glutCreateWindow ("Изображение точек мышью"); init ( ); glutDisplayFunc (displayFcn); glutReshapeFunc (winReshapeFcn); glutMouseFunc (mousePtPlot); glutMainLoop ( ); )
11.6. Интерактивные функции устройств ввода OpenGL 937 Рис. 11.13. Пример выхода интерактивной процедуры polyline В следующей программе данные, введенные мышью, используются для выбо- ра конечной точки отрезка. Выбранные отрезки соединяются, что демонстрирует интерактивное построение ломанной линии. Изначально нужно выбрать две точки окна, причем первый отрезок задается щелчками левой кнопкой мыши. Каждая по- следующая выбранная точка задает другой сегмент ломанной. Пример выхода этой программы представлен на рис. 11.13. ♦include <GL/glut.h> GLsizei winWidth = 400, winHeight = 300; /* Исходный размер окна на экране. */ GLint endPtCtr = 0; /* Инициализация счетчика конечных точек отрезков. */ class scrPt { public: GLint x, у; 1; void init (void) { glClearColor (0.0, 0.0, 1.0, 1.0) // Цвет окна выбран синим. glMatrixMode (GL_PROJECTION) ; gluOrtho2D (0.0, 200.0, 0.0, 150.0); 1 void displayFcn (void) { glClear (GL_COLOR_BUFFER_BIT) ; 1
938 Глава 11. Методы интерактивного ввода и графические интерфейсы... void winReshapeFcn (GLint newWidth, GLint newHeight) ( /* Обновление точки обзора и проекционных параметров. */ glViewport (0, 0, newWidth, newHeight); glMatrixMode (GL_PROJECTION); glLoadldentity ( ); gluOrtho2D (0.0, GLdouble (newWidth), 0.0, GLdouble (newHeight)); /* Обновления параметров размера окна. */ winWidth = newWidth; winHeight = newHeight; ) void drawLineSegment (scrPt endPtl, scrPt endPt2) ( glBegin (GL_LINES); glVertex2i (endPtl.x, endPtl.y); glVertex2i (endPt2.x, endPt2.y); glEnd ( ); void polyline (GLint button, GLint action, GLint xMouse, GLint yMouse) { static scrPt endPtl, endPt2; if (ptCtr == 0) { if (button == GLUT_LEFT_BUTTON && action == GLUT_DOWN) { endPtl.x = xMouse; endPtl.y = winHeight - yMouse; ptCtr = 1; } else if (button == GLUT_RIGHT_BUTTON) // Выход из программы, exit (0); ) else if (button == GLUT_LEFT_BUTTON && action == GLUT_DOWN) { endPt2.x = xMouse; endPt2.y = winHeight - yMouse; drawLineSegment (endPtl, endPt2); endPtl = endPt2; ) else if (button == GLUT_RIGHT_BUTTON) // Выход из программы, exit (0); glFlush ( );
11.6. Интерактивные функции устройств ввода OpenGL 939 void main (int argc, char** argv) { glutlnit (&argc, argv); glutlnitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutlnitWindowPosition (100, 100); glutlnitWindowSize (winWidth, winHeight); glutCreateWindow ("Нарисовать интерактивную ломаную"); init ( ); glutDisplayFunc (displayFcn); glutReshapeFunc (winReshapeFcn); glutMouseFunc (polyline); glutMainLoop ( ); } Другая процедура GLUT, которую можно использовать для работы с мышью, — это glutMotionFunc (fcnDoSomething) ; Данная процедура вызывает fcnDoSomething при движении курсора мыши в окне с активизацией одной или нескольких клавиш мыши. Функция, вызываемая в этом случае, имеет два аргумента: void fcnDoSomething (GLint xMouse, GLint yMouse) Здесь (xMouse, yMouse) — положение мыши в окне на экране дисплея относительно верхнего левого экрана при перемещении мыши со щелчком. Подобным образом можно выполнить некоторые действия при движении мышью в пределах окна без щелчков. glutPassiveMotionFunc (fcnDoSomethingElse); Как и ранее, положение мыши возвращается в fcnDoSomethingElse как коорди- ната (xMouse, yMouse) относительно верхнего левого угла окна на экране дисплея. ФУНКЦИИ GLUT (КЛАВИАТУРА) Для задания процедуры, вызываемой при нажатии клавиши, используется следующая функция. glutKeyboardFunc (keyFcn); Заданная процедура имеет три аргумента. void keyFcn (GLubyte key, GLint xMouse, GLint yMouse) Параметру key присваивается символьное значение или соответствующий код ASCII. Положение мыши в окне на экране дисплея возвращается как точка (xMouse,
940 Глава 11. Методы интерактивного ввода и графические интерфейсы... Рис. 11.14. Пример наброска от руки, по- лученного с помощью процедуры curve- Drawing yMouse) относительно верхнего левого угла окна. При нажатии обозначенной клави- ши на основе положения мыши можно инициировать некоторое действие, независимо от того, нажата ли еще какая-то кнопка мыши. В приведенном ниже коде представлена простая процедура рисования кривых с использованием ввода с клавиатуры. Построенная от руки кривая генерируется дви- жением мыши в окне дисплея при нажатой клавише <с>. В результате получается последовательность красных точек в каждой записанной точке, по которой прошлась мышь. Медленно двигая мышью, можно получить сплошную кривую линию. В дан- ном примере щелчки мышью не производят никакого эффекта. Пример выхода этой программы показан на рис. 11.14. ♦include <GL/glut.h> GLsizei winWidth = 400, winHeight = 300; // Исходный размер окна на экране. void init (void) { glClearColor (0.0, 0.0, 1.0, 1.0); /* Цвет окна дисплея - синий. */ glMatrixMode (GL_PROJECTION); gluOrtho2D (0.0, 200.0, 0.0, 150.0); 1 void displayFcn (void) { glClear (GL_COLOR_BUFFER_BIT); // Очищается окно. glColor3f (1.0, 0.0, 0.0); // Цвет точки - красный. glPointSize (3.0); // Размер точки - 3,0. 1
I 11.6. Интерактивные функции устройств ввода OpenGL 941 void winReshapeFcn (GLint newWidth, GLint newHeight) { i /* Обновление точки обзора и проекционных параметров. */ glViewport (0, 0, newWidth, newHeight); ! glMatrixMode (GL_PROJECTION); glLoadldentity ( ); gluOrtho2D (0.0, GLdouble (newWidth), 0.0, GLdouble (newHeight)); /* Обновления параметров размера окна. */ t winWidth = newWidth; winHeight = newHeight; ) void plotPoint (GLint x, GLint y) { t glBegin (GL_POINTS); glVertex2i (x, y); glEnd ( ); j > /* Перемещение курсора при нажатой клавише <с> позволяет * рисовать кривые от руки. j */ i void curveDrawing (GLubyte curvePlotKey, GLint xMouse, \ GLint yMouse) { > GLint x = xMouse; | GLint у = winHeight - yMouse; | switch (curvePlotKey) i { ,, J case 'c': f plotPoint (x, y); I break; j default: break; ) glFlush ( ); ) void main (int argc, char** argv) { glutlnit (&argc, argv); glutlnitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutlnitWindowPosition (100, 100); glutlnitWindowSize (winWidth, winHeight); glutCreateWindow ("Пример рисования кривых с помощью клавиатуры"); init ( ) ; glutDisplayFunc (displayFcn); glutReshapeFunc (winReshapeFcn); glutKeyboardFunc (curveDrawing); glutMainLoop ( ); )
942 Глава 11. Методы интерактивного ввода и графические интерфейсы... Для функциональных клавиш, клавиш управления курсором и других специаль- ных клавиш можно использовать команду glutSpecialFunc (specialKeyFcn) ; Заданная процедура имеет три аргумента: void specialKeyFcn (GLint specialKey, GLint xMouse, GLint yMouse) Однако теперь параметру specialKey присваивается целочисленное значение символьной константы GLUT. Чтобы выбрать функциональную клавишу, используем одну из констант от GLUT_KEY_F1 до GLUT_KEY_F12. Для клавиш управления кур- сором используем такие константы, как GLUT_KEY_UP и GLUT_KEY_RIGHT. Другие клавиши можно выделить, используя GLUT_KEY_PAGE_DOWN, GLUT_KEY_HOME и другие подобные константы для клавиш <Page Up>, <End> и <Insert>. Для использо- вания клавиш <Backspace>, <Delete> и <Escape> нужна процедура glutKeyboard- Func и коды ASCII этих клавиш — 8, 127 и 27 соответственно. Ниже в коде демонстрируется интерактивная программа, в которой использова- ны мышь, клавиатура и функциональные клавиши. Ввод мышью используется для выбора положения левого нижнего угла красного квадрата. Ввод с клавиатуры приме- няется для изменения масштаба квадрата, а при каждом щелчке левой кнопки мыши создается новый квадрат. ♦include <GL/glut.h> #inclue <stdlib.h> GLsizei winWidth = 400, winHeight = 300; /* Исходный размер окна на экране. */ GLint edgeLength = 10; /* Исходная длина стороны квадрата. */ void init (void) { glClearColor (0.0, 0.0, 1.0, 1.0) /* Цвет окна дисплея выбран синим. */ glMatrixMode (GL_PROJECTION); gluOrtho2D (0.0, 200.0, 0.0, 150.0); ) void displayFcn (void) { glClear (GL_COLOR_BUFFER_BIT); /* Очищается окно на экране дисплея. */ glColor3f (1.0, 0.0, 0.0); // Заполнение красным цветом. ) void winReshapeFcn (GLint newWidth, GLint newHeight) { /* Обновление точки обзора и проекционных параметров. */
11.6. Интерактивные функции устройств ввода OpenGL 943 glViewport (0, 0, newWidth, newHeight); glMatrixMode (GL_PROJECTION); glLoadldentity ( ); gluOrtho2D (0.0, GLdouble (newWidth), 0.0, GLdouble (newHeight)); /* Обновления параметров размера окна. */ winWidth = newWidth; winHeight = newHeight; } /* Отображается красный квадрат с заданной длиной сторон. */ void fillSquare (GLint button, GLint action, GLint xMouse, GLint yMouse) { GLint xl, yl, x2, y2; /* Левая кнопка мыши используется для выбора положения * левого нижнего угла экрана. */ if (button == GLUT_LEFT_BUTTON && action == GLUT_DOWN) { xl = xMouse; yl = winHeight - yMouse; x2 = xl + edgeLength; y2 = yl + edgeLength; glRecti (xl, yl, x2, y2); } else if (button == GLUT_RIGHT_BUTTON) /* Правая кнопка мыши используется для выхода из * программы. */ exit (0); glFlush ( ); } /* Используйте клавиши <2>, <3> и <4>, чтобы увеличить * квадрат. */ void enlargeSquare (GLubyte sizeFactor, GLint xMouse, GLint yMouse) { switch (sizeFactor) { case '2' : edgeLength *= 2;
944 Глава 11. Методы интерактивного ввода и графические интерфейсы... break; case ' 3' : edgeLength *= 3; break; case ' 4' : edgeLength *= 4; break; default: break; } } /* Используйте функциональные клавиши <F2> и <F4>, чтобы * изменить масштаб с коэффициентом 1/2 и 1/4. */ void reduceSquare (GLint reductionKey, GLint xMouse, GLint yMouse) ( switch (reductionKey) { case GLUT_KEY_F2: edgeLength /= 2; break; case GLUT_KEY_F3: edgeLength /= 4; break; default: break; } } void main (int argc, char** argv) { glutlnit (&argc, argv); glutlnitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutlnitWindowPosition (100, 100); glutlnitWindowSize (winWidth, winHeight); glutCreateWindow ("Квадраты разного размер"); init ( ); glutDisplayFunc (displayFcn); glutReshapeFunc (winReshapeFcn); glutMouseFunc (fillSquare); glutKeyboardFunc (enlargeSquare); glutSpecialFunc (reduceSquare); glutMainLoop ( ) ; )
11.6. Интерактивные функции устройств ввода OpenGL 945 ФУНКЦИИ GLUT (ПЛАНШЕТ) Обычно активизация планшета выполняется, когда курсор мыши находится в окне дисплея. Далее, используя приведенную команду, записывается событие для ввода с планшета glutTabletButtonFunc (tabletFcn); Аргументы вызываемой функции подобны тем, что используются при работе с мышью. void tabletFcn (GLint tabletButton, GLint action, GLint xTablet, GLint yTablet) Клавиша планшета обозначается целым идентификатором, таким как 1, 2, 3 и т.д. Действие при нажатии клавиши задается с помощью GLUT_UP или GLUT_DOWN. Возвращенные значения xTablet и yTablet являются планшетными координата- ми. Число доступных кнопок планшета можно определить с помощью приведенной ниже команды. glutDeviceGet (GLUT_NUM_TABLET_BUTTONS); Для обработки движения пера или курсора по планшету используется следующая функция. glutTabletMotionFunc (tabletMotionFcn); Здесь вызванная функция имеет вид void tabletMotionFcn (GLint xTablet, GLint yTablet) Возвращенные значения xTablet и yTablet дают координаты поверхности план- шета. ФУНКЦИИ GLUT (СПЕЙСБОЛ) Чтобы задать операцию в выбранном окне при активизации клавиши спейсбола, используется следующая функция. glutSpaceballButtonFunc (spaceballFcn); Функция обратного вызова имеет два параметра: void spaceballFcn (GLint spaceballButton, GLint action) Кнопки спейсбола определяются с помощью тех же целых значений, что и для план- шета, а параметру action присваивается значение GLUT_UP или GLUT_DOWN. Чис-
946 Глава 11. Методы интерактивного ввода и графические интерфейсы... ло доступных клавиш спейсбола можно определить, вызвав процедуру glutDe- viceGet с аргументом GLUT_NUM_SPACEBALL_BUTTONS. Трансляционное движение спейсбола при мыши в окне на экране дисплея запи- сывается с помощью вызова функции (spaceballTranlFcn); Трехмерные расстояния трансляции передаются вызванной функции, например, сле- дующим образом. void spaceballTranslFcn (GLint tx, GLint ty, GLint tz) Данные расстояния трансляции нормируются в диапазон от —1000 до 1000. Аналогично вращение спейсбола записывается такой функцией glutSpaceballRotateFunc (spaceballRotFcn); Наконец, используя функцию обратного вызова, можно получить углы трехмерного вращения. void spaceballRotFcn (GLint thetaX, GLint thetaY, GLint thetaZ) ФУНКЦИИ GLUT (ПОЛЕ КЛАВИШ) Ввод с поля клавиш получается с помощью следующего оператора. glutButtonBoxFunc (buttonBoxFcn) ; Активизация клавиши выполняется следующим образом: void buttonBoxFcn (GLint button, GLint action); Для идентификации кнопок используются целые значения, а действия, выполняемые при нажатии клавиши, задаются как GLUT_UP или GLUT_DOWN. ФУНКЦИИ GLUT (НАБОРНЫЕ ДИСКИ) Вращение диска можно записать с помощью следующей процедуры. glutDialsFunc (dialsFcn); В этом случае функция обратного вызова используется для идентификации диска и получения угловой величины вращения. void dialsFcn (GLint dial, GLint degreevalue); Цифры диска обозначаются целыми числами, и вращение диска дает целочисленное значение угла поворота в градусах.
11.6. Интерактивные функции устройств ввода OpenGL 947 УКАЗКИ В OpenGL Указывая на точки на экране, в программе OpenGL можно интерактивно выбирать объекты. Однако операция использования указки в OpenGL не такая уж и прямоли- нейная. По сути, чтобы указать на объект, используется обозначенное окно выбора, и формируется обновленный отображаемый объем. Объектам на сцене присваиваются целочисленные идентификаторы, и идентификаторы объектов, пересекающих обнов- ленный отображаемый образ, записываются в массив буфера указки. Следовательно, чтобы использовать возможности OpenGL в плане выбора с помощью указки, в про- грамму нужно включить следующие процедуры. • Создать и отобразить сцену. • Указать на точку экрана, и с помощью функции обратного вызова мыши выпол- нить следующее: • подготовить буфер указки; • активизировать операцию выбора с помощью указки (режим выбора); • инициализировать стек идентификаторов объектов; • записать текущие матрицы наблюдения и геометрических преобразований; • задать окно выбора для ввода мышью; • присвоить объектам идентификаторы и переработать сцену, используя обнов- ленный отображаемый объем (затем информация об указке записывается в буфере указки); • восстановить исходную матрицу наблюдения и геометрических преобра- зований; • определить число объектов, на которые указывает ссылка и вернуться к нор- мальному режиму визуализации; • обработать информацию о выборе с помощью указки. Кроме того, можно использовать модификацию указанных процедур для выбора объектов без интерактивного ввода мышью. Для этого задается не искомое окно выбора, а вершины обновленного отображаемого объема. Массив буфера указки подготавливается с помощью команды glSelectBuffer (pickBuffSize, pickBuffer); Параметр pickBuffer задает целочисленный массив с элементами pickBuf f- Size. Перед активизацией операции выбора с помощью указки (режима выбора) нужно вызвать функцию glSelectBuffer. Для каждого объекта, выбранного с помощью указки, в массиве ее буфера создается целая информационная запись.
948 Глава 11. Методы интерактивного ввода и графические интерфейсы... Несколько информационных записей можно сохранить в буфере указки в зависи- мости от размера и расположения окна выделения. Каждая запись в буфере указки содержит следующую информацию. 1. Положение объекта в стеке — число идентификаторов в стеке имен, расположен- ных над положением выбранного объекта (включая позицию объекта). 2. Минимальная глубина выбранного объекта. 3. Максимальная глубина выбранного объекта. 4. Список идентификаторов в стеке имен от первого (верхнего) идентификатора до идентификатора выбранного объекта. Целочисленные значения глубин, хранимые в буфере указки, — это исходные значения из диапазона 0-1,0, умноженные на 232 — 1. Для активизации указки OpenGL используется операция glRenderMode (GL_SELECT); При этом мы переходим в режим выбора, следовательно, для обработки сцены исполь- зуется конвейер наблюдения, но данные не заносятся в буфер кадра. Запись инфор- мации для каждого объекта, который был бы отображен в обычном режиме визуали- зации, помещается в буфер указки. Кроме того, указанная команда возвращает число объектов, выделенных с помощью указки, которое равно числу информационных за- писей в буфере указки. Чтобы вернуться в нормальный режим визуализации (режим по умолчанию), вызывается процедура glRenderMode с аргументом GL_RENDER. Третья опция — это аргумент GL_FEEDBACK, который содержит координаты объек- та и другую информацию из буфера обратной связи, которая отображается рядом с объектом. Режим обратной связи используется для получения информации о типах и параметрах примитивов, а также других параметрах, связанных с объектами на сцене. Для активизации стека имен (целочисленных идентификаторов), фигурирующего при выборе с помощью указки, используется такая процедура. gllnitNames ( ); Изначально стек идентификаторов пуст, и его можно использовать только в ре- жиме выбора. Чтобы поместить в стек целое значение (без знака), вызывается следу- ющая функция. glPushName (ID); Эта команда помещает значение параметра ID в верхнюю позицию, опуская предыдущее верхнее имя на одну позицию. Кроме того, можно просто заменить верхнее значение стека, используя команду
11.6. Интерактивные функции устройств ввода OpenGL 949 Рис. 11.15. Три цветных прямоугольника, отображенных в демонстрационной програм- ме выделения с помощью указки glLoadName (ID); Однако эту команду нельзя использовать, чтобы поместить значение в пустой стек. Для того чтобы удалить верхнее значение стека идентификаторов, используется следующая команда. glPopName ( ); Окно выделения при выбранном окне просмотра определяется с помощью такой функции GLU. gluPickMatrix (xPick, yPick, widthPick, heightPick, vpArray); Параметры xPick и yPick (величины двойной точности) задают экранные коор- динаты центра окна выбора относительно левого нижнего угла окна просмотра. Когда данные координаты вводятся мышью, координаты мыши берутся относительно верх- него левого угла, следовательно, входное значение yMouse нужно инвертировать. Значения двойной точности ширины и высоты окна выбора задаются параметрами widthPick и heightPick. Параметры vpArray определяют массив целых чисел, содержащий координаты и размер текущего окна просмотра. Параметры окна про- смотра получаются с использованием функции glGetlntegerv (раздел 6.4). Затем данное окно выбора используется как окно отсечения, позволяющее построить обнов- ленный отображаемый объем при преобразовании точки наблюдения. Информация по объектам, пересекающим данный объем, помещается в буфер указки.
950 Глава 11. Методы интерактивного ввода и графические интерфейсы... Проиллюстрируем выделение с помощью указки в OpenGL. Приведенная ни- же программу дает три цветных прямоугольника, показанных на рис. 11.15. В этом примере используется окно выбора 5 на 5, и центр окна выбора определяется вво- дом мыши. Следовательно, необходимо инвертировать входное значение yMouse, используя высоту окна просмотра (четвертый элемент массива vpArray). Красно- му прямоугольнику присвоен идентификатор 30, синему — 10, а зеленому — 20. В зависимости от положения мыши при вводе может не выбираться ни одного пря- моугольника, один прямоугольник, два прямоугольника или все три прямоугольника. Идентификаторы прямоугольника вводятся в стек идентификаторов в порядке цветов: красный, синий, зеленый. Следовательно, при обработке выбранного прямоугольни- ка используется либо его идентификатор, либо номер положения в стеке. Например, если номер положения в стеке (первый элемент в записи выбора) равен 2, выбран си- ний прямоугольник, и в конце записи указаны два идентификатора прямоугольников. Альтернативный вариант — использовать последнюю позицию записи, т.е. идентифи- катор выбранного объекта. В приведенной ниже программе приведено содержимое буфера выбора. Прямоугольники определены на плоскости ху, так что все значения глубины равны 0. Пример выхода программы приведен в примере 11.1 для положения мыши при вводе вблизи границы между красным и зеленым прямоугольниками. Ме- ханизм остановки программы не реализован, так что можно обработать любое число щелчков мыши. ♦include <GL/glut.h> ♦include <stdio.h> const GLint pickBuffSize = 32; /* * Исходный размер окна на экране. */ GLsizei winWidth = 400, winHeight = 400; void init (void) { /* Цвет окна дисплея - белый. */ glClearColor (1.0, 1.0, 1.0, 1.0); } /* Определяются 3 прямоугольника и связанные с ними * идентификаторы. */ void rects (GLenum mode) { if (mode — GL_SELECT) glPushName (30); // Красный прямоугольник. glColor3f (1.0, 0.0, 0.0); glRecti (40, 130, 150, 260); if (mode == GL_SELECT) glPushName (10); // Синий прямоугольник. glColor3f (0.0, 0.0, 1.0);
11.6. Интерактивные функции устройств ввода OpenGL 951 glRecti (150, 130, 260, 260); if (mode — GL_SELECT) glPushName (20); // Зеленый прямоугольник. glColor3f (0.0, 1.0, 0.0); glRecti (40, 40, 260, 130); ) /* Печать содержимого буфера выбора для каждого * щелчка мышью. */ void processPicks (GLint nPicks, GLuint pickBuffer [ ]) { GLint j, k; GLuint objID, *ptr; printf (" Число выбранных объектов = %d\n", nPicks); printf ("\n"); ptr = pickBuffer; /* Вывод всех элементов в каждой записи выбора. */ for (j =0; j < nPicks; j++) ( objID = *ptr; printf ("Положение в стеке = %d\n", objID); ptr++; printf ("Минимальная глубина = %g,", float (*ptr/0x7fffffff)); ptr++; printf ("Максимальная глубина = %g\n", float (*ptr/0x7fffffff)); ptr++; printf ("Идентификаторы в стеке: \n"); for (k = 0; k < objID; k++) { printf (" %d ",*ptr); ptr++; ) printf ("\n\n"); } } void pickRects (GLint button, GLint action, GLint xMouse, GLint yMouse) { GLuint pickBuffer [pickBuffSize]; GLint nPicks, vpArray [4]; if (button != GLUT_LEFT_BUTTON || action != GLUT_DOWN) return; glSelectBuffer (pickBuffSize, pickBuffer); /* Обозначить буфер выбора. */ glRenderMode (GL_SELECT); /* Активизировать операции выбора. */ gllnitNames ( ); /* Инициализировать стек идентификаторов объектов. */ /* Запись текущей матрицы наблюдения. */ glMatrixMode (GL_PROJECTION);
952 Глава 11. Методы интерактивного ввода и графические интерфейсы... glPushMatrix ( ); glLoadldentity ( ); /* Получить параметры текущего окна просмотра. Задать * окно 5 на 5 и инвертировать входное значение yMouse, * используя высоту окна просмотра (четвертый элемент * массива vpArray). */ glGetlntegerv (GL_VIEWPORT, vpArray); gluPickMatrix (GLdouble (xMouse), GLdouble (vpArray [3] - yMouse), 5.0, 5.0, vpArray); gluOrtho2D (0.0, 300.0, 0.0, 300.0); rects (GL_SELECT); /* Обработать прямоугольник в режиме выбора. */ /* Восстановить исходную матрицу наблюдения. */ glMatrixMode (GL_PROJECTION); glPopMatrix ( ); glFlush ( ); /* Определить число выделенных объектов и вернуться * в обычный режим визуализации. */ nPicks = glRenderMode (GL_RENDER); processPicks (nPicks, pickBuffer); /* Обработать выбранные объекты. */ glutPostRedisplay ( ); ) void displayFcn (void) { glClear (GL_COLOR_BUFFER_BIT); rects (GL_RENDER); // Отобразить прямоугольники. glFlush ( ); } void winReshapeFcn (GLint newWidth, GLint newHeight) { /* Обновить окно просмотра и проекционные параметры. */ glViewport (0, 0, newWidth, newHeight); glMatrixMode (GL_PROJECTION); glLoadldentity ( ); gluOrtho2D (0.0, 300.0, 0.0, 300.0); glMatrixMode (GL_MODELVIEW); /* Обновить параметры размера окна. */ winWidth = newWidth; winHeight = newHeight; }
11.7. Функции меню OpenGL 953 void main (^nt argc, char** argv) { glutlnit (&argc, argv); glutlnitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutlnitWindowPosition (100, 100); glutlnitWindowSize (winWidth, winHeight); glutCreateWindow ("Пример программы выбора"); init ( ); glutDisplayFunc (displayFcn); glutReshapeFunc (winReshapeFcn) ; glutMouseFunc (pickRects); glutMainLoop ( ); } ПРИМЕР 11.1 Выход процедуры pickrects Число выбранных объектов = 2 Положение в стеке = 1 Минимальная глубина = 0, максимальная глубина = 0 Идентификаторы в стеке: 30 Положение в стеке = 3 Минимальная глубина = 0, максимальная глубина = 0 Идентификаторы в стеке: 30 10 20 ФУНКЦИИ МЕНЮ OpenGL В дополнение к процедурам работы с устройствами ввода GLUT содержит функции для добавления в программы простых всплывающих меню. С помощью этих функ- ций можно настроить различные меню и связанные с ними подменю и обращаться к ним. Команды меню GLUT располагаются в процедуре main вместе с другими функциями GLUT.
954 Глава 11. Методы интерактивного ввода и графические интерфейсы... СОЗДАНИЕ МЕНЮ GLUT Всплывающее меню создается с помощью оператора glutCreateMenu (menuFcn) ; Здесь параметр menuFcn представляет имя процедуры, вызываемой при выборе по- зиции меню. Данная процедура имеет один аргумент — целое значение, соответству- ющее положению выбранной опции. void menuFcn (GLint menultemNumber) Целое значение, переданное параметру menultemNumber, затем используется функ- цией menuFcn для выполнения некоторого действия. Когда меню создается, оно соотносится с текущим окном на экране дисплея. Обозначив функции меню, которые будут вызваться при выборе позиции меню, нужно задать опции, которые будут перечислены в меню. Для этого используется ряд операторов, в которых указывается имя и положение каждой опции. Эти операторы имеют общую форму glutAddMenuEntry (charString, menultemNumber); Параметр charString задает текст, который будет отображаться в меню, а параметр menultemNumber дает положение этой позиции в меню. Например, приведенные ниже операторы создают меню с двумя опциями. glutCreateMenu (menuFcn); glutAddMenuEntry ("Первый пункт меню", 1); glutAddMenuEntry ("Второй пункт меню", 2); Далее нужно задать кнопку мыши, которая будет использоваться для выбора опции меню. Для этого используется команда glutAttachMenu (button); Здесь параметру button присваивается одна из трех символьных констант GLUT, соотнесенная с левой, средней или правой кнопкой мыши. Создание и использование меню GLUT иллюстрируется на приведенной ниже программе, в которой есть две опции отображения внутреннего заполнения треуголь- ника. Изначально треугольник определяется двумя вершинами и одной красной вер- шиной, а цвет заполнения определяется интерполяцией цветов вершин. Функции glShadeModel (разделы 4.14 и 10.20) используются для выбора заполнения тре- угольника, т.е. того, как треугольник будет закрашен многоугольниками, — сплошной цвет или интерполяция (Gouraud rendering — визуализация Гуро) цветов вершин. В этой программе создается меню, позволяющее выбирать из двух опций с использо- ванием правой кнопки мыши, когда курсор мыши находится внутри окна на экране. Верхний левый угол данного всплывающего меню отображается рядом с курсором,
11.7. Функции меню OpenGL 955 Рис. 11.16. Всплывающее меню OpenGL, отображенное демонстрационной програм- мой создания меню как показано на рис. 11.16. Опция меню подсвечивается при наведении на нее курсо- ра. Для выбора подсвеченной опции отпускается правая кнопка мыши. Если выбор пал на “одноцветное заполнение”, треугольник заполняется цветом, заданным для последней вершины (в данном примере это красный). В конце процедуры отображе- ния меню f illOption мы включили команду glutPostRedisplay (раздел 6.4), чтобы указать, что треугольник должен быть перерисован при отображении меню. ♦include <GL/glut.h> GLsizei winWidth = 400, winHeight = 400; /* Исходный размер окна на экране. */ GLfloat red = 1.0, green = 1.0, blue = 1.0; /* Вначале треугольника закрашен белым. */ GLenum fillMode = GL_SMOOTH; /* Заполнение треугольника: интерполяция цвета. */ void init (void) ( glClearColor (0.6, 0.6, 0.6, 1.0); /* Сделать цвет окна серым. */ glMatrixMode (GL_PROJECTION); gluOrtho2D (0.0, 300.0, 0.0, 300.0); 1
956 Глава 11. Методы интерактивного ввода и графические интерфейсы.. void fillOptXon (GLint selectedOption) { switch (selectedOption) ( case 1: fillMode = GL_FLAT; break; /* Визуализация плоской поверхности. */ case 2: fillMode = GL_SMOOTH; break; /* Визуализация Гуро. */ } glutPostRedisplay ( ); void displayTriangle (void) { glClear (GL_COLOR_BUFFER_BIT); glShadeModel (fillMode); /* Выбрать метод заполнения треугольника. */ glColor3f (red, green, blue); /* Выбрать цвет первых двух вершин. */ glBegin (GLJTRIANGLES); glVertex2i (280, 20); glVertex2i (160, 280); glColor3f (red, 0.0, 0.0); /* Выбрать цвет' последней вершины красным. */ glVertex2i (20, 100); glEnd ( ); glFlush ( ); void reshapeFcn (GLint newWidth, GLint newHeight) { glViewport (0, 0, newWidth, newHeight); glMatrixMode (GL_PROJECTION); glLoadldentity ( ); gluOrtho2D (0.0, GLfloat (newWidth), 0.0, GLfloat (newHeight)); displayTriangle ( ); glFlush ( );
11.7. Функции меню OpenGL 957 void main (inttarge, char **argv) ( glutlnit (&argc, argv); glutlnitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutlnitWindowPosition (200, 200); glutlnitWindowSize (winWidth, winHeight); glutCreateWindow ("Пример меню"); init ( ); glutDisplayFunc (displayTriangle); glutCreateMenu (filloption); // Создать всплывающее меню. glutAddMenuEntry ("Одноцветное заполнение", 1); glutAddMenuEntry ("Заполнение с интерполяцией цвета", 2); /* Выбор опции меню с использованием правой кнопки * мыши. */ glutAttachMenu (GLUT_RIGHT_BUTTON); glutReshapeFunc (reshapeFcn); glutMainLoop ( ); } СОЗДАНИЕ НЕСКОЛЬКИХ МЕНЮ GLUT И УПРАВЛЕНИЕ ИМИ Создаваемое меню соотносится с текущим окном на экране дисплея (раздел 6.4). Для одного окна на экране дисплея можно создать несколько меню, а также мож- но предусмотреть разные меню для разных окон. При создании каждого меню ему присваивается целочисленный идентификатор, начиная со значения 1, соотнесенно- го с первым меню. Целочисленный идентификатор меню возвращается процедурой glutCreateMenu, и это значение можно записать, используя оператор menuID = glutCreateMenu (menuFcn); Только что созданное меню становится текущим меню для текущего окна на экране дисплея. Чтобы активизировать любое меню для текущего окна на экране дисплея, используем такой оператор. glutSetMenu (menuID); Далее активизированное меню становится текущим, и оно будет всплывать в окне при нажатии кнопки мыши, соотнесенной с этим меню.
958 Глава 11. Методы интерактивного ввода и графические интерфейсы... Для удаления меню используется следующая команда. glutDestroyMenu (menuID); Если удаленное меню являлось текущим меню окна, статус текущего не переходит ни на одно из оставшихся меню (таким образом, в данном окне нет текущего меню). Приведенная ниже функция используется для получения идентификатора теку- щего меню в текущем окне на экране дисплея. currentMenuID = glutGetMenu ( ); Значение 0 возвращается, если данное окно не имеет меню, или если предыдущее текущее меню было удалено с помощью функции glutDestroyMenu. СОЗДАНИЕ ПОДМЕНЮ GLUT Подменю можно соотнести с меню, вначале создав подменю со списком опций с по- мощью команды glutCreateMenu, а затем перечислив подменю как дополнитель- ные опции в основном меню. Чтобы добавить подменю в список опций основного меню (или другого подменю), используется последовательность операторов, подоб- ная приведенной ниже. submenuID = glutCreateMenu (submenuFcn); glutAddMenuEntry ("Первый пункт подменю", 1); glutCreateMenu (menuFcn); glutAddMenuEntry ("Первый пункт меню", 1); glutAddSubMenu ("Опции подменю", submenuID); Чтобы добавить подменю к текущему меню, можно также использовать функцию glutAddSubMenu. В приведенной ниже программе иллюстрируется создание подменю. Эта про- грамма (модификация предыдущей) отображает подменю, предлагающее выбор из трех цветов (синий, зеленый и белый) для первых двух вершин треугольника. В ос- новном меню теперь есть список из трех опций, причем третья опция отображена с символом стрелочки, указывающим, что при выделении данной опции выпадает подменю, как показано на рис. 11.17. После функций создания основного меню и подменю включена функция glutPostRedisplay.
11.7. Функции меню OpenGL 959 Рис. 11.17. Всплывающее основное меню и подменю OpenGL, полученные с помощью демонстрационной программы создания под- меню #include <GL/glut.h> GLsizei winWidth = 400, winHeight = 400; /* Исходный размер окна на экране дисплея. */ GLfloat red = 1.0, green = 1.0, blue = 1.0; /* Исходные значения цветов. */ GLenum renderingMode = GL_SMOOTH; /* Исходный метод заполнения. */ void init (void) ( glClearColor (0.6, 0.6, 0.6, 1.0); /* Цвет окна выбирается серым. */ glMatrixMode (GL_PROJECTION); gluOrtho2D (0.0, 300.0, 0.0, 300.0); } void mainMenu (GLint renderingoption) { switch (renderingoption) { case 1: renderingMode = GL_FLAT; break; case 2: renderingMode = GL_SMOOTH; break; } glutPostRedisplay ( ); }
960 Глава 11. Методы интерактивного ввода и графические интерфейсы... /* Значений цветов устанавливаются согласно выбранной * опции подменю. void colorSubMenu (GLint colorOption) { switch (colorOption) { case 1: red = 0.0; green = 0.0; blue = 1.0; break; case 2: red = 0.0; green = 1.0; blue = 0.0; break; case 3: red = 1.0; green = 1.0; blue - 1.0; } glutPostRedisplay ( ); } void displayTriangle (void) ( glClear (GL_COLOR_BUFFER_BIT) ; glShadeModel (renderingMode); /* Задается метод заполнения для треугольника. */ glColor3f (red, green, blue); /* Задается цвет первых двух вершин. */ glBegin (GL_TRIANGLES); glVertex2i (280, 20); glVertex2i (160, 280); glColor3f (1.0, 0.0, 0.0); /* Цвет последней вершины - красный. */ glVertex2i (20, 100); glEnd ( ); glFlush ( ); } void reshapeFcn (GLint newWidth, GLint newHeight) ( glViewport (0, 0, newWidth, newHeight); glMatrixMode (GL_PROJECTION) ; glLoadldentity ( ); gluOrtho2D (0.0, GLfloat (newWidth), 0.0, GLfloat (newHeight)); displayTriangle ( ); glFlush ( );
11.7. Функции меню OpenGL 961 I void main (int argc, char **argv) { GLint subMenu; // Идентификатор подменю. glutlnit (&argc, argv); glutlnitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutlnitWindowPosition (200, 200); glutlnitWindowSize (winWidth, winHeight); glutCreateWindow ("Пример создания подменю"); init ( ); glutDisplayFunc (displayTriangle); subMenu = glutCreateMenu (colorSubMenu); glutAddMenuEntry ("Синий", 1); glutAddMenuEntry ("Зеленый", 2); glutAddMenuEntry ("Белый", 3); glutCreateMenu (mainMenu); /* Создать основное всплывающее меню. */ glutAddMenuEntry ("Одноцветное заполнение", 1); glutAddMenuEntry ("Заполнение с интерполяцией цвета", 2); glutAddSubMenu ("Цвет", subMenu); /* Выбор опции меню с использованием правой кнопки мыши. */ glutAttachMenu (GLUT_RIGHT_BUTTON); glutReshapeFunc (reshapeFcn); glutMainLoop ( ); } МОДИФИКАЦИЯ МЕНЮ GLUT Если требуется заменить кнопку мыши, используемую для выбора опции меню, вна- чале нужно отменить текущую привязку к ней. Затем с опцией связывается новая кнопка. Для отмены используется команда glutDetachMenu (mouseButton); Параметру mouseButton присваивается константа GLUT, определяющая левую, правую или среднюю кнопку, ранее привязанную к меню.
962 Глава 11. Методы интерактивного ввода и графические интерфейсы... В существующем меню также можно менять опции. Например, опцию в текущем меню можно удалить с помощью команды glutRemoveMenuItem (itemNumber); Здесь параметру itemNumber присваивается целое значение опции меню, кото- рую нужно удалить. Другие процедуры GLUT позволяют модифицировать имена или состояния эле- ментов существующего меню. Например, эти процедуры можно использовать, чтобы изменить отображенное имя опции меню, номер пункта или опцию в подменю. 11.8. РАЗРАБОТКА ГРАФИЧЕСКОГО ПОЛЬЗОВАТЕЛЬСКОГО ИНТЕРФЕЙСА Все современное прикладное программное обеспечение включает графические ин- терфейсы, составленные из окон на экране дисплея, пиктограмм, меню и других элементов, помогающих пользователю применить программное обеспечение к кон- кретной задаче. Специализированные интерактивные диалоги разрабатываются так, чтобы опции программирования выбирались с использованием знакомых терминов из определенной области, например, архитектурное проектирование, черчение, бизнес- графика, геология, экономика, химия или физика. В число других вопросов, требую- щих рассмотрения при разработке интерфейса пользователя, входят учет различных уровней подготовки, согласованность, обработка ошибок и обратная связь. ДИАЛОГ С ПОЛЬЗОВАТЕЛЕМ В любом приложении основой разработки диалога служит модель пользователя, в которой описывается, для чего разработана система, и какие операции доступны. Модель формулирует тип объектов, которые можно отобразить, и то, как можно ма- нипулировать объектами. Например, если система будет применяться как средство архитектурного проектирования, модель описывает, как можно использовать пакет для построения и отображения на экран проекций зданий с размещенными стенами, дверьми, окнами и другими компонентами. Пакет моделирования схемы производства может включать набор элементов мебели плюс операции для размещения и удале- ния различных объектов на заданном плане этажа. Наконец, программа разработки электрических схем должна предоставлять электрические или логические символы и операции размещения, позволяющие добавлять или удалять элементы. Вся информация в диалоге с пользователем представлена на языке приложения. В пакете архитектурной разработки это означает, что все взаимодействия описыва- ются только в архитектурных терминах безотносительно к конкретным структурам данных, терминам компьютерной графики или другим концепциям, которые могут быть незнакомы архитектору.
11.8. Разработка графического пользовательского интерфейса 963 а) б) в) Рис. 11.18. Примеры размещения на экране с использованием окон, меню и пиктограмм (перепечатано с разрешения a) Intergraph Corporation; 6) Visual Numerics, Inc.; в) Sun Microsystems) ОКНА И ПИКТОГРАММЫ На рис. 11.18 приведены примеры типичных графических интерфейсов. Для объектов, с которыми ведется работа в приложении, и действий, которые будут выполняться с этими объектами, используются визуальные представления. Кроме стандартных операций с окнами на экране дисплея, таких как открытие, закрытие, изменение положения и размера, нужны операции для работы с ползунка- ми, кнопками, пиктограммами и меню. Некоторые системы поддерживают несколько схем управления окнами (менеджеров окон), так что можно реализовать различные стили окон, каждый со своим менеджером, а в рамках отдельного приложения орга- низовывать структуру этих схем управления. Пиктограммы, представляющие объекты, такие как стены, двери, окна и элементы электрических схем, часто называются пиктограммами приложения. Пиктограммы, представляющие действия, например, поворот, увеличение, масштабирование, отсе- чение или вставка, называются пиктограммами управления или командными пикто- граммами. УЧЕТ РАЗЛИЧНЫХ УРОВНЕЙ ПОДГОТОВКИ Обычно интерактивные графические интерфейсы предлагают несколько методов вы- бора действий. Например, для выбора опции можно навести курсор на пиктограмму, выбрать опцию из всплывающего или выпадающего меню или ввести команду с клавиатуры. Это позволяет пакету адаптироваться к пользователям с различными навыками. Для менее опытного пользователя интерфейс с несколькими понятными операци- ями и подробными запросами ввода эффективнее интерфейса с большим всесторон- ним набором команд. Упрощенный набор меню и опций легко выучить и запомнить, и пользователь может сконцентрироваться на приложении, а не на деталях интерфейса. Для неопытного пользователя пакета часто удобнее простая операция типа “навести и выбрать”. Поэтому интерфейсы обычно предлагают меню, скрывающие сложность пакета, так что новички могут использовать систему, не вдаваясь в детали.
964 Глава 11. Методы интерактивного ввода и графические интерфейсы... С другой сторону, для опытных пользователей обычно важнее скорость. Это означает меньше запросов на ввод и больше собственно ввода с клавиатуры или с помощью мыши. Действия выбираются с помощью функциональных клавиш или комбинаций клавиш, поскольку опытные пользователи помнят горячие клавиши для часто используемых действий. Таким образом, средства помощи должны разрабатываться на нескольких уров- нях, чтобы новички могли использовать подробные диалоги, а опытные пользователи свели до минимума запросы и сообщения или вообще обошлись без них. Средства помощи также включают одно или несколько обучающих приложений, знакомящих пользователя с возможностями системы. СОГЛАСОВАННОСТЬ Важным вопросом при разработке интерфейса является согласованность. Форма пик- тограммы должна всегда иметь одно значение и не использоваться для представления различных действий или объектов в зависимости от контекста. Другие примеры согла- сованности — всегда располагать меню в одном и том же относительном положении, чтобы пользователю не приходилось его выискивать, всегда использовать одну и ту же клавиатурную комбинацию для выполнения действия и всегда применять то же цветовое кодирование, чтобы цвет не имел разного значения в различных ситуациях. МИНИМИЗАЦИЯ ИСПОЛЬЗОВАНИЯ ПАМЯТИ Чтобы операции в интерфейсе было легко понять и запомнить, они должны быть структурированы. Неясный, сложный, противоречивый, неоднозначный и сокращен- ный формат команд запутывает пользователя и снижает эффективность программно- го обеспечения. Например, использовать одну и ту же клавишу или кнопку для всех операций удаления легче, чем запомнить несколько различных клавиш для разнооб- разных процедур удаления. Кроме того, пиктограммы и системы окон можно организовать так, чтобы мини- мизировать используемую память. Информацию различных типов следует разделить по разным окнам, чтобы пользователь мог легко выделять и использовать отдельные элементы. Пиктограммы должны иметь яркую отчетливую форму, связанную с объек- тами и действиями. Чтобы совершить определенное действие, пользователь должен иметь возможность выбрать соответствующую пиктограмму. РЕЗЕРВНОЕ КОПИРОВАНИЕ И ОБРАБОТКА ОШИБОК Другой распространенной особенностью интерфейса является механизм отмены по- следовательности действий, позволяющий пользователю исследовать возможности системы, зная, что последствия ошибки можно исправить. Обычно системы могут от-
11.8. Разработка графического пользовательского интерфейса 965 менять несколько операций, позволяя вернуть систему к моменту перед выполнением какого-то действия. При необратимых действиях, таких как закрытие приложение без записи изменений, система запрашивается у пользователя подтверждение. Кроме того, хорошие диагностические сообщения и сообщения об ошибках по- могают определить причину ошибки. Интерфейсы могут пытаться минимизировать ошибки, упреждая некоторые действия, которые могут привести к ошибке. Пользо- вателю также может выдаваться предупреждение, если он запрашивает неоднознач- ное или неверное действие, например, пытается применить процедуру к несколь- ким объектам. ОБРАТНАЯ СВЯЗЬ При совершении каждого действия необходим определенный ответ. В противном случае пользователь может начать интересоваться, что же делает система, и не нужно ли повторить ввод. Обратную связь можно организовать по-разному, например, подсветить объект, отобразить пиктограмму или сообщение либо выделить выбранный пункт меню дру- гим цветом. Если выполнение затребованного действия может занять некоторое вре- мя, важно отобразить мигающее сообщение, часы, песочные часы или другой ин- дикатор прогресса. Также система может отображать промежуточные результаты по мере их получения, так что конечное изображение может строиться поэтапно. Си- стема также может позволять пользователю вводить другие команды или данные во время обработки одной команды. Для организации типичной обратной связи используются стандартные симво- лы. Изображение креста, нахмуренного лица или опущенного большого пальца сви- детельствует об ошибке, а на то, что действие обрабатывается, обычно указывает какой-нибудь символ времени или мерцающий знак “идет работа”. Подобная реакция может быть очень эффективной для опытного пользователя, но новичку может требо- ваться более подробная обратная связь, не просто указывающая, что делает система, но также подсказывающая, что далее должен делать пользователь. Другой важной особенностью обратной связи является ясность. Отклик системы должен быть понятным, но не настолько подробным, чтобы рассеивать внимание пользователя. При использовании функциональных клавиш обратную связь мож- но организовать с помощью слышимого щелчка или подсветки нажатой клавиши. Аудиосвязь имеет то преимущество, что не требует места на экране и не отвлекает внимание пользователя от рабочей области. Чтобы пользователь всегда знал, где бу- дут отображаться сообщения, за ними можно закрепить определенную стационарную область, хотя в некоторых случаях выгоднее выводить сообщения обратной связи в рабочей области возле курсора. Сообщения обратной связи могут отображаться в другом цвете, чтобы отличать их от других объектов.
966 Глава 11. Методы интерактивного ввода и графические интерфейсы... Часто бывает полезен дубляж, особенно для ввода с клавиатуры, чтобы ошибки можно было быстро обнаружить. Клавишный и дисковый ввод может каким-то обра- зом дублироваться на экране. Скалярные значения, выбранные с помощью дисков или выбранные по отображенным линейкам, обычно также дублируются на экране, что- бы пользователь проверял входные значения на точность. Выбор координат зачастую дублируется с помощью изображения курсора или другого символа, расположенно- го в выбранной точке. Для более точного дублирования выбранных положений на экране также полезно отображать координаты. 11.9. РЕЗЮМЕ Для ввода графической программы используются разные аппараты, причем от раз- личных устройств могут поступать одинаковые входные данные. Функции графи- ческого ввода часто независимы от аппаратного обеспечения, для чего применяется логическая классификация устройств ввода. Затем устройство определяется согласно типу графического ввода. В стандартах ISO и ANSI используется шесть устройств. Устройства ввода одной точки вводят одну координату. Устройства ввода набора точек вводят поток координат. Устройства ввода строк вводят текст. Устройства ввода значений вводят скалярные значения. Устройства выбора используются для выбора позиции из меню. Наконец, указки позволяют выбирать компоненты сцены. Аппаратно-независимые графические пакеты предлагают ограниченный набор функ- ций ввода, определяемых во вспомогательной библиотеке. В функциях ввода широко используется три режима. Режим запроса передает ввод под управление программы-приложения. В режиме дискретизации устройства ввода и программа работают параллельно. Режим событий позволяет устройствам ввода инициировать ввод данных и управлять обработкой данных. После выбора режима для класса логических устройств и определенного физического устройства, которое будет использоваться для ввода данных этого типа, информация вводится в программу. Программа-приложение может разрешать одновременное использование различных физических устройств ввода, работающих в различных режимах. Интерактивные методы построения изображений широко применяются во мно- гих приложениях, включая пакеты разработки и рисования. Данные методы пред- лагают пользователю возможность задавать положения объектов, ограничивать рас- положение объектов определенными ориентациями или взаимным расположением и интерактивно изображать объекты на сцене. Чтобы облегчить расположение и выбор ориентации элементов изображения, широко используются сетки, поля притяжения и эластичные методы. В прикладном программном обеспечении стандартно присутствуют графические интерфейсы пользователя. Диалог в программном обеспечении разрабатывается ис- ходя из модели пользователя, которая описывает цели и функции прикладного пакета. Все элементы диалога представлены на языке приложения.
11.9. Резюме 967 Системы окон предлагают стандартный интерфейс с процедурами для работы с окнами на экране дисплея, меню и пиктограммами. Для поддержки нескольких менеджеров окон можно разработать системы окон. При разработке диалога с пользователем важно ориентироваться на легкость ис- пользования, ясность и гибкость. По сути, графические интерфейсы предназначены для поддержания согласованности взаимодействия с пользователем и предполагают разный уровень подготовки. Кроме того, интерфейсы разрабатываются так, чтобы минимизировать используемую память, обеспечить достаточную обратную связь и адекватные возможности резервирования и обработки ошибок. В Utility Toolkit GLUT имеются функции ввода, предназначенные для работы с интерактивными устройствами, такими как мышь, планшет, спейсбол, поле клавиш и наборный диск. Кроме того, GLUT предоставляет функцию приема комбиниро- ванного входа от мыши и клавиатуры. Операции выбора с помощью указки можно выполнить, используя функции из библиотеки GLU и основной библиотеки OpenGL. Можно также отобразить всплывающие меню и подменю с помощью функции биб- лиотеки GLUT. Резюме по функциям ввода и функциям меню OpenGL представлены в табл. 11.1 и 11.2. ТАБЛИЦА 11.1. Резюме по функциям ввода OpenGL Функция glutMouseFunc glutMotionFunc glutPassive MotionFunc glutKeyboardFunc glutSpecialFunc glutTablet ButtonFunc glutTablet MotionFunc Описание Задает функцию обратного вызова мыши, которая будет ак- тивизирована при нажатии кнопки мыши Задает функцию обратной связи мыши, которая будет вызва- на при перемещении курсора мыши при нажатой кнопке Задает функцию обратной связи мыши, которая будет вызва- на при перемещении курсора мыши без нажатой кнопки Задает функцию обратной связи клавиатуры, которая будет вызвана при нажатии стандартной клавиши Задает функцию обратной связи клавиатуры, которая будет вызвана при нажатии специальной (например, функциональ- ной) клавиши Задает функцию обратной связи планшета, которая будет вы- звана при нажатии кнопки планшета, когда курсор мыши на- ходится в окне на экране дисплея Задает функцию обратной связи планшета, которая будет вы- звана, когда перо планшета или курсор движутся, а курсор мыши находится в окне на экране дисплея
968 Глава 11. Методы интерактивного ввода и графические интерфейсы... ) , Окончание табл. 11.1 Функция Описание glutSpaceball ButtonFunc Задает функцию обратной связи спейсбола, которая будет вызвана при нажатии кнопки спейсбола, когда курсор мы- ши находится в окне на экране дисплея, или используется другой метод активизации окна на экране дисплея. glutSpaceball MotionFunc Задает функцию обратной связи спейсбола, которая будет вызвана при трансляционном движении спейсбола в актив- ном окне на экране дисплея glutSpaceball RotateFunc Задает функцию обратной связи спейсбола, которая будет вызвана при вращательном движении спейсбола для актив- ного окна на экране дисплея glutButtonBoxFunc Задает функцию обратной связи поля клавиш, которая бу- дет вызвана при нажатии клавиши glutDialsFunc Задает функцию обратной связи наборного диска, которая будет вызвана при вращении диска glSelectBuffer glRenderMode Задает размер и имя буфера выбора А тивизирует операцию выбора с использованием аргу- мента GL_SELECT. Данная функция также используется для активизации стандартного режима визуализации или режима обратной связи gllnitNames glPushName glLoadName А тивизирует стек имен идентификаторов объекта Заносит идентификатор объекта в стек идентификаторов Замещает верхний идентификатор в стеке идентификато- ров заданным значением glPopName gluPickMatrix Удаляет верхний элемент из стека идентификаторов Определяет окно выбора и формирует обновленный отоб- ражаемый объем для операции выбора ЛИТЕРАТУРА Эволюция понятия логических (или виртуальных) устройств ввода рассмотрена в [291, 370]. Реали- зация различных процедур ввода представлена в [8, 122, 151, 176, 244]. Дополнительные примеры программирования с использованием мыши можно найти в руководстве [400]. Полный перечень функций основной библиотеки OpenGL и библиотеки GLU приводится в справочнике [320]. Функ- ции ввода и создания меню GLUT подробно описаны в [174]. Руководства по разработке интерфейса пользователя представлены в [6, 26, 45, 81, 186, 243, 318]. Информацию, касающуюся системы X Window, можно найти в [72, 409].
Упражнения 969 ТАБЛИЦА 11.2. Резкие по функциям меню OpenGL Функция Описание glutCreateMenu Создает всплывающее меню и устанавливает процедуру, вызываемую при выборе элемента меню; созданному ме- ню присваивается целый идентификатор glutAddMenuEntry Задает опцию, которая будет указана во всплывающем меню glutAttachMenu Задает кнопку мыши, которая будет использоваться для выбора опций меню glutSetMenu glutDestroyMenu glutGetMenu Задает текущее меню для текущего окна Задает идентификатор для меню, подлежащего удалению Возвращает идентификатор текущего меню, связанного с текущим окном glutAddSubMenu Задает подменю, которое будет включено в перечень оп- ций меню, где указанное подменю задается с использова- нием процедуры glutCreateMenu glutDetachMenu glutRemoveMenuItem Отменяет для текущего меню привязку кнопки мыши Удаляет выбранную опцию из текущего меню УПРАЖНЕНИЯ 11.1. Разработайте алгоритм, позволяющий размещать объекты на экране с помощью коорди- натного манипулятора. Пользователю должно предлагаться меню объектов (геометрических форм), из которого выбирается объект и место его расположения. Программа должна разре- шать помещать любое количество объектов, пока не будет получен сигнал “прекратить”. 11.2. Расширьте алгоритм из предыдущего упражнения, чтобы выбранные объекты можно было масштабировать и вращать перед размещением. Выбор и параметры преобразования должны предлагаться пользователю в виде опций меню. 11.3. Напишите процедуру интерактивного рисования изображения с использованием координат- ного манипулятора. 11.4. Обсудите методы, которые можно использовать в процедуре распознавания шаблонов, чтобы сравнивать входные символы с элементами библиотеки форм. 11.5. Напишите процедуру, отображающую на экране линейную шкалу и ползунок и позволяю- щую выбирать численные значения путем размещения ползунка вдоль линейки. Выбранное численное значение должно дублироваться в рамке возле линейки. 11.6. Напишите процедуру, отображающую круговую шкалу и указатель (или ползунок), который можно двигать по кругу, выбирая нужный угол (в градусах). Выбранное угловое значение должно дублироваться в рамке возле круговой шкалы.
970 Глава 11. Методы интерактивного ввода и графические интерфейсы... 11.7. Напишите программу рисования, позволяющую пользователю создавать изображения, ко- торые состоят из отрезков, соединяющих заданные точки. Координаты отдельных отрезков выбираются с помощью координатного манипулятора. 11.8. Разработайте пакет рисования, позволяющий создавать изображения, состоящие из отрезков, соединяющих заданные точки. Установите поле притяжения вокруг каждой линии изобра- жения, позволяющее присоединять новые линии к уже существующим. 11.9. Модифицируйте пакет рисования из предыдущего упражнения, чтобы можно было строить горизонтальные или вертикальные линии. 11.10. Разработайте пакет рисования, отображающий настраиваемую сетку, чтобы выбранные точ- ки экрана округлялись до узлов сетки. Пакет должен иметь средства рисования отрезков, конечные точки которых вводятся координатным манипулятором. 11.11. Напишите процедуру, позволяющую разработчику создавать изображения, рисуя прямые линии эластичным методом. 11.12. Разработайте пакет рисования, позволяющий строить прямые линии, прямоугольник и окружности с помощью эластичных методов. 11.13. Напишите процедуру, позволяющую пользователю выбирать компоненты двухмерной сце- ны. Для определения выбранного объекта при данном положении курсора должны храниться и использоваться границы всех объектов. 11.14. Разработайте процедуру, позволяющую формировать изображение, используя меню базовых форм и перетаскивая с помощью указки каждую выделенную форму в нужное место. 11.15. Реализуйте функции ввода в режиме запроса. 11.16. Реализуйте функции ввода в дискретном режиме. 11.17. Реализуйте функции ввода в режиме событий. 11.18. Разработайте процедуру реализации функций ввода для режимов запроса, событий и дис- кретного режима. 11.19. Расширьте программу рисования точек OpenGL из раздела 11.6, чтобы она включала меню, позволяющее выбирать размер и цвет точки. 11.20. Расширьте программу построения ломанных OpenGL из раздела 11.6, чтобы она включала меню, позволяющее выбирать параметры линии: размер, цвет и толщину. 11.21. Модифицируйте программу из предыдущего упражнения, чтобы можно было выбирать тек- стуру ломаной линии. 11.22. Напишите интерактивную программу OpenGL, отображающую квадрат 100 на 100 пикселей в любой введенной точке окна. Данная точка используется как центр квадрата. В програм- му включите меню выбора цвета, чтобы прямоугольник можно было закрасить выбранным цветом. 11.23. Модифицируйте программу из предыдущего упражнения, чтобы введенная точка отбрасы- валась, если квадрат нельзя целиком поместить в окно. 11.24. Модифицируйте программу из предыдущего упражнения, чтобы она включала меню выбора текстуры заполнения прямоугольника. Задайте не менее двух текстурных шаблонов. 11.25. Напишите интерактивную программу OpenGL, отображающую введенную строку символов в любой точке окна на экране дисплея. Текст начинается с точки, вводимой пользователем. 11.26. Напишите интерактивную программу OpenGL для размещения отдельного двухмерного объ- екта в любой точке окна на экране дисплея. Объект должен выбираться из меню базовых форм, включающего (минимум) квадрат, окружности и треугольник.
Упражнения 971 11.27. Модифицируйте программу из предыдущего упражнения, чтобы можно было отображать любой набор двухмерных объектов, причем каждый объект выбирается из меню, пока не будет выбрана опция выхода. 11.28. Модифицируйте программу из предыдущего упражнения, чтобы объекты можно было мас- штабировать или вращать. Операции геометрического преобразования должны быть пере- числены в меню. 11.29. Напишите интерактивную программу OpenGL для размещения отдельного трехмерного объ- екта в окне на экране дисплея. Объект должен выбираться из меню каркасных тел GLUT, таких как сфера, куб или цилиндр, причем центр тела должен находиться во введенной точке. 11.30. Модифицируйте программу из предыдущего упражнения, чтобы объекты можно было отоб- ражать в каркасной или объемной форме. Для объемных тел включите точечный источник света в точке наблюдения и используйте параметры по умолчанию для освещения и затене- ния поверхности. 11.31. Напишите программу реализации операции выбора OpenGL для трехмерной сцены, со- держащей насколько объектов. Для каждой попытки выделения создайте небольшое окно выбора и перенесите наиболее удаленный объект в этом окне на передний план. 11.32. Напишите интерактивную программу OpenGL, отображающую трехмерную кубическую кривую Безье. С помощью мыши необходимо ввести четыре контрольные точки. 11.33. Модифицируйте программу из предыдущего упражнения, чтобы при отображении кривой Безье можно было выбирать ее степень — три, четыре или пять. 11.34. Напишите интерактивную программу OpenGL, отображающую двухмерный кубический би- сплайн. Параметры сплайна должны вводиться, а контрольные точки — выбираться мышью. 11.35. Напишите интерактивную программу OpenGL, отображающую кубический участок поверх- ности Безье. Координаты х и у контрольных точек можно выбрать с помощью мыши, а координата z должна вводиться как высота над горизонтальной плоскостью. 11.36. Выберите несколько знакомых вам графических приложений и задайте модель пользовате- ля, которая будет применяться в качестве основы разработки интерфейса пользователя для графических приложений в этой области. 11.37. Перечислите возможные средства помощи, которые могут предоставляться в интерфей- се пользователя, и обсудите, какие их типы подойдут для пользователей с различны- ми навыками. 11.38. Приведите резюме по методам резервного копирования и обработки ошибок. Какие методы подходят для новичка? Какие методы лучше для опытного пользователя? 11.39. Перечислите возможные форматы представления пользователю меню и объясните, при ка- ких условиях может быть удобным каждый формат. 11.40. Обсудите альтернативы обратной связи с точки зрения опытности пользователей. 11.41. Перечислите функции, которые может выполнять менеджер окон при обработке компоновки объектов на экране при наличии нескольких перекрывающихся окон. 11.42. Разработайте пакет менеджера окон. 11.43. Разработайте интерфейс пользователя для программы рисования. 11.44. Разработайте интерфейс пользователя для пакета двухуровневого иерархического модели- рования.
Модели цвета и применение цвета Компьютерная сцена, смоделированная с различными комбинациями цветов и стандартной формой лепестка (перепечатано с разрешения Пржемислава Прузинкевича, Университет Калгари. © 1987)
12.1. Свойства света 12.6. Модели CMY и СМ'К 12.2. Модели цвета 12.7. Модель HSV 12.3. Стандартные основные цвета и 12.8. Модель HLS диаграмма цветности 12.9. Выбор цвета и приложения 12.4. Модель RGB 12.10. Резюме 12.5. Семейство моделей YQ д о этого момента обсуждение цвета велось в контексте модели RGB, ко- торая использовалась для генерации изображений на мониторах. Стоит, однако, отметить, что в приложениях компьютерной графики применя- ются и другие описания цвета. Одни методы используются для описания цветных распечаток принтеров и плоттеров, вторые применяются для передачи и хра- нения информации о цвете, третьи позволяют обеспечить качественный интерфейс программы, основанный на параметрах цвета. 12.1. СВОЙСТВА СВЕТА Как отмечалось в предыдущих главах, свет имеет множество различных характери- стик, и в различных контекстах свойства света описываются по-разному. Физически свет можно охарактеризовать как энергию излучения, но, чтобы описать наше вос- приятие света, нужны другие концепции. ЭЛЕКТРОМАГНИТНЫЙ СПЕКТР В физических терминах цвет — это электромагнитное излучение в узкой полосе ча- стот. Некоторые другие частотные группы электромагнитного спектра называются радиоволнами, инфракрасным и рентгеновским излучением. На рис. 12.1 показаны приблизительные частотные диапазоны этих различных частей электромагнитного излучения. Каждое частотное значение в видимой части электромагнитного спектра соот- ветствует иному спектральному цвету. В нижней части спектра (приблизительно 3,8 х 10й Гц) находятся красные цвета, в верхней (приблизительно 7,9 х 1014 Гц) —
974 Глава 12. Модели цвета и применение цвета Н---------1-----1--------1--------1- 102 104 106 ю8 Ю10 О 3 1 1 Н---------1--------1-------1--------1- 1012 ю14 ю16 ю18 ю20 Частота (Герц) Рис. 12.1. Электромагнитный спектр фиолетовые. В действительности человеческий глаз чувствительнее к некоторым ча- стотам инфракрасной и ультрафиолетовой частей спектра. Спектральные цвета ме- няются от оттенков красного через оранжевый и желтый в нижней части спектра к зеленому, голубому, синему и фиолетовому в верхней. В волновой модели электромагнитного излучения свет можно описать как осцил- лирующие взаимно перпендикулярные электрическое и магнитное поля, распростра- няющиеся в пространстве. Указанные поля осциллируют в направлениях, перпенди- кулярных одно другому и направлению распространения. Для каждого спектрального цвета частота осцилляции амплитуды поля равна частоте /. Переменные во времени осцилляции амплитуды электрического поля в одной плоскости иллюстрируются на рис. 12.2. Время между любыми двумя соседними точками волны, имеющими равные амплитуды, называется периодом волны Т ~\/f. Расстояние, которое волна прохо- дит от начала одной осцилляции до начала следующей, называется длиной волны А. Для одного спектрального цвета (монохроматическая волна) длина волны и часто- та обратно пропорциональны друг другу, а коэффициент пропорциональности равен скорости света с: с = А/. (12.1) Для каждого спектрального цвета частота постоянна для всех материалов, но ско- рость света и длина волны зависят от среды. В вакууме скорость света весьма близка к с — 3 х Ю10 см/с. Длина волны света очень мала, так что при обозначении спектраль- ных цветов в качестве единицы длины обычно используется ангстрем (1А = 10-8 ст) или нанометр (1 нм = 10-7 см). Эквивалентное название нанометра — миллимикрон. Свет в нижней части спектра (красный) имеет длину волны порядка 780 наномет- ров (нм), а длина волны света на другом конце спектра (фиолетовый) около 380 нм. Поскольку использовать единицы длины волны несколько удобнее, чем единицы ча- стоты, цвета спектра обычно задаются через длмны волн в вакууме.
12.1. Свойства света 975 Рис. 12.2. Изменение во вре- мени амплитуды электриче- ского поля для одного ча- стотного компонента плоско- поляризованной электромаг- нитной волны. Время меж- ду двумя последовательными максимумами или минимума- ми амплитуды называется пе- риодом волны Источник света, такой как обычная электрическая лампочка, излучает на всех частотах видимого диапазона, что дает белый свет. Если белый свет падает на непро- зрачный объект, некоторые частоты отражаются, а некоторые поглощаются. Комби- нация частот, присутствующая в отраженном свете, определяет, как мы воспримем цвет объекта. Если в отраженном свете доминируют низкие частоты, объект считает- ся красным. В этом случае говорят, что воспринимаемый свет имеет преобладающую частоту (или преобладающую длину волны) в красной части спектра. Преобладающая частота также называется оттенком (или просто цветом) света. ПСИХОЛОГИЧЕСКИЕ ХАРАКТЕРИСТИКИ ЦВЕТА Часто для того, чтобы охарактеризовать наше восприятие света, нужны иные свой- ства, кроме частоты. Когда мы смотрим на источник света, наши глаза реагируют на цвет (или преобладающую частоту) и два других базовых параметра. Один из них называется яркостью и соответствует суммарной полученной лучевой энергии (раздел 10.3). Последняя ощущаемая характеристика света называется чистотой или насыщенностью света. Чистота описывает, насколько свет близок к чистому спек- тральному цвету, например, красному. Пастельные и бледные цвета имеет низкую чистоту (малую насыщенность) и кажутся почти белыми. Другой термин, цветность, используется для обозначения суммарного восприятия двух свойств, описывающих характеристики цвета: чистоту и преобладающую частоту (оттенок). Распределение энергии излучения, испускаемого источником белого света, можно представить в диапазоне видимых частот, как показано на рис. 12.3. Каждый частот- ный компонент диапазона от красного до фиолетового дает более-менее равный вклад в общую энергию, а цвет источника описывается как белый. При наличии преоблада-
976 Глава 12. Модели цвета и применение цвета Рис. 12.3. Распределение энергии для источника бе- лого света Рис. 12.4. Распределение энергии для источника света, преобладающая частота которого близка к красной границе диапазона видимых частот Частота ющей частоты распределение энергии источника имеет вид, подобный показанному на рис. 12.4. Данный свет человек воспримет как красный (преобладающая частота) с относительно высоким значением чистоты. Плотность энергии преобладающего ком- понента света обозначена на рисунке Ed, а вклады от других частот дают белый свет с плотностью энергии Ew. Яркость источника можно вычислить как площадь под кри- вой, и эта величина будет равна плотности общей излучаемой энергии. Чистота (насы- щенность) зависит от разности между Ed и Ew- Чем больше энергия Ed преоблада- ющей частоты по сравнению с компонентом белого света Ew, тем выше чистота све- та. Чистота 100% наблюдается при Ew — 0, а чистота 0% соответствует Ew — Ed- 12.2. МОДЕЛИ ЦВЕТА Любой метод, позволяющий объяснить свойства или поведение цвета в некотором контексте, называется моделью цвета. Ни одна модель не может объяснить все ас- пекты цвета, поэтому для описания различных характеристик цвета используются различные модели.
i 12.2. Модели цвета 977 i i Рис. 12.5. Три функции выравнивания цве- тов для отображения спектральных частот из диапазона примерно от 400 до 700 нм 4 ОСНОВНЫЕ ЦВЕТА При объединении света от нескольких источников с различными преобладающими частотами интенсивность света от каждого источника можно менять, что позволит получить диапазон дополнительных цветов. На основе данного наблюдения была сформирована одна модель цвета. Оттенки, выбранные для источников, называются ; в ней основными цветами, а цветовой гаммой модели называется набор всех цветов, которые можно получить из основных цветов. Два основных цвета, дающих в сумме белый цвет, называются дополнительными. Примеры пар дополнительных цветов — красный и голубой, зеленый и пурпурный, синий и желтый. * Ни один конечный набор действительных основных цветов не даст всех возмож- I ных видимых цветов. Тем не менее для большинства задач трех основных цветов достаточно, а, используя расширенные методы, можно описать и цвета, не входящие в цветовую гамму для данного набора основных цветов. Имея набор из трех основ- ных цветов, любой четвертый цвет можно описать с помощью процедур смешивания цветов. Следовательно, смесь одного или двух основных цветов с четвертым цве- 4 том можно представить некоторой комбинацией остальных основных цветов. В этом расширенном смысле можно считать, что набор из трех основных цветов описывает Z все цвета. На рис. 12.5 показан набор функций выравнивания цветов для трех ос- j новных цветов и указано, какая “величина” каждого основного цвета требуется для 4 получения любого спектрального цвета. Кривые, изображенные на рис. 12.5, получе- • ны усреднением мнений большого числа наблюдателей. Цвета в окрестности 500 нм ; можно подобрать, только “вычитая” некоторую долю красного света из комбинации ; синего и зеленого. Это означает, что для описания цвета, близкого к 500 нм, можно I только так объединить этот цвет с долей красного, чтобы получить указанную на | диаграмме комбинацию синего и зеленого. Из сказанного, в частности, следует, что | RGB-монитор не может отображать цвета в окрестности 500 нм. ?
978 Глава 12. Модели цвета и применение цвета Рис. 12.6. Три функции подбора цветов для основных цветов МКО ИНТУИТИВНОЕ ВОСПРИЯТИЕ ЦВЕТА Художник рисует картину, смешивая цветные, черные и белые пигменты и получая различные тени, оттенки и тона. Начиная с пигмента “чистого цвета” (“чистого от- тенка”), художник добавляет черный пигмент, чтобы получить различные тени этого цвета. Чем чернее пигмент, тем темнее тень. Подобным образом различные насыщен- ные тона (tint) цвета получаются добавлением к исходному цвету белого пигмента, что делает его светлее при добавлении большего объема белил. Тона цвета получа- ются добавлением и черного, и белого пигментов. Многие люди воспринимают понятия, связанные с цветом, на более интуитив- ном уровне, чем набор трех чисел, дающих относительные пропорции основных цветов. Обычно гораздо проще представить создание пастельного красного цвета, прибавляя белый к чистому красному, а темно-синего — добавляя черный к чистому синему. Исходя из этого, графические пакеты часто предлагают палитры цветов с использованием нескольких моделей цвета. Одна модель обеспечивает пользовате- лю интуитивный цветовой интерфейс, а другие описывают компоненты цвета для выходных устройств. 12.3. СТАНДАРТНЫЕ ОСНОВНЫЕ ЦВЕТА И ДИАГРАММА ЦВЕТНОСТИ Поскольку ни один конечный набор источников света нельзя использовать для по- лучения всех возможных цветов, в 1931 году Международной комиссией по осве- щению (Commission Internationale de Г Eclairage — CIE, МКО) были определены три стандартных основных цвета. Эти цвета воображаемые (мнимые), определенные ма- тематически с помощью положительных функций подбора цветов (рис. 12.6), которые задают величины всех компонентов, необходимых для описания спектрального цвета. В результате был разработан международный стандарт всех цветов, который не тре- бовал введения отрицательных функций подбора цветов и не имел других проблем, присущих выбору реальных основных цветов.
12.3. Стандартные основные цвета и диаграмма цветности 979 МОДЕЛЬ ЦВЕТА XYZ Набор основных цветов МКО обычно называется моделью цвета XYZ, где параметры X, У и Z представляют величину каждого основного цвета МКО, требуемую для получения выбранного цвета. Таким образом, цвет в модели XYZ описывается так же, как, например, в модели RGB. В трехмерном пространстве цветов XYZ любой цвет (7(A) представляется как С(А) = (X, У, Z), (12.2) где X, У и Z вычисляются из функций подбора цвета (рис. 12.6): Х = к[ fx(X)I(X)dX- J visible А Y = k[ fY(X)I(X)dX-, (12.3) Jvisible А z = k[ fzWI(X)dX. J visible А Параметр к в этих формулах равен 683 люмен/ватт, где “люмен” — единица измерения излучения в единичный телесный угол для “стандартного” точечного источника света (когда-то назывался свечой). Функция /(А) представляет спектральное излучение (из- бирательная интенсивность света в определенном направлении), а функция подбора цветов /у выбирается так, чтобы параметр У был равен яркости (уравнение (10.26)) этого цвета. Значения светимости обычно нормируются в диапазон 0-100, где 100 представляет светимость белого света. Любой цвет в пространстве цветов XYZ можно, используя единичные векторы X, Y, Z, представить в виде аддитивной комбинации основных цветов. Следовательно, уравнение (12.2) можно записать так: С(А) = XX + YX + ZX. (12.4) НОРМИРОВАННЫЕ ЗНАЧЕНИЯ XYZ При обсуждении свойства цвета удобно нормировать величины в уравнении (12.3) на сумму X+Y + Z, представляющую общую лучистую энергию. Тогда нормированные величины можно вычислить следующим образом: X У Z , Х ~ X + Y + Z' У ~ X + У + Z’ Z~ X + Y + Z' (12’ )
980 Глава 12. Модели цвета и применение цвета Рис. 12.7. Диаграмма цветности МКО для спек- тральных цветов от 400 до 700 нм Поскольку х + у + z — 1, любой цвет можно представить, используя только величины х и у. Кроме того, мы нормировали набор параметров на общую энергию, так что параметры х и у зависят теперь только от оттенка и чистоты, поэтому они часто назы- ваются координатами цветности. Однако сами по себе значения х и у не позволяют полностью описать все свойства цвета, и по ним получить величины X, Y и Z нель- зя. Следовательно, полное описание цвета обычно дается с помощью трех значений: х, у и светимости (яркости) У. Оставшиеся величины МКО вычисляются как Т Z X = -У, Z = -У, (12.6) У У где z — 1 — х — у. С помощью координат цветности (х, у) на двухмерной диаграмме можно представить все цвета. ДИАГРАММА ЦВЕТНОСТИ МКО Если изобразить нормированные значения х и у для цветов видимой части спектра, получим языкообразную кривую, показанную на рис. 12.7. Данная кривая называется диаграммой цветности МКО. Точки вдоль кривой представляют спектральные цве- та (чистые цвета). Линия, соединяющая красную и фиолетовую точки и именуемая пурпурной линией, не является частью спектра. Внутренние точки диаграммы пред- ставляют все возможные комбинации цветов. Точка С на диаграмме соответствует положению белого света. В действительности данная точка изображена для источ- ника белого света, известного как иллюминат С, который используется в качестве стандартной аппроксимации дневного света.
12.3. Стандартные основные цвета и диаграмма цветности 981 Рис. 12.8. Цветовые гаммы, определенные на диаграмме цветности для двух- и трехцветной системы основных цветов Рис. 12.9. Представление дополнительных цветов на диаграмме цветности Из-за нормировки по диаграмме цветности нельзя получить значения яркости, поскольку цвета с различной яркостью, но одинаковой цветностью отображаются в одну точку диаграммы. Поэтому диаграмма цветности полезна в следующих случаях: • сравнение цветовых гамм для различных наборов основных цветов; • определение дополнительных цветов; • определение чистоты и преобладающей длины волны для данного цвета. ЦВЕТОВЫЕ ГАММЫ Цветовые гаммы на диаграмме цветности определяются как отрезки или многоуголь- ные области. Все цвета вдоль прямой линии, соединяющей точки Ci и на рис. 12.8, можно получить, смешав соответствующие доли цветов С\ и С’2. Если доля Ci боль- ше, получающийся в результате цвет будет ближе к С\, чем к С^. Цветовая гамма для трех точек, таких как С3, С4 и Сд на рис. 12.8, представляется треугольником с
982 Глава 12. Модели цвета и применение цвета Рис. 12.10. Определение преобладающей длины волны и чистоты с использованием диаграммы цветности вершинами в указанных точках. Данные три основных цвета могут дать только цвета внутри или на границе треугольника. Значит, диаграмма цветности помогает понять, почему ни один набор из трех основных цветов не позволяет аддитивно получить все цвета — ни один треугольник на диаграмме не вмещает все цвета. Отметим также, что на диаграмме цветности удобно сравнивать цветовые гаммы для мониторов и устройств выдачи документальных копий. ДОПОЛНИТЕЛЬНЫЕ ЦВЕТА Поскольку цветовая гамма для двух точек — это прямая линия, дополнительные цвета можно представить на диаграмме цветности двумя точками с противоположных сто- рон С, как показано на рис. 12.9. Расстояния от двух цветов С\ и С% до С определяют величину каждого цвета, необходимую для получения белого света. ПРЕОБЛАДАЮЩАЯ ДЛИНА ВОЛНЫ Чтобы определить преобладающую длину волны цвета, проведем прямую линию от С через точку, соответствующую этому цвету, к спектральному цвету на кривой цветно- сти. Спектральный цвет Cs на рис. 12.10 — это преобладающая длина волны цвета Ci на этой диаграмме. Следовательно, цвет С\ можно представить комбинацией белого света С и спектрального цвета Cs. Описанный метод определения преобладающей длины волны не будет работать для точек, лежащих между С и пурпурной линией. Проводя линию от С через точку С<2 на рис. 12.10, получаем точку Ср на пурпурной линии, не принадлежащую видимому спектру. В этом случае в качестве преобладаю- щей длины волны берем дополнение Ср на спектральной кривой — точку Csp. Цвета, такие как С%, на этой диаграмме имеют спектральное распределение с субтрактив- ными (полученными вычитанием) преобладающими длинами волн. Подобные цвета можно описать, вычитая преобладающую спектральную частоту из белого света.
12.4. Модель цвета RGB 983 Рис. 12.11. Модель цвета RGB. Любой цвет в пределах единичного куба можно описать в форме аддитивной комбинации трех основ- ных цветов ЧИСТОТА Для точки, представляющей цвет, например, Ci на рис. 12.10, определим чистоту как относительное расстояние Сд от С вдоль прямой линии, соединяющей С с Cs. Если через dc\ обозначить расстояние от С до С\, а через dcs — расстояние от С до Cs, чистоту можно представить как отношение dc]Jdcs. Цвет Ci на этом рисунке имеет чистоту примерно 25%, поскольку он расположен примерно на четверти общего расстояния от С до Cs. В положении Cs точка, описывающая цвет, будет иметь чистоту 100%. 12.4. МОДЕЛЬ ЦВЕТА RGB Согласно трехцветной теории зрения глаза человека воспринимают цвет посред- ством стимуляции трех зрительных пигментов в колбочках сетчатки. Один из этих пигментов более чувствителен к свету с длиной порядка 630 нм (красный), другой имеет максимум чувствительности вблизи 530 нм (зеленый), а третий — на частоте порядка 450 нм (синий). Сравнивая интенсивности источников света, мы ощущаем цвет света. Данная теория зрения является основой для отображения цветовых выхо- дов на мониторе с использованием трех основных цветов — красного (red), зеленого (green) и синего (blue), что называется моделью цвета RGB. Данную модель можно представить, используя единичный куб, построенный по осям R, G и В, как показано на рис. 12.11. Начало координат представляет черный цвет, а противоположная вершина с координатами (1, 1, 1) — белый. Вершины куба, расположенные по осям, представляют основные цвета, а оставшиеся вершины — дополнительные цвета.
984 Глава 12. Модели цвета и применение цвета Рис. 12.12. Два вида цветового куба RGB. Изображение (панель а) видно вдоль диагонали полутонов, идущей от белого к черному цвету, а изображе- ние (панель б) видно вдоль диагонали полутонов при наблюдении от черной вершины к белой Рис. 12.13. Цветовая гамма RGB для координат цветности NTSC. Иллюминат С находится в точке с координатами (0,310; 0,316) со значением яркости Y = 100, 0 Как и система XYZ, RGB — это аддитивная модель. Каждую точку (цвет) внутри единичного куба можно представить взвешенной векторной суммой основных цветов, используя единичные векторы R, G иВ: С(А) = (7?, G, В) = flR + GG + BB, (12.7) где параметры R,Gia В принимают значения из диапазона 0-1. Например, пурпурная вершина достигается сложением максимальных красного и синего значений, в резуль- тате чего получается тройка (1,0, 1), а белый цвет (1, 1, 1) представляет собой сумму максимальных значений красного, зеленого и синего. Оттенки серого представлены вдоль главной диагонали куба, идущей от начала координат (черный) к белой вер- шине. Точки вдоль этой диагонали получают равный вклад от всех основных цветов, а серая точка на полпути между белым и черным представлена как (0,5; 0,5; 0,5). Гра- дация цвета на передней и верхней плоскостях RGB-куба представлена на рис. 12.12.
12.5. Семейство моделей YIQ 985 Координаты цветности стандарта NTSC (National Television System Committee — Национальный комитет по телевизионным стандартам (США)) люминофоров RGB перечислены в табл. 12.1. Кроме того, в ней указаны координаты цветности RGB для модели МКО и приблизительные значения люминофоров в цветных мониторах. На рис. 12.13 показана приблизительная цветовая гамма для основных цветов RGB согласно стандарту NTSC. ТАБЛИЦА 12.1. Координаты цветности RGB (х, у) Стандарт NTSC Модель МКО Приблизительные значения цветного монитора R (0,670; 0,330) (0,735; 0,265) (0,628; 0,346) G (0,210; 0,710) (0,274; 0,717) (0,268; 0,588) В (0,140; 0,080) (0,167; 0,009) (0,150; 0,070) 12.5. СЕМЕЙСТВО МОДЕЛЕЙ YIQ Хотя графические мониторы RGB требуют отдельных сигналов для представления красного, зеленого и синего компонентов изображения, телевизионный монитор ис- пользует составной сигнал. Кодирование цвета NTSC с целью формирования состав- ного видеосигнала называется моделью YIQ. ПАРАМЕТРЫ YIQ В модели цвета YIQ параметр Y имеет то же значение, что компонент Y в простран- стве цветов МКО XYZ. Информацию о светимости (яркости) сообщает параметр У, тогда как информация о цветности (оттенок и чистота) вводится в параметры I и Q. Значение параметра У выбрано в виде такой комбинации красного, зеленого и сине- го цветов, чтобы в результате получалась стандартная кривая светимости. Поскольку У содержит информацию о светимости, черно-белые телевизионные мониторы ис- пользуют только сигнал У. Параметр I содержит информацию об оранжево-голубых цветах, дающих тени телесного цвета, а параметр Q несет информацию о зелено- пурпурных тонах. Составной сигнал NTSC предназначен для предоставления информации в форме, которая воспринимается черно-белыми телевизионными мониторами, получающими в полосе 6 МГц информацию о полутонах. Поэтому информация YIQ также коди- руется в полосе 6 МГц, но значения светимости и цветности кодируются в разные аналоговые сигналы. Таким образом, на черно-белые мониторы без изменений пода- ется сигнал яркости, а информация о цвете просто подается дополнительно в той же
986 Глава 12. Модели цвета и применение цвета полосе. Информация о яркости (значение У) передается путем амплитудной модуля- ции несущего сигнала с шириной полосы порядка 4,2 МГц. Информация о цветности (значения I и Q) объединяется во второй несущий сигнал, который имеет полосу порядка 1,8 МГц. Отметим, что названия параметров I и Q происходят от методов модуляции, используемых для кодирования информации о цвете на несущей. С ис- пользованием примерно 1,3 МГц полосы и амплитудной модуляции в “синфазном” (in-phase) сигнале передается значение I, а с помощью фазовой модуляции (“квадра- турный” (quadrature) сигнал) и полосы порядка 0,5 МГц передается значение Q. В сигнале NTSC значения яркости кодируются с более высокой точностью (ши- рина полосы — 4,2 МГц), чем значения цветности (ширина полосы — 1,8 МГц), поскольку человеческому глазу проще заметить небольшие изменения яркости, чем незначительные изменения цвета. В то же время, более низкая точность кодирования цветности приводит к некоторому ухудшению качества цвета в изображениях NTSC. Значение яркости для цветов RGB можно вычислить, используя уравнение (??), и одним методом получения значений цветности является вычитание яркости из красного и синего компонентов цвета. Таким образом, У = 0,299 R + 0,587 G + 0,114 В, I = R-Y, (12.8) Q = В - У. ПРЕОБРАЗОВАНИЯ МЕЖДУ ПРОСТРАНСТВАМИ ЦВЕТОВ RGB И YIQ Цвет RGB преобразуется в набор значений YIQ с помощью кодера NTSC, в котором реализовано уравнение (12.8) и модулируются несущие сигналы. Преобразование из пространства RGB в пространство YIQ выполняется с помощью следующей матрицы преобразования. У’ ’ 0,299 0,587 0,114’ 'R' I 0,701 -0,587 -0,114 G (12.9) .Q. -0,299 -0,587 0,886 _ В И, наоборот, видеосигнал NTSC преобразовывается в цвета RGB с использованием декодера NTSC, который вначале разделяет видеосигнал на компоненты YIQ, а за- тем конвертирует значения YIQ в значения RGB. Переход из пространства YIQ в пространство RGB выполняется посредством преобразования, обратного к приведен- ному в формуле (12.9). R G В 1,000 1,000 0,000' 1,000 -0,509 -0,194 1,000 0,000 1,000 у I .Q (12.10)
12.6. Модели цвета CMY и CMYK 987 12.6. СИСТЕМЫ YUV И YCrCb Из-за того, что для передачи информации о цветности в составном аналоговом видео- сигнале NTSC используется нижняя (более узкая) полоса, качество цвета на изображе- нии NTSC несколько ухудшается. Вследствие этого были разработаны разновидности кодирования YIQ, позволяющие улучшить качество цвета при передаче видео. Одна из таких схем кодирования — набор параметров цвета YUV, который содержит инфор- мацию о составном цвете для передачи видео в системах, подобных PAL (Phase Al- ternation Line), которая используется в большей части Европы, а также в Африке, Ав- стралии и Азии. Другая разновидность YIQ — цифровое кодирование YCrCb- Данное представление цвета используется для преобразований цифрового видео, и оно реа- лизовано в различных форматах графических файлов, таких как JPEG (раздел 15.4). МОДЕЛИ ЦВЕТА CMY И CMYK На мониторе отображение цветовых растров происходит путем объединения света, испускаемого люминофорами экрана, что является процессом аддитивным. В то же время, устройства выдачи документальных копий, такие как принтеры и плоттеры, дают цветное изображение, проливая на бумагу цветные пигменты. Цветное изоб- ражение на бумаге видно потому, что мы видим отраженный свет, т.е. благодаря процессу вычитания. ПАРАМЕТРЫ CMY Субтрактивную (основанная на вычитании) модель цвета можно сформировать, ис- пользуя три основных цвета — голубой (cyan), пурпурный (magenta) и желтый (yel- low). Как отмечалось выше, голубой цвет можно описать как сумму зеленого и синего. Следовательно, свет, отраженный от голубых чернил, содержит только зеленый и си- ний компоненты, а красный компонент поглощается, или вычитается, чернилами. Подобным образом пурпурные чернила вычитают зеленый компонент из падающего света, а желтые чернила — синий. Представление модели CMY в форме единичного куба иллюстрируется на рис. 12.14. В модели CMY точка (1, 1,1) представляет черный цвет, поскольку из падающего света вычтены все компоненты. Начало координат представляет белый свет. Равные доли всех основных цветов дают оттенки серого и располагаются вдоль главной диагонали куба. Комбинация голубых и пурпурных чернил дает синий цвет, поскольку из падающего света поглощены красный и зеленый компоненты. Подобным образом, комбинация голубых и желтых чернил дает зеленый свет, а комбинация пурпурных и желтых — красный.
988 Глава 12. Модели цвета и применение цвета Рис. 12.14. Модель цвета CMY. Точки внутри единичного куба описываются вычитанием из белого цвета заданных доз основных цветов В процессе печати CMY часто используется набор капель четырех чернил, кото- рые располагаются очень близко, подобно тому, как в RGB-мониторе используются три люминофорные точки. Таким образом, на практике модель цвета CMY называет- ся моделью CMYK, где К — это параметр черного цвета. Для каждого из основных цветов (cyan, magenta и yellow) используется своя чернильница, и еще в одной содер- жатся черные чернила. Последняя чернильница нужна потому, что отраженный свет от смеси голубого, пурпурного и желтого чернил обычно дает только оттенки серого. Некоторые плоттеры позволяют получать различные комбинации цветов, разбрызги- вая чернила трех основных цветов. Для черно-белой, или полутоновой (gray-scale), печати используется только черная чернильница. ПРЕОБРАЗОВАНИЯ МЕЖДУ ПРОСТРАНСТВАМИ CMY И RGB Переход от RGB-представления в систему CMY можно описать следующим матрич- ным преобразованием: (12.11) где белая точка в пространстве RGB представлена единичным вектором-столбцом. При переходе от CMY-представления в систему RGB используется матричное преоб- разование (12.12) В этом преобразовании единичный вектор-столбец представляет черную точку в про- странстве цветов CMY.
12.7. Модель цвета HSV 989 а) цветовой куб RGB Зеленый Красный б) шестиугольник цвета Рис. 12.15. Куб цве- тов RGB, наблюдае- мый вдоль диагона- ли, идущей от бе- лого к черному (па- нель а), контур куба имеет форму шести- угольника (панель б) Для преобразования из RGB в CMYK вначале нужно положить К = max(/?., G, В). Далее К вычитается из С, М и Y в уравнении (12.11). Подобным образом для преобразования из CMYK в RGB выбирается К = m'm(R, G, В), затем К вычитается из R, G и В согласно уравнению (12.12). На практике данные уравнения часто модифицируются с целью улучшения качества печати в конкретной системе. 12.7. МОДЕЛЬ ЦВЕТА HSV В интерфейсах выбора цвета часто используется модель цвета, основанная на инту- итивных концепциях, а не на наборе основных цветов. Отметим, что спецификацию цвета в интуитивной модели можно дать, выбирая спектральный цвет и долю белого и черного, которую нужно добавить к этому цвету, чтобы получить различные тени, оттенки и тона (раздел 12.2). ПАРАМЕТРЫ HSV Параметрами цвета в этой модели являются оттенок (hue — Н), насыщенность (satu- ration — S') и значение (value — V). Чтобы ввести это трехмерное пространство цветов, параметры HSV связываются с направлениями RGB-куба. Если представить, что мы смотрим на куб вдоль диагонали от белой вершины к черной (началу координат), контур куба будет иметь форму шестиугольника (рис. 12.15). Границы шестиуголь- ника представляют различные оттенки, а сам он используется в качестве основания шестиугольного конуса (рис. 12.16). В пространстве HSV насыщенность S измеря- ется вдоль горизонтальной оси, а значения параметра V — вдоль вертикальной оси, проходящей через центр шестиугольника. Оттенок представляется как угол, отсчитываемый от вертикальной оси и меняю- щийся от 0° (красный) до 360°. Вершины шестиугольника разделены интервалами по 60°. Желтому цвету соответствует 60°, зеленому — 120°, голубому (противополож- ность красного) — Н = 180°. Вообще, все дополнительные цвета отличаются на 180°.
990 Глава 12. Модели цвета и применение цвета Рис. 12.16. Шестиугольный конус HSV Параметр насыщения S используется для обозначения чистоты цвета. Чистый (спектральный) цвет имеет значение S = 1,0, и значения S уменьшаются к шкале полутонов (51 = 0) в центре шестиугольного конуса. Значение V меняется от 0 в вершине конуса (черная точка) до 1,0 в плоскости основания, где цвета имеют максимальную интенсивность. При V = 1,0 и S = 1,0 имеем чистые оттенки. Белой точке соответствуют значения параметров V = 1,0 и S — 0. Отметим, что для большинства пользователей эта модель выбора цветов является более удобной. Начав с выбора чистого оттенка, который задает угол оттенка Н, и положив V = S = 1,0, мы описываем искомый цвет, добавляя к имеющемуся оттенку белый либо черный цвет. Прибавление черного уменьшает значение V при постоянном S. Чтобы получить темно-синий цвет, например, V, нужно положить равным 0,4 при S = 1,0 и Н = 240°. Подобным образом, если к выбранному оттенку нужно добавить белый цвет, при постоянном V уменьшается параметр S. Светло-синий цвет можно получить при S = 0,3 и V = 1,0, Н = 240°. Если к цвету прибавить немного белого и немного черного, это приводит к уменьшению V и S. В интерфейсе к описанной модели параметр HSV обычно можно выбирать с помощью палитры цветов, содержащей ползунки и цветовой круг. ВЫБОР ТЕНЕЙ, ОТТЕНКОВ И ТОНОВ В плоскости сечения пирамиды HSV, показанной на рис. 12.17, представляются обла- сти цвета для выбора теней, оттенков и тонов. Прибавление черного к спектральному
12.7. Модель цвета HSV 991 Рис. 12.17. Сечения конуса HSV, демонстрирующие те- ни, оттенки и тона цвету уменьшает V вдоль стороны конуса в направлении черной точки. Следователь- но, различные тени представлены значениями /э = 1,0 и 0,0 < V <1,0. Прибавление белого к спектральным цветам дает оттенки вдоль плоскости основания конуса, где значения параметров равны V = 1,0 и 0 < S < 1,0. Для получения различных тонов к спектральным цветам прибавляется и черный, и белый цвет, что дает точки, лежащие в треугольном сечении конуса. Человеческий глаз способен различить около 128 тонов и 130 оттенков (уровней насыщения). Для каждого из них можно определить несколько теней (значений), в зависимости от выбранного оттенка. Для желтого цвета можно различить порядка 23 теней, для синего цвета это число составляет 16. Это означает, что всего человеческий глаз может различить 128 х 130 х 23 = 382 720 цветов. Для большинства графических приложений достаточно 128 оттенков, 8 уровней насыщенности и 16 значений. При таких диапазонах параметров модель HSV предлагает пользователю 16 384 цветов. Для хранения этих цветов можно использовать 14 (или меньше) бит на пиксель и таблицы кодов цвета. ПРЕОБРАЗОВАНИЯ МЕЖДУ ПРОСТРАНСТВАМИ ЦВЕТОВ HSV И RGB Чтобы определить операции, требуемые для перехода между пространствами HSV и RGB, рассмотрим вначале, как конус HSV можно построить из куба RGB. Диагональ RGB-куба, идущая от черного (начало координат) к белому, соответствует оси V ко- нуса. Кроме того, каждый подкуб куба RGB соответствует шестиугольному сечению конуса. На любом сечении все стороны шестиугольника и все радиальные линии от оси V к любой вершине имеют постоянное значение V. Следовательно, для любо- го набора значений RGB V равно значению максимального компонента RGB. Точка HSV, соответствующая этому набору значений RGB, лежит на шестиугольном сече-
992 Глава 12. Модели цвета и применение цвета нии, характеризуемом значением V. Далее определяется параметр S — относительное расстояние от этой точки до оси V. Параметр Н вычисляется как относительное по- ложение точки в каждом секстанте шестиугольника. Алгоритм отображения любого набора RGB-значений в соответствующие HSV-значения реализован в приведенной ниже процедуре. class rgbSpace {public: float r, g, b;}; class hsvSpace {public: float h, s, v;}; const float noHue = -1.0; inline float minffloat a, float b) {return (a < b)? a : b;} inline float maxffloat a, float b) {return (a > b)? a : b;} void rgbTOhsv (rgbSpace& rgb, hsvSpace& hsv) { /* Значения RGB и HSV принадлежат диапазону 0-1,0 */ float minRGB = min (r, min (g, b)), maxRGB = max (r, max (g, b)); float deltaRGB = maxRGB - minRGB; v = maxRGB; i f (maxRGB != 0.0) s = deltaRGB / maxRGB; else s = 0.0; if (s <= 0.0) h = noHue; else { if (r == maxRGB) h = (g - b) / deltaRGB; else if (g == maxRGB) h = 2.0 + (b-r) / deltaRGB; else if (b == maxRGB) h=4.0+ (r-g) / deltaRGB; h *= 60.0; if (h < 0.0) h += 360.0; h /= 360.0; } Преобразование из пространства HSV в пространство RGB определяется обрат- ными операциями, которые выполняются для каждого секстанта конуса. Окончатель- ные уравнения преобразования сведены в представленном ниже алгоритме.
12.8. Модель цвета HLS 993 class rgbSpace {public: float r, g, b;}; class hsvSpace {public: float h, s, v; }; void hsvTOrgb (hsvSpace& hsv, rgbSpace& rgb) { /* Значения HSV и RGB принадлежат диапазону 0-1,0 */ int к float aa, bb, cc, f; if ( s <= 0.0) r = g = b = v; // Если s = 0, получаем шкалу полутонов, else { if (h == 1.0) h = 0.0; h *= 6.0; к = floor (h); f = h - k; аа = v * (1.0 - s); bb = V * (1.0 - (s * f)) ; СС = V switch { * (1.0 (k) - (s * (1.0 - f) )) ; case 0: r = v; g = cc; b = aa; break; case 1: r = bb; g = v; b = aa; break; case 2: r = aa; g = v; b = cc; break; case 3: r = aa; g = bb; b = v; break; case 4: r = cc; g = aa; b = v; break; case 5: r = v; g = aa; b = bb; break; } } } 12.8. МОДЕЛЬ ЦВЕТА HLS Другая модель, основанная на интуитивных параметрах цвета, — это система HLS, ис- пользуемая Tektronix Corporation. Данное пространство цветов представляется в виде двойного конуса, изображенного на рис. 12.18. Три параметра этой модели называют- ся оттенком (hue — Н), яркостью (lightness — L) и насыщенностью (saturation — S). Оттенок имеет то же значение, что и в модели HSV. Он задает угол относительно вертикальной оси, определяющий спектральный цвет. В этой модели Н = 0° соот- ветствует синему цвету. Оставшиеся цвета задаются по периметру конуса в том же порядке, что и в модели HSV. Пурпурному соответствует 60°, красному — 120° и голубому Н = 180°. Как и ранее, дополнительные цвета разделены углом 180°. Вертикальная ось в этой модели названа яркостью (lightness — L). При L = 0 получаем черный цвет, белому соответствует L = 1,0. Полутоновые значения распо- ложены вдоль оси L, а чистые цвета лежат на плоскости L = 0, 5.
994 Глава 12. Модели цвета и применение цвета Рис. 12.18. Двойной конус HLS Параметр насыщенности S снова задает чистоту цвета, и его значения меняют- ся от 0 до 1,0, чистыми являются цвета, для которых S = 1,0 и L = 0,5. При уменьшении S к цвету прибавляется больше белого цвета. Линии полутонов соот- ветствует S = 0. Чтобы задать цвет, вначале выбирается угол оттенка Н. Далее определенная тень или тон этого оттенка получается выбором параметров L и S. Чтобы получить бо- лее светлый цвет, увеличивается L, а для получения более темного L уменьшается. При уменьшении S пространственная точка, описывающая цвет, движется к линии полутонов.
12.10. Резюме 995 12.9. ВЫБОР ЦВЕТА И ПРИЛОЖЕНИЯ Графический пакет может максимально облегчить выбор цвета. Например, интер- фейс может содержать ползунки или цветовые круги, вместо того, чтобы требовать от пользователя задать все спецификации цвета как численные значения компонен- тов RGB. Кроме того, несколько облегчить выбор гармоничных комбинаций цветов позволяют указания по выбору основных цветов. Одним методом получения набора координатных цветов является генерация ком- бинации цветов из небольшого подпространства модели цвета. Если цвета выбраны через равные интервалы вдоль прямой линии в кубе RGB или CMY, например, можно ожидать, что получится набор хорошо сочетаемых цветов, а случайно выбранные от- тенки дадут контрастные и дисгармонирующие комбинации. Другим соображением, которое стоит рассмотреть при отображении цвета, является тот факт, что человек ощущает цвета на различных глубинах. Это происходит потому, что наши глаза фо- кусируются на цветах согласно их частоте. Оттенки синего, в частности, кажутся расположенными дальше. Показ синего изображения рядом с красным может приве- сти к зрительному утомлению, поскольку мы должны постоянно перефокусировать взгляд, когда наше внимание переключается из одной области в другую. Чтобы сгла- дить данную проблему, можно разнести выбранные цвета или использовать цвета, расстояние между которыми не больше половины шестиугольника цветов в моде- ли HSV. Учитывая сказанное, гармоничное изображение должно содержать синие и зеленые тона, либо красные и желтые. Общее правило — чем меньше используется цветов, тем лучше выглядит изобра- жение. Кроме того, совмещать на экране лучше оттенки и тени, чем чистые цвета. Для фона оптимальным обычно является серый цвет или цвет, дополнительный к цвету переднего плана. 12.10. РЕЗЮМЕ Свет можно описать как электромагнитное излучение с некоторым распределени- ем энергии, распространяющееся через пространство, и цветовые компоненты света соответствуют частотам из узкой полосы электромагнитного спектра. Однако свет имеет и другие свойства, и, чтобы охарактеризовать различные аспекты света, можно использовать разные параметры. Физические свойства видимого излучения можно объяснить, опираясь на корпускулярно-волновой дуализм света. Человеческое вос- приятие источника света можно охарактеризовать, используя такие термины, как преобладающая частота (оттенок), светимость (яркость) и чистота (насыщенность). Цветностью называется суммарное восприятие оттенка и чистоты цвета.
996 Глава 12. Модели цвета и применение цвета Модели цвета используются также для объяснения эффектов объединения ис- точников света. Чтобы определить модель цвета, можно задать набор нескольких основных цветов, комбинации которых дают другие цвета. В то же время, ни один конечный набор основных цветов не позволяет получить все цвета или описать все характеристики цвета. Набор цветов, который можно получить с помощью основных цветов, называется цветовой гаммой. Цвета, объединение которых дает белый свет, называются дополнительными. В 1931 году Международная комиссия по освещению (Commission International d’Eclairage — CIE, МКО) приняла в качестве стандарта набор из трех гипотетических функций подбора цветов. Этот набор цветов называется моделью XYZ, где X, Y и Z представляют дозы каждого цвета, необходимые для подбора любого цвета из элек- тромагнитного спектра. Структура функций подбора цветов такова, что все функции положительны, и значение Y представляет для любого цвета значение яркости. Нор- мированные значения X и Y, обозначаемые хну, используются для отображения всех спектральных цветов на диаграмме цветности МКО. Эту диаграмму можно ис- пользовать для сравнения цветовых гамм различных моделей цветов и определения дополнительных цветов или преобладающих частот и чистоты данного цвета. Другими моделями цвета, основанным на наборе из трех основных цветов, явля- ются RGB, YIQ и CMY. Модель RGB используется для описания цветов, отображен- ных на мониторе. Модель YIQ используется для описания составного видеосигнала в телевизионном вещании. Наконец, модель CMY используется для описания цвета на устройствах выдачи документальных копий. В пользовательских интерфейсах для выбора цветов часто применяются такие интуитивные модели цвета, как HSV и HLS. При этих моделях цвет задается как смесь выбранного оттенка с определенным количеством белого и черного. Прибавление черного дает темные цвета, прибавление белого — светлые оттенки, а прибавление черного и белого позволяет получить тона. При разработке эффективных изображений выбор цвета является важным факто- ром. Чтобы избежать дисгармонирующих комбинаций цветов, можно выбрать сосед- ствующие цвета, не сильно отличающиеся по преобладающей частоте. Кроме того, комбинации цветов можно выбирать из небольшого подпространства модели цвета. Общее правило — небольшое число комбинаций цветов, сформированных с помощью оттенков и теней, дает более гармоничное изображение, чем чистые тона. i ЛИТЕРАТУРА Понятное обсуждение науки цвета предлагается в книге [403]. Модели цвета и методы цветного отображения рассмотрены в публикациях [85, 140, 149, 307, 327, 358]. Алгоритмы различных применений цвета представлены в сборниках [8, 122, 151, 176, 244]. Для получения дополнительной информации о зрительной системе человеке и восприятии света и цвета рекомендуем обратиться к книге [124].
7 I | Упражнения 997 | MB УПРАЖНЕНИЯ 112.1. Выведите выражения для преобразования параметров RGB в значения HSV. 12.2. Выведите выражения для преобразования значений HSV в значения RGB. 112.3. Разработайте интерактивную процедуру, позволяющую выбирать параметры цвета HSV из отображенного меню; затем значения HSV должны превращаться в значения RGB для записи в буфер кадра. 12.4. Напишите программу выбора цветов с использованием набора трех ползунков для выбора значений параметров HSV. 12.5. Модифицируйте программу из предыдущего упражнения для отображения численных зна- чений RGB-компонентов выбранного цвета. 12.6. Модифицируйте программу из предыдущего упражнения для отображения в небольших окнах RGB-компонентов и суммарного цвета. 12.7. Выведите выражения для преобразования параметров RGB в параметры HLS. 12.8. Выведите выражения для преобразования значений HLS в значения RGB. 12.9. Напишите программу, выдающую набор цветов, являющихся линейной интерполяцией двух заданных точек пространства RGB. 12.10. Разработайте интерактивную процедуру выбора значений цветов из заданного подпростран- ства RGB-пространства. 12.11. Напишите программу, выдающую набор цветов, являющихся линейной интерполяцией двух заданных точек пространства HSV. 12.12. Составьте программу, выдающую набор цветов, являющихся линейной интерполяцией двух заданных точек пространства HLS. 12.13. Напишите программу, отображающую два соседних прямоугольника в цветах RGB. Заполни- те один прямоугольник набором случайно выбранных точек-цветов RGB, а другой — набором точек, выбранных из меньшего подпространства RGB. Поэкспериментируйте с различными случайными выборами и подпространствами с целью сравнения двух цветовых растров. 12.14. Отобразите два прямоугольника цветов из предыдущего упражнения, используя выбор цве- тов из пространства HSV или HLS.
в 3 Компьютерная анимация Изображение лица с трансформированными чертами (перепечатано с разрешения Vertigo Technology, Inc.)
13.1. Растровые методы компьютерной анимации 13.2. Разработка анимационных последовательностей 13.3. Традиционные методы анимации 13.4. Общие функции компьютерной анимации 13.5. Языки компьютерной анимации 13.6. Системы ключевых кадров 13.7. Спецификация движения 13.8. Анимация каркасной фигуры 13.9. Периодическое движение 13.10. Процедуры анимации OpenGL 13.11. Резюме В настоящее время методы компьютерной графики широко используют- ся для анимации в различных сферах, включая индустрию развлечений (кино и мультфильмы), рекламу, научные и инженерные исследования, обучение и образование. Хотя мы привыкли думать об анимации как о понятии, подразумевающем движение объектов, термином компьютерная анима- ция обычно называют любую последовательность видимых изменений изображения. Помимо изменения положения объекта путем трансляции или вращения, компьютер- ная анимация может отображать изменение во времени размера объекта, его цвета, степени прозрачности и текстуры поверхности. В анимации в рекламе часто исполь- зуется преобразование одного объекта в другой: например, преобразование бутылки машинного масла в мотор автомобиля. Кроме того, компьютерную анимацию можно получать, меняя такие параметры камеры, как положение, ориентация или фокусное расстояние. Кроме того, для получения компьютерной анимации можно менять эф- фекты освещения или другие параметры, связанные с освещением и визуализацией. Другим моментом, который стоит отметить при рассмотрении компьютерной ани- мации, является реализм. Многие приложения требуют реалистичных изображений. Точное представление формы молнии или других природных явлений, описываемых численной моделью, важно для оценки достоверности модели. Aia логично трена- жеры пилотов и операторов тяжелой техники должны давать разумно точное пред- ставление окружающей среды. С другой стороны, работники области рекламы или индустрии развлечений иногда более заинтересованы в визуальных эффектах. Сле- довательно, сцены могут отображаться с гипертрофированными формами и нере-
1000 Глава 13. Компьютерная анимация альными движениями и преобразованиями. Впрочем, в сфере рекламы и индустрии развлечений есть множество приложений, которые все же требуют точного представ- ления компьютерных сцен. Кроме того, в некоторых научных и инженерных исследо- ваниях реализм не требуется. Например, физические величины часто отображаются в псевдоцвете или с абстрактными формами, меняющимися со временем, помогая исследователю понять природу физического процесса. Двумя базовыми методами построения последовательности изображений движе- ния является анимация реального времени и покадровая анимация. В компьютерной анимации реального времени сцены последовательности изображаются по мере ге- нерации. Таким образом, анимацию нужно генерировать со скоростью, совместимой с ограничениями, наложенными частотой обновления. При покадровой анимации каждый кадр сцены движения генерируется и записывается отдельно. Позже кадры можно записать в фильм или же последовательно отобразить на мониторе в режиме “в оспроизведения в реальном времени”. Простые анимационные сцены обычно гене- рируются в реальном времени, тогда как более сложная анимация требует медленного покадрового построения. В то же время, некоторые приложения требуют анимации в реальном времени независимо от ее сложности. Например, анимация симулятора полетов выполняется в реальном времени, поскольку изображение на мониторе нуж- но сгенерировать немедленно после изменения настроек управляющих сигналов. В подобных случаях часто разрабатываются специальные аппаратные и программные системы, позволяющие быстро выводить на экран сложные последовательности. 13.1. РАСТРОВЫЕ МЕТОДЫ КОМПЬЮТЕРНОЙ АНИМАЦИИ В большинстве случаев простые анимационные последовательности можно созда- вать, используя методы реального времени. Однако в общем случае анимационная последовательность в системе с растровой разверткой создается по одному кадру за раз, так что каждый законченный кадр можно сохранить в файле для будущего про- смотра. После этого для просмотра анимации последовательно воспроизводится пол- ная последовательность кадров, или же кадры переводятся в фильм. Впрочем, если требуется сгенерировать анимацию в реальном времени, кадры картины необходи- мо создавать достаточно быстро, чтобы непрерывно отображать последовательность движения. Для сложной сцены построение одного кадра анимации может занимать большую часть времени цикла обновления. В этом случае объекты, сгенерированные вначале, будут отображаться в течение почти всего времени цикла обновления, но объекты, сгенерированные к концу цикла обновления, исчезнут почти сразу же после того, как были отображены. Кроме того, для очень сложных сцен время построения кадра может быть больше времени обновления экрана, что приведет к неравномерно-
13.1. Растровые методы компьютерной анимации 1001 му движению и ломаным изображениям кадров. Поскольку изображение на дисплее генерируется по последовательно модифицируемым значениям пикселей в буфере ре- генерации, то, чтобы быстро получать последовательности движения, можно сыграть на некоторых особенностях процесса растрового обновления экрана. ДВОЙНАЯ БУФЕРИЗАЦИЯ Один из методов получения анимации в реальном времени в растровой системе — это использовать два буфера регенерации. Изначально в одном буфере формируется кадр анимационной последовательности. Далее при обновлении экрана изображени- ем из этого буфера в другом буфере строится следующий кадр. После завершения кадра роли двух буферов меняются, так что в процедурах обновления задействуется второй буфер, а в первом буфере в это время создается следующий кадр. Данный процесс чередования буферов продолжается до отображения всей анимации. Графи- ческие библиотеки, допускающие подобную работу, обычно имеют одну функцию для активизации процедур двойной буферизации и одну — для обмена ролей двух буферов. Когда отдана команда переключить роли двух буферов, обмен может выполняться в различные моменты времени. Наиболее очевидная реализация — это поменять роли в конце текущего цикла обновления при обратном ходе кадровой развертки элек- тронного луча. Если программа может построить кадр за время цикла обновления, скажем, секунды, все последовательности движения отображаются синхронно с частотой обновления экрана. Однако, если время построения кадра больше време- ни обновления, текущий кадр отображается за несколько циклов обновления, а при этом генерируется следующий кадр анимации. Например, если частота обновления экрана — 60 кадров в секунду, а построение кадра требует секунды, каждый кадр отображается на экране дважды, и скорость анимации равна всего 30 кадрам в секун- ду. Таким образом, если время построения кадра равно секунды, частота анимации снижается до 20 кадров в секунду, поскольку каждый кадр отображается трижды. Если время построения кадра очень близко к величине, кратной времени обнов- ления экрана, то при двойной буферизации могут возникать нерегулярные частоты анимации. Проиллюстрируем сказанное на примере. Допустим, частота обновления экрана — 60 кадров в секунду, а время построения кадра почти равно с или с, или с и т.д. В этой ситуации возможна неравномерная частота отображения анима- ционных кадров. Из-за небольших изменений времени реализации процедур, генери- рующих примитивы и их параметры, построение некоторых кадров может требовать несколько большего или меньшего времени. Следовательно, частота анимационных кадров может меняться резко и неравномерно. Для компенсации этого эффекта в про- грамму можно вводить небольшую временную задержку. Другое средство — изменить описание сцены движения, чтобы сократить время построения кадра.
1002 Глава 13. Компьютерная анимация Рис. 13.1. Растровая анимация в реальном времени с исполь- зованием таблицы цветов СОЗДАНИЕ АНИМАЦИИ С ПОМОЩЬЮ РАСТРОВЫХ ОПЕРАЦИЙ В небольшом числе приложений растровые анимации в реальном времени можно генерировать, используя блочную передачу прямоугольного массива значений пиксе- лей. Данный метод анимации часто используется в игровых программах. Как было показано в разделе 5.6, чтобы просто транслировать объект из одной точки в другую на плоскости ху, можно передать группу значений пикселей, определяющих форму объекта, в новое положение. Двухмерные повороты на угол, кратный 90°, также легко реализовать, хотя, используя процедуры сглаживания, прямоугольные блоки пикселей можно поворачивать и на другие углы. Для поворота, не кратного 90°, необходимо оценить процент площади, занятой пикселями, которые накладываются на повора- чиваемый блок. Для анимации в реальном времени двух- или трехмерных объектов можно использовать последовательности растровых операций, если ограничить ани- мацию движением в проекционной плоскости (в таких случаях не нужно вызывать алгоритмы проектирования или определения видимых поверхностей). Кроме того, можно анимировать объекты вдоль двухмерных траекторий движе- ния, применяя преобразования с использованием таблицы цветов. В этом случае объект предопределяется в последовательных точках вдоль траектории движения, и в позиции таблицы цветов устанавливаются последовательные блоки значений пиксе- лей. Пикселям в первом положении объекта задается цвет изображения, а пикселям в других положениях объекта присваивается цвет фона. Анимация заключается в изменении значений таблицы цветов так, чтобы цвет объекта в последовательных по- ложениях вдоль траектории анимации становился цветом изображения, а предыдущее положение перекрашивалось в цвет фона (рис. 13.1). 13.2. ПРОЕКТИРОВАНИЕ АНИМАЦИОННЫХ СЮЖЕТОВ Построение анимационной последовательности может быть сложной задачей, осо- бенно если она включает сюжетную линию и несколько объектов, каждый из которых может двигаться по-своему. Стандартный подход — разрабатывать подобные сюжеты, используя следующий план:
13.2. Проектирование анимационных сюжетов 1003 Рис. 13.2. Один кадр из компьютерного ко- роткометражного мультфильма Luxo Jr. Дан- ный фильм спроектирован с использованием системы ключевых кадров и техники мульти- пликационной анимации, позволяющей по- лучить правдоподобные действия лампы. За- ключительные изображения визуализирова- лись с использованием нескольких источни- ков света и методов процедурного текстури- рования (перепечатано с разрешения Pixar. © 1986, Pixar) • схема раскадровки; • определение объектов; • спецификация ключевых кадров; • генерация промежуточных кадров. Раскадровка (storyboard) — это схема действия. Она определяет последователь- ность движения как набор базовых событий, которые должны произойти. В зависи- мости от типа анимации раскадровка может состоять из набросков (эскизов) вместе с кратким описанием движения или быть просто списком основных идей, которые будут реализованы в действии. Изначально набор эскизов движения прикреплялся на большую доску, которая представляла общий вид анимационного проекта. Отсюда и пошло название — “storyboard” (от англ, “story”— история, сюжет, “board” — доска). Для каждого участника действия дается определение объекта. Объекты могут определяться через базовые формы, такие как многоугольники или сплайновые по- верхности. Кроме того, часто дается описание движения, которое должен совершить каждый персонаж или объект сюжета. Ключевой кадр — это подробное изображение сцены в определенный момент ани- мационной последовательности. В каждом ключевом кадре все объекты (или симво- лы) размещаются согласно времени этого кадра. Одни ключевые кадры выбираются в крайних положениях действия; другие размещаются так, чтобы интервал между клю- чевыми кадрами не был слишком большим. Для сложных движений задается больше ключевых кадров, чем для простых, медленно меняющихся. За разработку ключевых кадров обычно отвечают старшие аниматоры и часто каждый персонаж мультфильма курирует отдельный аниматор. Промежуточными называются кадры, расположенные между ключевыми. Общее число кадров, а следовательно, общее число промежуточных кадров, необходимых для создания анимации, определяется средой, в которую планируется отображать анимацию. Фильм требует 24 кадров в секунду, а графические терминалы обновля-
1004 Глава 13. Компьютерная анимация Рис. 13.3. Кадр из короткометражного филь- ма Tin Toy, первого фильма с компьютерной анимацией, получившего “Оскар”. Разрабо- танный с использованием системы анимации на базе ключевых кадров данный фильм так- же потребовал значительного моделирова- ния выражений лица. Заключительные изоб- ражения визаулизировались с использовани- ем процедурного затенения, методов самоза- тенения (self-shadowing), размытости движе- ния (motion blur) и текстурного отображения (texture mapping) (перепечатано с разреше- ния Pixar. © 1988, Pixar) ются с частотой 60 или более кадров в секунду. Обычно временные рамки движения задаются так, чтобы между каждой парой ключевых кадров располагалось 3-5 проме- жуточных кадров. В зависимости от скорости движения некоторые ключевые кадры могут дублироваться. В качестве примера укажем, что минутный фильм без дублиро- вания требует 1 440 кадров. Если между каждой парой вводится пять промежуточных кадров, потребуется разработать 288 ключевых кадров. В зависимости от приложения может потребоваться еще несколько работ. В число данных дополнительных задач входит проверка и редактирование движения, а также создание и синхронизация звуковой дорожки. Многие функции, необходимые для со- здания полной анимации, теперь выполняются с помощью компьютера. На рис. 13.2 и 13.3 приведены примеры кадров анимационной последовательности, сгенерирован- ных компьютером. 13.3. ТРАДИЦИОННЫЕ МЕТОДЫ АНИМАЦИИ Аниматоры фильмов используют множество методов, позволяющих изображать и выделять последовательности движения. Эти методы включают деформацию объекта, увеличение расстояния между кадрами анимации, ожидание и завершение движения, а также фокусировку внимания на действии. Одной из важнейших техник имитации эффектов ускорения, особенно для нежестких объектов, является метод “растянуть и сплющить" (squash and stretch). Использование этой техники для акцентирования внимания на ускорении и замед- лении прыгающего мяча иллюстрируется на рис. 13.4. При ускорении мяч начинает вытягиваться. Когда мяч ударяется об пол и останавливается, он вначале сжимается (сплющивается), а затем снова растягивается, ускоряясь в прыжке вверх.
13.3. Традиционные методы анимации 1005 Рис. 13.4. Прыгающий мяч, иллюстри- рующий метод “растянуть и сплющить”, позволяющий акцентировать внимание на ускорении объекта 0 Рис. 13.5. Изменение положения между кадрами движения для прыгающего мяча увеличивается с увеличением скорости мяча Другим методом, используемым аниматорами, является выбор времени (timing) — изменение расстояния между кадрами движения. Медленно движущийся объект пред- ставляется более тесно расположенными кадрами, а объект, перемещающийся быст- рее, отображается меньшим числом кадров на траектории движения. Данный эффект иллюстрируется на рис. 13.5, где изменение положения между кадрами увеличивается при ускорении движения мяча. Движение объекта также можно выделить, создав предварительные действия, указывающие на ожидание грядущего движения. Например, мультипликационный персонаж наклоняется вперед, и его тело начинает вращаться, а лишь затем он на- чинает бежать. Рука персонажа может “намо тать” несколько оборотов перед броском мяча. Aia логично для выделения предыдущего движения можно использовать завер- шающие действия. После броска мяча рука персонажа может продолжать движение (размах) к его телу. Или же со внезапно остановившегося персонажа может слететь шляпа. Кроме того, чтобы акцентировать внимание на действии, можно использовать тонирование — метод фокусирования внимания на важной части сцены, например, на персонаже, который что-то прячет.
1006 Глава 13. Компьютерная анимация Рис. 13.6. Степени свободы стационарного однорукого робота 13.4. ОБЩИЕ ФУНКЦИИ КОМПЬЮТЕРНОЙ АНИМАЦИИ Многие программные пакеты разрабатывались либо для общего проектирования ани- мации, либо для выполнения специализированных задач. Типичные функции анима- ции включают управление движением объекта, генерацию проекций объекта, созда- ние движения камеры и генерацию промежуточных кадров. Одни пакеты анимации, например, Waxefront, предлагают специальные функции как для общего проектиро- вания анимации, так и для обработки отдельных объектов. Другие являются спе- циализированными пакетами, предназначенными для выполнения отдельных задач, например, генерации промежуточных кадров или анимации рисунков. В пакете общей анимации часто присутствует набор процедур для записи ба- зы данных объекта и управления ею. Формы объектов и сопутствующие параметры записываются в базу данных и обновляются в ней. Другие функции, относящиеся к работе с объектами, включают функции для генерации движения объекта и визуализа- ции его поверхностей. Движение может генерироваться согласно заданным условиям с использованием двух- или трехмерных преобразований. После этого можно приме- нять стандартные функции, чтобы определить видимые поверхности и использовать алгоритмы визуализации. Другой типичный набор функций имитирует движение камеры. Стандартными движениями камеры являются наезд, панорамирование и наклон. Наконец, для дан- ной спецификации ключевых кадров могут автоматически генерироваться промежу- точные кадры. 13.5. ЯЗЫКИ КОМПЬЮТЕРНОЙ АНИМАЦИИ При необходимости можно разработать процедуры создания и управления анимаци- онными последовательностями на универсальном (С, C++, Lisp или Fortran) или специализированном языке программирования. Эти языки обычно включают графи- ческий редактор, генераторы ключевых и промежуточных кадров, стандартные гра-
13.5. Языки компьютерной анимации 1007 Рис. 13.7. Трансляционная и вращательная степени свободы основания “руки” робота фические процедуры. Графический редактор позволяет аниматору разрабатывать и модифицировать формы объектов, используя сплайновые поверхности, методы кон- структивной блочной геометрии или другие схемы представления. При спецификации анимации очень важно правильно описать сцену, т.е. раз- местить объекты и источники освещения, определить фотометрические параметры (интенсивности излучения источника и параметры освещенности поверхности) и установить параметры камеры (положение, ориентацию и характеристики линз). Дру- гая стандартная функция — спецификация действия, включающая схему траекторий движения объектов и камеры. Кроме того, требуются обычные графические проце- дуры: преобразование изображения путем изменения точки обзора и перспективное преобразование, геометрические преобразования, определяющие движение объекта как функцию ускорения или кинетических спецификаций траектории, определение видимых поверхностей и операции по визуализации поверхностей. Системы ключевых кадров изначально представляли собой отдельный набор процедур анимации, предназначенных для генерации промежуточных кадров по за- данным пользователем ключевым кадрам. В настоящее время данные процедуры часто являются компонентом более общего пакета анимации. В простейшем случае каждый объект сцены определяется как набор объемных тел, соединенных в некото- рых точках и имеющих ограниченное число степеней свободы. В качестве примера рассмотрим “однорукого” робота на рис. 13.6: он имеет шесть степеней свободы, которые называются захват “рукой” (arm sweep), наклон в “плече” (shoulder swi\el), удаление “локтя” (elbow extension), раскачка (pitch), сгибание в “запястье” (yaw) и крен (roll). Число степеней свободы данной руки можно расширить до девяти, разрешив трехмерную трансляцию ее основания (рис. 13.7). Если, к тому же, раз- решить вращение основания, ‘)>ука” робота будет иметь 12 степеней свободы. Для сравнения — человеческое тело имеет более 200 степеней свободы. Параметризованные системы позволяют, определяя объект, задавать характе- ристики его движения. Настраиваемые параметры контролируют такие характери- стики объекта, как степени свободы, ограничения движения и допустимые измене- ния формы. Системы сценариев позволяют определять спецификации объекта и анимацион- ные последовательности в форме сценариев, вводимых пользователем. По сценарию создается библиотека различных объектов и движений.
1008 Глава 13. Компьютерная анимация 13.6. СИСТЕМЫ КЛЮЧЕВЫХ КАДРОВ Несколько заданных ключевых кадров позволяют сгенерировать набор промежуточ- ных кадров с помощью системы ключевых кадров. Пути движения задаются в виде кинематического описания (как набор сплайновых кривых), или движение может фи- зически основываться на заданных силах, действующих на анимируемые объекты. Для сложных сцен кадры разбиваются на отдельные компоненты или объекты, именуемые келями (cel, celluloid transparency — диапозитив кинофильма). Данный термин пришел из мультипликационных технологий, где фон и каждый персонаж на сцене размещались на различных диапозитивах. Затем диапозитивы выстраивались в порядке от фона до переднего плана, фотографировались, и получался полный кадр. Затем использовались заданные пути анимации и получался следующий кель для каждого персонажа, положения которых интерполировались по информации с ключевых кадров. При преобразовании сложных объектов их формы могут меняться со временем. Примеры — одежда, детали лица, увеличенные детали, изменяющиеся формы и взры- вающиеся или распадающиеся объекты. Для поверхностей, описанных многоуголь- ной сеткой, данные изменения могут привести к значительным изменениям формы многоугольников, так что число углов может быть разным для соседних кадров. Эти преобразования включаются в разработку промежуточных кадров, для чего согласно требованиям заданных ключевых кадров добавляются или удаляются стороны мно- гоугольников. ТРАНСФОРМАЦИЯ Преобразование форм объектов называется трансформацией (morphing, сокр. от meta- morphosis — метаморфоза). Для моделирования трансформации в соседних ключевых кадрах меняются формы многоугольников, а в промежуточных кадрах это выглядит как переход одной формы в другую. Для двух данных ключевых кадров с разным числом отрезков, задающих пре- образование объекта, вначале можно так выравнять спецификацию объекта в одном кадре, чтобы число сторон многоугольника (или число его вершин) было одинако- вым для двух кадров. Данный процесс предварительной обработки иллюстрируется на рис. 13.8. Отрезок в ключевом кадре к переходит в два отрезка в ключевом кадре к + 1. Поскольку ключевой кадр к + 1 имеет лишнюю вершину, в ключевом кадре к вводится дополнительная вершина между 1 и 2, чтобы уравнять число вершин (и сторон) в двух ключевых кадрах. Используя линейную интерполяцию для генерации промежуточных кадров, дополнительную вершину в ключевом кадре к переводим в вершину 3' по прямолинейной траектории, показанной на рис. 13.9. На рис. 13.10 приведен пример треугольника, линейно расширяющегося до четырехугольника. На рис. 13.11 и 13.12 приведены примеры трансформации в телевизионной рекламе.
13.6. Системы ключевых кадров 1009 I Рис. 13.8. Сторона с вершинами 1 и 2 в ключевом кадре к переходит в две связанные стороны в ключевом кадре к + 1 Рис. 13.9. Линейная интерполяция с целью преобразования отрезка в ключевом кадре к в два соединен- ных отрезка в ключевом кадре к +1 * Рис. 13.10. Линейная интерполяция для перевода треугольника в четырехугольник Общие правила обработки для выравнивания ключевых кадров можно сформулиро- вать либо через число сторон, либо через число вершин, которые надо добавить в ключевом кадре. Рассмотрим вначале выравнивание по числу сторон, где параметры Lt и Lfc+i обозначают число отрезков на двух последовательных кадрах. Максималь- ное и минимальное число линий, которые необходимо выравнять, можно определить следующим образом: -^max = max(Z?/c, Lfc-|-i), ^min — min(Z?/£, (13.1)
1010 Глава 13. Компьютерная анимация Рис. 13.11. Преображение банки масла STP в элемент двигателя {перепечатано с разрешения Silicon Graphics, Inc.) Рис. 13.12. Преобразование движущегося автомобиля в бегущего тигра {перепе- чатано с разрешения Exxon Company USA и Pacific Data Images)
13.6. Системы ключевых кадров 1011 Далее вычисляются следующие величины: — Lmax mod Z/min, <13-2> jvs = mt I —--- I. \ I'min / Затем для выравнивания сторон используются такие процедуры. 1. Разделить Ne сторон keyfrarnemm на Ns + 1 сегментов. 2. Разделить оставшиеся линии keyfrarnemm на Ns сегментов. Например, если Lk = 15 и Lk+i = И, нужно разделить каждую из четырех линий keyframe к+\ на два сегмента. Оставшиеся линии keyframe к+\ не меняются. Рассмотрим теперь выравнивание числа вершин. Обозначим через Vk и 14+1 чис- ло вершин на двух последовательных ключевых кадрах. В этом случае минимальное и максимальное число вершин определяется следующим образом: Vmax = max (14, Vfc+1), Vmin = min(l4, Vk+1). Далее вычисляются следующие две величины: Nls = — 1) mod (Vjnin — 1), \ vmin 1 / Данные две величины можно затем использовать для выравнивания числа вершин с помощью таких процедур. (13.3) (13.4) 1. Добавить Np точек на сегменты Nis (ключевого кадра) keyfrarnemm. 2. Добавить Np — 1 точек на оставшиеся стороны keyfrarnemm. В примере преобразования треугольника в четырехугольник Vk = 3 и 14+1 = 4, Nis и Np равны 1, так что на одну сторону keyframe к добавляется одна точка. На остальные линии keyframek точки добавляться не будут. ИМИТАЦИЯ УСКОРЕНИЯ Для задания путей анимации между ключевыми кадрами часто используются методы подбора кривых (аппроксимации). Для данных положений вершин на ключевых кад- рах можно, используя линейную или нелинейную траекторию, подобрать положения вершин на промежуточных кадрах. Подбор точек с использованием нелинейной тра- ектории показан на рис. 13.13. Кроме того, для имитации ускорения можно менять временные интервалы между промежуточными положениями.
1012 Глава 13. Компьютерная анимация Рис. 13.13. Аппроксимация по- ложений вершин на ключевых кадрах с помощью нелинейных сплайнов Ключевой кадр к + 2 Ключевой кадр/: Промежуточное Ключевой кадр состояние + 1 Рис. 13.14. Промежуточ- ные положения при дви- ___________I______|______|______|_____|______|______I_________ жении с постоянной ско- 1 >--.---• 1 t ростью Z| Если движение должно происходить с постоянной скоростью (нулевое ускоре- ние), используется равномерное расположение промежуточных точек. Например, при п промежуточных положениях и ключевых кадрах, заданных в моменты времени и t-2 (рис. 13.14), промежуток времени между ключевыми кадрами делится на n + 1 равных подынтервалов, что дает следующее расположение промежуточных точек: ^2 — ti = 1. (13.5) п + 1 Момент времени, который соответствует j-му промежуточному положению, равен tBj = + jAt, j = 1,2, (13.6) и это значение используется для расчета положений точек, цвета и других физических параметров этого кадра движения. Обычно в некоторый момент анимационного фильма или мультфильма необхо- димо изменить скорость (ненулевое ускорение), особенно в начале и конце после- довательности движения. Разгон и торможение траектории анимации часто модели- руются сплайнами или тригонометрическими функциями, хотя для моделирования ускорения используются также квадратные или кубические зависимости от времени. В анимационных пакетах для имитации ускорения обычно предлагаются тригономет- рические функции.
13.6. Системы ключевых кадров 1013 Рис. 13.15. Тригонометрическая функция ускорения и соответствующие промежуточные положения при п = 5 и 9 = jTr/12 в уравнении (13.7) увеличивают изменение координаты за каждый последующий промежуток времени '*1 >BS Чтобы смоделировать увеличение скорости (положительное ускорение), вре- менные интервалы между кадрами следует увеличивать, чтобы по мере того, как объект начинает двигаться быстрее, его положение менялось все больше и больше. Увеличить временной интервал можно, используя следующую функцию: 1 — COS0, 0 < в < 7г/2. При п промежуточных положениях время j-ro кадра определяется так: tBj = ti + Д« 3* 1 “ COS —-----г , 2(п + 1) j = 1,2, ... ,п, (13-7) где Д( — разность во времени между двумя ключевыми кадрами. На рис. 13.15 представлен график тригонометрической функции ускорения и размещения проме- жуточных точек при п — 5. Уменьшающуюся скорость (торможение) можно смоделировать функцией sin# при 0 < в < 7г/2. Моменты времени промежуточных состояний определяются сле- дующим образом: tBj = ti + Д/sin J7T 2(n + 1) ’ j = 1,2, (13.8) График этой функции и уменьшающийся размер интервалов времени показан на рис. 13.16 для пяти промежуточных положений.
1014 Глава 13. Компьютерная анимация Рис. 13.16. Тригонометрическая функция торможения и соответствующие промежуточные положе- ния при п = 5 и 9 = jtt/12 в уравнении 13.8, что дает уменьшающиеся изменения координат при прохождении объекта за следующий интервал времени Рис. 13.17. Тригонометрическая функция ускорения-торможения (1 - cos0)/2 и соответствующие расстояния между промежуточными точками при п = 5 в уравнении (13.9) Часто движение содержит как ускорение, так и торможение. Комбинацию увеличения-уменьшения скорости можно смоделировать, вначале увеличивая рассто- яние между промежуточными положениями, а затем уменьшая его. Функция, дающая такое изменение, имеет вид ^(1 —COS0), 0 < в < 7г/2.
13.7. Спецификация движения 1015 Момент времени j-ro промежуточного положения теперь определяется следующим образом: I 2 J j = l,2, (13.9) где Ai обозначает промежуток времени между двумя ключевыми кадрами. Для дви- жущегося объекта промежутки времени вначале увеличиваются, а затем уменьшают- ся, как показано на рис. 13.17. Обработка промежуточных положений упрощается, если вначале смоделировать ‘Ькелет” (каркас) объектов так, чтобы последовательности движения можно было ме- нять интерактивно. После полного определения анимационной последовательности объекты можно визуализировать целиком. 13.7. СПЕЦИФИКАЦИЯ ДВИЖЕНИЯ Общие методы описания анимированной поверхности варьируются от явной специ- фикации траекторий движения до описания взаимодействий, приводящих к движе- нию. Следовательно, можно определить, как должна происходить анимация, разделив параметры преобразования, параметры траектории движения, силы, действующие на объекты, или подробности взаимодействия движения, приводящие к движению. ПРЯМАЯ СПЕЦИФИКАЦИЯ ДВИЖЕНИЯ Наиболее прямолинейный метод определения анимации — прямая спецификация дви- жения параметров геометрического преобразования. При этом явно задаются значе- ния углов вращения и векторов трансляции. Далее для изменения координат при- меняются матрицы геометрического преобразования. Aib тернативный вариант — ис- пользовать аппроксимирующие уравнения, содержащие эти параметры, чтобы задать определенные типы движения. Ашрок симируем, например, путь прыгающего мяча затухающей спрямленной синусоидальной кривой (рис. 13.18): у(х) = А| sin(wa: + 0q) |е-kx, (13.10) где А — исходная амплитуда (высота мяча над землей), си — угловая частота, во — фаза, к — коэффициент затухания. Данный метод спецификации движения особенно полезен в простых пользовательских анимационных последовательностях.
1016 Глава 13. Компьютерная анимация Рис. 13.18. Аппроксимация движения прыгающего мяча затухающей синусоидальной функ- цией (уравнение (13.10)) ЦЕЛЕНАПРАВЛЕННЫЕ СИСТЕМЫ В качестве другого подхода можно наметить движение, которое должно произойти, абстрактно описав действия через конечный результат. Другими словами, анимация задается через окончательное состояние движения. Системы подобного типа назы- ваются целенаправленными, поскольку значения параметров движения определяются из цели анимации. Например, можно задать, что мы желаем, чтобы объект ‘Пошел” или ‘йобежал” в определенное место. Или же можно задать, что объект должен ‘Под- нять” другой заданный объект. Затем входные директивы интерпретируются через компоненты движения, которое реализует поставленную задачу. Например, движе- ние человека можно определить в виде иерархической структуры элементов движе- ния (‘йоддвижений’) туловища, конечностей и т.д. Следовательно, когда дана цель, допустим, ‘'пройти в дверь”, рассчитываются движения туловища и конечностей, необходимые для выполнения указанного действия. КИНЕМАТИКА И ДИНАМИКА Ашм ационные последовательности можно построить, используя кинематические или динамические описания. При кинематическом описании, чтобы задать анима- цию, указываются параметры движения (положение, скорость и ускорение) безотно- сительно причин или целей движения. При постоянной скорости (нулевое ускорение) движение твердых тел на сцене указывается заданием исходного положения и век- тора скорости для каждого объекта. Приведем пример: если скорость задана как (3, 0, —4) км/с, тогда этот вектор дает направление прямолинейного движения, а модуль вектора скорости равен 5 км/с. Если, кроме того, задать ускорение (скорость изме-
13.8. Анимация шарнирной фигуры 1017 нения скорости), можно получить ускоренные, замедленные и криволинейные траек- тории движения. Кинематические спецификации движения можно задавать простым описанием траектории движения. Для этого часто используются сплайновые кривые. /Ль тернативный подход — использование обратной кинематики. Здесь задаются исходные и конечные положения объектов в различные моменты времени, и систе- ма рассчитывает параметры движения. Предположим, что ускорение равно нулю, и определим постоянную скорость, благодаря которой объект перейдет из исходного положения в конечное. Данный метод часто используется при обработке сложных объектов: указывается положение и ориентация конечного узла (вершины) объекта, например, кисти руки или ступни ноги. Далее система определяет параметры движе- ния других вершин, чтобы имитировать нужное движение. С другой стороны, динамические описания требуют задать силы, приводящие к появлению скорости и ускорения. Описание поведения объекта через влияние сил обычно называется физическим моделированием (см. главу 8). В качестве сил, влияю- щих на движение объектов, могут использоваться электромагнитные, гравитационные силы, силы трения и другие механические силы. Движение объекта получается из уравнений сил, описывающих физические зако- ны, такие как законы Ньютона (ход гравитационных процессов и процессов трения), Эйлера или Навье-Стокса, описывающих поток жидкости, и уравнения Максвелла для электромагнитных сил. Например, в общем виде второй закон Ньютона для ча- стицы с массой т имеет вид F=^(mv)> (13.11) где F — вектор силы, v — вектор скорости. Если масса постоянна, решается уравнение F = та, где а представляет вектор ускорения. В противном случае масса — это функция времени, и это существенно в релятивистских системах или при движении космических аппаратов, расходующих ощутимые массы топлива за единицу времени. Кроме того, чтобы получить силы при данных исходных и конечных положениях объектов и типе требуемого движения, можно использовать обратную динамику. В число приложений физически обоснованного моделирования входит описание сложных жестких и нежестких систем, таких как одежда и пластические материалы. Обычно для получения параметров движения из динамических уравнений с исполь- зованием начальных условий или краевых значений применяются численные методы. 13.8. АНИМАЦИЯ ШАРНИРНОЙ ФИГУРЫ Стандартной техникой анимации людей, животных, насекомых и других существ является их моделирование в форме шарнирных фигур — иерархических структур, составленных из набора жестких соединений, связанных шарнирами (рис. 13.19). В
1018 Глава 13. Компьютерная анимация Тазобедренный сустав — -F” - Рис. 13.19. Простая шарнирная фигура с девятью соединениями и двенадцатью соединяющимися частями, не считая овальной головы а) б) Рис. 13.20. Возможные движения набора связанных частей, представляющие ногу при ходьбе менее формальном изложении это всего лишь означает, что анимируемые объекты моделируются как движущиеся фигуры из брусков, или упрощенные скелеты, на которые позднее можно натянуть поверхности, представляющие кожу, волосы, мех, перья, одежду или другие внешние оболочки. Точки соединения, или шарниры, фигуры размещаются в плечах, бедрах, коленях и других суставах. При движении тела эти точки перемещаются по заданным тра- екториям движения. Например, если задано движение объекта, плечо автоматически движется определенным образом, а при перемещении плеча движется рука. Свое- образные движения шарниров и соединенных частей определяются при конкретных типах движения (ходьба, бег, прыжки). Например, ряд базовых движений ноги при ходьбе можно задать так, как по- казано на рис. 13.20. Тазобедренный сустав движется вперед вдоль горизонтальной линии, а связанные с ним фрагменты совершают набор движений вокруг бедра, коле-
13.8. Анимация шарнирной фигуры 1019 а) б) в) г) д) Ос 1/72 с 1/36 с 1/24 с 1/18 с Рис. 13.21. Пять положений красной спицы за один оборот колеса, вращающегося с частотой 18 оборотов в секунду Рис. 13.22. Первые пять кадров фильма с изображением вращающегося колеса с рис. 13.21, сгенери- рованные с частотой 24 кадра в секунду на и угловых соединений. Движение начинается с прямой ноги (рис. 13.20, а), затем формируется прямое колено, когда таз движется вперед (рис. 13.20, б). Далее нога качается вперед, возвращается к вертикальному положению и качается назад, как показано на рис. 13.20, в, г и д. Завершающее движение — широких замах назад и возвращение в прямо вертикальное положение, как показано на рис. 13.20, е и ж. Данный цикл движения повторяется в течение всего времени анимации, пока фигура пройдет заданное расстояние, или пройдет заданное время. При движении фигуры другие шарниры также совершают различные движения. Синусоидальное движение, часто с меняющейся амплитудой, можно применить к бедрам, чтобы они двигались относительно торса. Подобным образом поперечное или качательное движение можно сообщить плечам, кроме того, при ходьбе может раскачиваться голова. При анимации фигуры используется и кинематическое описание движения и об- ратная кинематика. Задать движение шарниров обычно легко, но для выполнения простого движения по произвольной местности может оказаться полезной обратная кинематика. Для сложной фигуры обратная кинематика может не давать однозначной анимационной последовательности: при данном наборе начальных и конечных усло- вий возможны многие различные вращательные движения. В подобных случаях для получения единственного решения следует добавить несколько условий, например, сохранения момента системы.
1020 Глава 13. Компьютерная анимация 13.9. ПЕРИОДИЧЕСКОЕ ДВИЖЕНИЕ При построении анимации с повторяющимися шаблонами движения, как, например, для вращающегося объекта, нужно гарантировать, что движение дискретизовано (раз- дел 4.17) с частотой, достаточной для корректного представления движения. Другими словами, движение должно быть синхронизировано с частотой генерации кадров так, чтобы число кадров, отображаемых за цикл, было достаточным для показа истинного движения. В противном случае анимация будет отображена неверно. Типичный пример — недостаточная дискретизация периодического движения ко- леса повозки в вестерне, при которой кажется, что колесо вращается в обратную сторону. На рис. 13.21 иллюстрируется один полный цикл вращения колеса с одной красной спицей, которое делает 18 оборотов в секунду по часовой стрелке. Если дви- жение записано на пленку со стандартной телевизионной скоростью воспроизведения 24 кадра/с, на первых пяти кадрах фильма колесо будет выглядеть так, как показано на рис. 13.22. Поскольку колесо совершает | оборота за каждую секунды, за цикл генерируется только один кадр, и кажется, что колесо вращается в противоположном направлении (против часовой стрелки). В компьютерной анимации частоту дискретизации периодического движения можно регулировать, настраивая параметры движения. Например, угловой прирост движения вращающегося объекта можно задать так, чтобы для каждого оборота гене- рировалось несколько кадров. Таким образом, прирост 3° дает 120 этапов движения за один оборот, а прирост 4° дает 90 положений. Для более быстрого движения можно использовать большие шаги вращения, только нужно следить, чтобы число выборок за цикл не было слишком малым, и движение отображалось корректно. Если анимиро- вать нужно сложные объекты, следует учитывать влияние, которое время построения кадра может иметь на частоту обновления, как обсуждалось в разделе 13.1. Движение сложного объекта может быть значительно более медленным, чем хотелось бы, если время построения каждого кадра анимации слишком велико. Другой фактор, который следует рассматривать при отображении повторяюще- гося изображения, — эффект округления при расчете параметров движения. Как от- мечалось в разделе 5.4, значения параметров можно периодически обновлять, чтобы накопление ошибки не вызвало ложного движения. При непрерывном вращении па- раметры можно обновлять каждый цикл (360°). 13.10. ПРОЦЕДУРЫ АНИМАЦИИ OpenGL Растровые операции (раздел 5.7) и функции присвоения кодов цвета (color-index assignment) содержатся в корневой библиотеке, а процедуры изменения значений таблицы цветов есть в GLUT (раздел 4.3). Другие операции растровой анимации
13.10. Процедуры анимации OpenGL 1021 есть только в процедурах GLUT, поскольку они зависят от используемой системы окон. Кроме того, в некоторых аппаратных системах могут отсутствовать особенности компьютерной анимации, такие как двойная буферизация. Операции двойной буферизации, если они есть, вызываются посредством следу- ющей команды GLUT. glutlnitDisplayMode (GLUTJDOUBLE) ; В результате создается два буфера, передний и задний, которые можно использо- вать попеременно для обновления изображения на экране. Пока один буфер выступает в роли буфера обновления текущего окна на экране, в другом буфере строится сле- дующий кадр анимации. Момент, когда буферы меняются ролями, задается командой glutSwapBuffers ( ) ; Чтобы определить, возможна ли в системе работа с двойной буферизацией, можно выдать следующий запрос. glGetBooleanv (GL_DOUBLEBUFFER, status); Значение GL_TRUE, выданное в ответ, присваивается параметру массива status, если в системе доступны передний и задний буферы. В противном случае возвраща- ется значение GL_FALSE. Для непрерывной анимации также можно использовать следующую процедуру. glutldleFunc (animationFcn); Здесь параметру animationFcn присваивается имя процедуры, которая будет последовательно увеличивать параметры анимации. Данная процедура непрерывно выполняется, пока не останется событий в окне дисплея, которые нужно обработать. Чтобы блокировать процедуру glutldleFunc, ее аргументу присваивается значе- ние NULL или 0. Ниже приведен пример программы анимации, в которой правильный шестиуголь- ник непрерывно вращается в плоскости ху вокруг оси z. Начало трехмерных экран- ных координат располагается в центре окна на экране, так что ось z проходит через этот центр. В процедуре init таблица отображения используется для задания опи- сания правильного шестиугольника, центр которого изначально находится в точке с экранными координатами (150, 150), а радиус (расстояние от центра многоугольника до любой вершины) равен 100 пикселям. В функции отображения displayHex зада- ется начальный угол вращения 0° вокруг оси z и вызывается процедура glutSwap- Buffers. Чтобы инициировать вращение, используется процедура mouseFcn, кото- рая последовательно увеличивает угол поворота на 3° при нажатии средней кнопки мыши. Расчет последовательно увеличивающегося угла выполняется в процедуре
1022 Глава 13. Компьютерная анимация rotateHex, которая вызывается процедурой glutldleFunc в процедуре mouse- Fcn. Вращение прекращается нажатием правой кнопки мыши, что приводит к вызову процедуры glutldleFunc с аргументом NULL. ♦include <GL/glut.h> ♦include <math.h> ♦include <stdlib.h> const double TWO_PI = 6.2831853; GLsizei winWidth «• 500, winHeight = 500; // Размер исходного окна на экране. GLuint regHex; //Определяет имя таблицы отображения, static GLfloat rotTheta «• 0.0; class scrPt { public: GLint x, y; ); static void init (void) { scrPt hexVertex; GLdouble hexTheta; GLint k; glClearColor (1.0, 1.0, 1.0, 0.0); /* Задает таблицу отображения для правильного красного * шестиугольника. Вершины шестиугольника - шесть равномерно * расположенных точек на окружности. * / regHex «• glGenLists (1); glNewList (regHex, GL_COMPILE); glColor3f (1.0, 0.0, 0.0); glBegin (GL__POLYGON); for (k = 0; k < 6; k++) { hexTheta = TWO_PI * k / 6; hexVertex.x «• 150 + 100 * cos (hexTheta); hexVertex.у = 150 + 100 * sin (hexTheta); glVertex2i (hexVertex.x, hexVertex.y); ) glEnd ( ); glEndList ( ); ) void displayHex (void) { glClear (GL_COLOR_BUFFER_BIT); glPushMatrix ( ); glRotatef (rotTheta, 0.0, 0.0, 1.0); glCallList (regHex); glPopMatrix ( ); glutSwapBuffers ( ); glFlush ( );
13.10. Процедуры анимации OpenGL 1023 void rotateHex (void) { rotTheta += 3.0; if (rotTheta > 360.0) rotTheta -= 360.0; glutPostRedisplay ( ) ; void winReshapeFcn (GLint newWidth, GLint newHeight) { glViewport (0, 0, (GLsizei) newWidth, (GLsizei) newHeight); glMatrixMode (GL_PROJECTION); glLoadldentity ( ) ; gluOrtho2D (-320.0, 320.0, -320.0, 320.0); glMatrixMode (GL_MODELVIEW); glLoadldentity ( ); glClear (GL_COLOR_BUFFER_BIT); void mouseFcn (GLint button, GLint action, GLint x, GLint y) { switch (button) { case GLUT_MIDDLE_BUTTON: // Начать вращение. if (action == GLUT_DOWN) glutldleFunc (rotateHex); break; case GLUT_RIGHT_BUTTON: // Остановить вращение, if (action == GLUT_DOWN) glutldleFunc (NULL); break; default: break; } ) void main (int argc, char** argv) { glutlnit (&argc, argv); glutlnitDisplayMode (GLUT_DOUBLE | GLUT_RGB); glutlnitWindowPosition (150, 150); glutlnitWindowSize (winWidth, winHeight); glutCreateWindow ("Пример анимации"); init ( ) ; glutDisplayFunc (displayHex); glutReshapeFunc (winReshapeFcn); glutMouseFunc (mouseFcn); glutMainLoop ( );
1024 Глава 13. Компьютерная анимация 13.11. РЕЗЮМЕ Ашм ационную последовательность можно строить кадр за кадром или же генериро- вать в реальном времени. Если отдельные кадры анимационной последовательности строятся и записываются, их можно позже преобразовать в фильм или показать в быстром темпе на мониторе. Aihm ация, включающая сложные сцены и движения, обычно создается покадрово, тогда как более простые движущиеся последовательно- сти отображаются в реальном времени. В растровой системе для облегчения отображения движения могут использовать- ся методы двойной буферизации. Один буфер используется для обновления экра- на, тогда как второй загружается экранными значениями для следующего кадра фильма. Затем роли двух буферов меняются, обычно это происходит в конце цик- ла обновления. Другой растровый метод отображения анимации — показывать последователь- ности движения с использованием передачи блоков значений пикселей. Трансляции выполняются простым перемещением прямоугольного блока цветов пикселей из од- ного положения буфера кадра в другое. Кроме того, вращение на угол, кратный 90°, можно выполнить, объединяя трансляцию с обменом элементов строк (столбцов) в массиве пикселей. Методы таблицы цветов можно применять для простой растровой анимации, за- писывая изображение объекта в нескольких местах буфера кадра, используя различ- ные значения таблицы цветов. Одно изображение записывается с цветом переднего плана, а копии изображения из других мест записываются с цветом фона. Быстро меняя значения цветов фона и переднего плана, записанные в таблице цветов, можно отображать объект в различных точках экрана. Создавать анимацию можно в несколько этапов, начав с раскадровки, использовав определение объектов и спецификацию ключевых кадров. Раскадровка — это схема действия, а ключевые кадры определяют детали движения объекта для выбранных моментов анимации. После ключевых генерируются промежуточные кадры, обес- печивающие гладкое перетекание одного ключевого кадра в другой. Компьютерная анимация может включать спецификацию движения ‘камеры”, а также траекторий движения объектов и персонажей. Разработаны различные методы имитации и выделения эффектов движения. Стандартным для вынужденного ускорения является эффект ‘раздавить и сплющить”. Кроме того, чтобы сымитировать изменение скорости, можно менять временные ин- тервалы между кадрами движения. Другие методы включают ожидание движения, завершающий штрих в конце действия и методы тонирования, акцентирующие вни- мание на важных действиях на сцене. Если кадры включают ускорение, промежуточ- ные кадры генерируются с разными временными промежутками между ними.
13.11. Резюме 1025 ТАБЛИЦА 13.1. Резюме по функциям анимации OpenGL Функция Описание glutlnitDisplayMode (GLUT_DOUBLE) А тивизация операций с двойной буферизацией glutSwapBuffers Обмен переднего и заднего буферов glGetBooleanv (GL_DOUBLEBUFFER, status) Запрос к системе для определения, под- держивается ли двойная буферизация glutldleFunc Задание функции последовательно уве- личивающихся параметров анимации Для создания анимации можно использовать специализированное программное обеспечение или универсальные графические пакеты. Пакеты, допускающие автома- тизированную компьютерную анимацию, включают системы ключевых кадров, си- стемы параметризации и системы сценариев. Многие анимации включают трансформацию, при которой объект меняет свою форму. Для реализации подобных эффектов используются промежуточные кадры, в которых определенные точки и линии одного объекта переходят в точки и линии другого. Движение в анимации иногда описывается с помощью прямой спецификации, также допустимо отображать целенаправленные системы. Таким образом, можно определить анимацию через параметры трансляции и вращения или описать дви- жение уравнениями либо кинетическими или динамическими параметрами. При ки- нематическом описании задаются положения, скорости и ускорения; при динамиче- ском — силы, действующие на объекты сцены. Для моделирования движения людей и животных часто используются шарнирные модели. Жесткие звенья, соединенные шарнирами, определяются в иерархическую структуру. Когда объекту сообщается движение, каждая часть программируется так, чтобы она совершала определенное действие в ответ на общее движение. Частота дискретизации периодических картин должна выполняться с достаточной частотой кадров за цикл, чтобы анимация отображалась корректно. В противном случае может наблюдаться неравномерное или дезориентирующее движение. Помимо растровых процедур и методов таблицы цветов для разработки программ с анимацией используется несколько функций из OpenGL Utility Toolkit (GLUT). Здесь есть процедуры для операций двойной буферизации и приращения значений параметров движения в моменты бездействия. В табл. 13.1 перечислены функции GLUT, позволяющие использовать анимацию в программах OpenGL.
1026 Глава 13. Компьютерная анимация ЛИТЕРАТУРА Системы компьютерной анимации рассмотрены в [131, 173, 202, 203, 242, 249, 262, 340, 351, 377]. Традиционные методы анимации разобраны в [184, 354, 355]. Методы трансформации обсуждаются в [129, 158, 172, 308]. О различных алгоритмах для разных приложений анимации можно прочесть в [8, 113, 122, 176, 244, 333]. Обсуждение методов анимации в OpenGL представлено в справочнике [400]. УПРАЖНЕНИЯ 13.1. Разработайте схему раскадровки и соответствующие ключевые кадры для анимации простой скелетоподобной фигуры, представленной на рис. 13.19. 13.2. Напишите программу генерации с помощью линейной аппроксимации промежуточных кад- ров для ключевых кадров, заданных в упражнении 13.1. 13.3. Расширьте анимационную последовательность из упражнения 13.1, чтобы теперь она вклю- чала несколько движущихся объектов. 13.4. Напишите программу генерации с помощью линейной аппроксимации промежуточных кад- ров для ключевых кадров, указанных в упражнении 13.3. 13.5. Напишите программу трансформации любого заданного многоугольника в другой заданный многоугольник, используя пять промежуточных кадров. 13.6. Напишите программу трансформации сферы в заданный многогранник, используя пять про- межуточных кадров. 13.7. Дайте спецификацию анимации, включающей ускорение и реализующей уравнение (13.7). 13.8. Дайте спецификацию анимации, включающей ускорение и торможение, реализующей расчет промежуточных положений, представленный в уравнениях! 13.7) и (13.8). 13.9. Дайте спецификацию анимации, реализующей расчет ускорения-торможения по уравне- нию (13.9). 13.10. Напишите программу имитации линейного двухмерного движения закрашенной окружно- сти внутри данной прямоугольной области. Для окружности должны задаваться начальное положение и вектор скорости, причем при ударе о стенку прямоугольника вектор скорости должен меняться по закону “угол падения равен углу отражения”. 13.11. Преобразуйте программу из предыдущего примера в игру “мяч и ракетка”, заменив одну сторону прямоугольника коротким отрезком, который можно перемещать взад-вперед вдоль удаленной стороны прямоугольника. Интерактивное движение отрезка имитирует ракетку, меняя положение которой, можно не дать прыгающему мячу выйти из прямоугольника. Игра заканчивается, когда окружность “убегает” из внутренней части прямоугольника. Должны задаваться следующие входные параметры — положение окружности, направление и ско- рость. Для подсчета очков в игре может использоваться число ударов окружности о ракетку. 13.12. Модифицируйте игру с мячом и ракеткой из предыдущего упражнения, чтобы скорость прыгающего мяча менялась. Скорость мяча может увеличиваться по прошествии некоторого фиксированного интервала, скажем, через пять ударов. 13.13. Модифицируйте двухмерный мячик, прыгающий внутри прямоугольника, в трехмерную сферу, прыгающую внутри параллелепипеда. Чтобы наблюдать движение из разных точек, могут задаваться интерактивные параметры наблюдения.
Упражнения 1027 13.14. Напишите программу с реализацией имитации прыгающего мячика согласно уравне- нию (13.10). 13.15. Расширьте программу из предыдущего упражнения, чтобы она включала эффекты “растя- нуть и сплющить”. 13.16. Напишите программу реализации движения прыгающего мячика, используя динамику. Дви- жение мяча должно управляться силой тяжести, направленной вниз, и силой трения, дей- ствующей в плоскости поверхности. Изначально мячик проектируется в точку пространства с указанным вектором скорости. 13.17. Напишите программу, в которой бы реализовывались спецификации динамического движе- ния. Постройте сцену с двумя или большим числом объектов, начальными параметрами движения и заданными силами. Далее сгенерируйте анимацию, решая уравнение движения. (Например, объектами могут быть Земля, Луна и Солнце с гравитационными силами при- тяжения, пропорциональными массам и обратно пропорциональными квадрату расстояния между объектами.) 13.18. Модифицируйте программу вращения шестиугольника, чтобы пользователь мог интерак- тивно выбирать из предложенного списка объект, который можно вращать. 13.19. Модифицируйте программу вращения шестиугольника, чтобы вращение происходило вдоль эллиптической траектории. 13.20. Модифицируйте программу вращения шестиугольника, чтобы скорость вращения можно было менять интерактивно.
ГЛАВА 14 Иерархическое моделирование Созданная средствами компьютерной графики сцена, изображающая здание, построенное с помощью иерархического моделирования (перепечатано с разрешения Silicon Graphics, Inc.)
14.1. Базовые концепции моделирования 14.2. Пакеты моделирования 14.3. Общие методы иерархического моделирования 14.4. Иерархическое моделирование с использованием таблиц отображения OpenGL 14.5. Резюме ри определении сложных объектов или систем обычно проще всего за- дать вначале части, а затем описать, как эти части формируют системы или объект целиком. Например, велосипед можно описать, используя ра- му, колеса, щитки, рычаги управления, сиденье, цепь и педали, а затем указать правила объединения этих элементов, чтобы в сумме они дали велосипед. По- добное иерархическое описание можно представить в форме древовидной структуры, состоящей из частей — листьев — и правил построения — ветвей. В архитектурных и инженерных системах, таких как системы проектирования зданий, автомобилей, электронных схем и бытовой электропроводки, сейчас широ- ко используются компьютерные пакеты разработки. Кроме того, для представления экономических, финансовых, организационных, научных, социальных и графических систем и систем окружающей среды применяются графические методы разработки. Для изучения поведения системы при различных условиях часто используется мо- делирование, а результат моделирования может служить инструментом или основой принятия решений, касающихся системы. В пакетах обычно присутствуют програм- мы (процедуры) создания иерархических моделей и управления ими, а некоторые пакеты также содержат предопределенные формы, такие как колеса, двери, шесте- ренки, валы (оси) и компоненты электронных схем. 14.1. БАЗОВЫЕ КОНЦЕПЦИИ МОДЕЛИРОВАНИЯ Создание представления системы и работа с ним называется моделированием. Лю- бое отдельное представление называется моделью системы, и его можно определить графически или описательно, например, как набор уравнений, описывающих связь между параметрами системы. Графические модели часто называются геометриче- скими, поскольку компоненты системы представляются геометрическими объектами,
1030 Глава 14. Иерархическое моделирование Рис. 14.1. Модель логической схемы такими как отрезки, многоугольники, многогранники, цилиндры или сферы. Посколь- ку здесь мы рассматриваем только графические приложения, под моделью мы будем подразумевать компьютерное геометрическое представление системы. ПРЕДСТАВЛЕНИЯ СИСТЕМ На рис. 14.1 изображено графическое представление логической схемы, иллюстриру- ющее особенности, общие для многих моделей систем. Компоненты системы отобра- жены как геометрические структуры, именуемые символами, а соотношения между символами в этом примере представлены сетью соединяющих линий. Для представ- ления логических элементов булевых операций И, ИЛИ и НЕ использованы три стандартных символа. Соединяющие линии определяют отношения через входной и выходной потоки (слева направо) по частям системы. Один символ — логический элемент И — изображен в двух различных местах логической схемы. Подобное разме- щение нескольких базовых символов является обычным методом построения слож- ных моделей. Каждое подобное вхождение символа в модель называется экземпляром этого символа. В примере на рис. 14.1 имеется по одному экземпляру символов ИЛИ и НЕ и два экземпляра символа И. Во многих случаях определенные графические символы, выбранные для пред- ставления частей системы, определяются описанием системы. Для моделирования используются стандартные электрические или логические символы. Но для таких мо- делей, представляющих абстрактные концепции, как модели политических, финансо- вых или экономических систем, могут использоваться символы с любыми удобными геометрическими шаблонами. Информация, описывающая модель, обычно предоставляется как комбинация гео- метрических и негеометрических данных. Геометрическая информация включает по- ложения точек, определяющих расположение компонентов, выходных примитивов и параметрических функций, позволяющих задать структуру частей, и данные, необхо- димые для построения связей между частями. Негеометрическая информация вклю- чает текстовые метки, алгоритмы, описывающие рабочие характеристики модели, и правила определения связей или соединений компонентов, если они не заданы как геометрические данные.
14.1. Базовые концепции моделирования 1031 ТАБЛИЦА 14.1. Данные, определяющие структуру и положение логических эле- ментов в схеме, изображенной на рис. 14.1 Код символа Геометрическое описание Идентифицирующая метка Элемент 1 (Координаты и другие параметры) И Элемент 2 То же ИЛИ Элемент 3 -И- НЕ Элемент 4 -И- И Задать информацию, необходимую для построения модели и работы с ней, можно двумя методами. Один — это записать информацию в структуре данных, такой как таблица или связный список. Другой метод — это задать информацию в процедурах. В общем случае спецификация модели будет содержать и структуры данных, и процеду- ры, хотя одни модели полностью определяются структурами данных, а другие — толь- ко процедурными спецификациями. Приложение, нацеленное на объемное моделиро- вание объектов, может использовать преимущественно информацию, полученную из некоторой структуры данных и определяющую положения точек, плюс ограниченное число процедур. С другой стороны, в модели погоды будут требоваться в основном процедуры для расчета графиков изменения температуры и атмосферного давления. В качестве примера использования объединения структуры данных и проце- дур рассмотрим некоторые альтернативные спецификации модели логической схемы на рис. 14.1. Один метод — определить логические компоненты в таблице данных (табл. 14.1), где в процедурах обработки задается, какие нужны соединения сети и как работает схема. Геометрические данные в этой таблице включают координаты и параметры, необходимые, чтобы представить и разместить в нужных точках ло- гические элементы. Все эти символы можно изобразить как многоугольные формы или как комбинации отрезков и эллиптических дуг. Метки всех компонентов также включены в таблицу, хотя их можно опустить, если символы отображены в виде легко распознаваемых форм. Затем можно использовать процедуры отображения элементов и построить связующие линии, основываясь на координатах элементов и заданном порядке их соединения. Для получения выхода схемы (двоичные значения) исполь- зуется дополнительная процедура. Данную процедуру можно настроить так, чтобы отображался только конечный выход или выводились промежуточные выходные зна- чения, иллюстрирующие внутреннюю работу схемы. В качестве альтернативы графическую информацию модели можно задать в структуре данных. Соединяющие линии, а также логические элементы можно опре- делить в таблице данных, в которой явно перечислены конечные точки всех линий схемы. Затем одна процедура может отобразить схему и рассчитать выход. В каче- стве другого крайнего случая можно полностью определить модель в процедурах, не используя внешние структуры данных.
1032 Глава 14. Иерархическое моделирование Рис. 14.2. Одноуровневое иерархическое описание схемы, сформированной логическими элементами Рис. 14.3. Двухуровневое иерархическое описание схемы производства ИЕРАРХИИ СИМВОЛОВ Многие модели можно организовать в виде иерархии символов. Основные элементы модели определяются как простые геометрические формы, подходящие для моделей рассматриваемого типа. Затем данные базовые символы используются при форми- ровании сложных объектов, иногда называемых модулями, которые также можно группировать в объекты более высокого уровня для различных компонентов моде- ли. В простейшем случае модель можно описать одноуровневой иерархией частей- компонентов, как показано на рис. 14.2. В использованном выше примере схемы предполагается, что логические элементы размещены и связаны друг с другом прямы- ми линиями согласно правилам соединения, заданным с описанием всех логических элементов. Базовыми символами в этом иерархическом описании являются логиче- ские элементы. Хотя логические элементы сами по себе можно описать как иерархии, сформированные отрезками, эллиптическими дугами и текстом, данное описание бы- ло бы неудобным при построении логических схем, где простейшие компоновочные блоки — логические элементы. Для приложения, в котором требуется разрабатывать различные геометрические формы, базовые символы можно определить как отрез- ки и дуги.
14.2. Пакеты моделирования 1033 Пример двухуровневой иерархии символов приведен на рис. 14.3. Здесь плани- руется размещать оборудование в упорядоченных рабочих зонах. В каждую рабочую зону поставляется набор мебели. Базовыми символами являются элементы мебели: рабочие столы, стулья, полки, стеллажи и т.п. Объекты более высокого порядка — рабочие зоны, которые сведены вместе с различными схемами размещения мебели. Чтобы определить экземпляр базового символа, задается его положение, размер и ориентация в каждой рабочей области. Положения указываются как координаты рас- положения в каждой рабочей области, а ориентации задаются как углы вращения, указывающие, как ориентированы символы. На первом уровне под корневым узлом дерева производства каждая рабочая область задается ее положением, размером и ориентацией на территории производства. Границу каждой рабочей области мож- но определить перегородкой (делителем), замыкающей ее и указывающей проходы между подразделениями. Более сложные иерархии символов формируются повторяющимися группами кла- стеров символов на следующем более высоком уровне. Схему производства, показан- ную на рис. 14.3, можно расширить, чтобы она включала кластеры символов, форми- рующих отдельные комнаты, различные этажи здания, различные здания комплекса и различные комплексы в географически отдаленных пунктах. 14.2. ПАКЕТЫ МОДЕЛИРОВАНИЯ Несмотря на то что модели системы можно создавать и использовать, применяя распространенные пакеты компьютерной графики, существуют специализированные системы моделирования, облегчающие моделирование в конкретных приложениях. Такие системы позволяют определять и упорядочивать представление модели че- рез иерархии символов, которые затем обрабатываются графическими программами (процедурами) с целью отображения на экран. Универсальные графические системы часто не предлагают процедур, приспособленных для глобальных приложений моде- лирования. В то же время, некоторые графические пакеты, такие как GL и PHIGS, включают интегрированные наборы функций моделирования и работы с графикой. Пример иерархической структуры приведен на рис. 14.4. Данное изображение сге- нерировано с помощью продукта PHIGS Toolkit, разработанного в Манчестерском университете для создания редакторов, окон, меню и других интерактивных средств для приложений PHIGS. Если графическая библиотека не содержит функций для моделирования, часто можно использовать интерфейс пакета моделирования к графическим процедурам. В качестве альтернативы можно создать собственную процедуру, используя геометри- ческие преобразования и другие функции, доступные в графической библиотеке.
1034 Глава 14. Иерархическое моделирование Рис. 14.4. Иерархия объектов, сгенерирован- ная с использованием пакета PHIGS Toolkit, разработанного в Манчестерском университете. Изображенное дерево объектов само является структурой PHIGS (перепечатано с разрешения Т. Ховарда (Т. L. J. Howard), Дж. Уильямса (J. G. Williams) и У. Xeeumma (W. Т. Hewitt), фа- культет информатики, Манчестерский универ- ситет, Великобритания) Рис. 14.5. Двухмерная схема моде- лирования, используемая в разработ- ке схем (перепечатано с разрешения Sum magraphics) Специализированные пакеты моделирования, например, некоторые системы ав- томатизированного проектирования, определены и структурированы согласно типу приложения, для которого предназначен пакет. Данные пакеты имеют меню форм символов и функций для предполагаемого приложения. Кроме того, они могут пред- назначаться для двух- или трехмерного моделирования. На рис. 14.5 показана двух- мерная схема, полученная с помощью пакета автоматизированного проектирования, предназначенного для разработки схем, а на рис. 14.6 иллюстрируется трехмерное приложение автоматизированного проектирования. На рис. 14.7 и 14.8 приведены примеры молекулярного моделирования, а на рис. 14.9 изображена трехмерная мо- дель производства.
14.2. Пакеты моделирования 1035 Рис. 14.6. Модель автоматизированного проектирования, показывающая отдельные компоненты двигателя, визуализированная Тедом Мэлоном (Ted Malone), FTI/3D- Magic (перепечатано с разрешения Silicon Graphics, Inc.) Рис. 14.7. Представление в форме сфер-полосок основных аминокислотных остатков, взаимо- действующих с естественной подложкой от Thymidylate Synthase, смоделированное и визу- ализированное Джулией Ньюдолл (Julie New- doll), UCSF Computer Graphics Lab (перепеча- тано с разрешения Silicon Graphics, Inc.) Рис. 14.8. Половина пары стереоско- пических изображений, демонстриру- ющая трехмерную молекулярную мо- дель ДНК. Данные предоставили Та- мар Шлик (Tamar Schlick), NYU, и Уильма К. Олсон (Wilma К. Ol- son), Университет Ратгерса; визуали- зация Джерри Гринберга (Jerry Green- berg), SDSC (перепечатано с разреше- ния Стефани Сайдс (Stephanie Sides), Центр суперкомпьютерных исследо- ваний в Сан-Диего)
1036 Глава 14. Иерархическое моделирование Рис. 14.9. Трехмерная схема офиса (перепечатано с разрешения Inter- graph Corporation) 14.3. ОБЩИЕ МЕТОДЫ ИЕРАРХИЧЕСКОГО МОДЕЛИРОВАНИЯ Иерархическая модель системы создается вложением описаний ее компонентов один в другой с формированием древовидной структуры. При размещении узлов в иерар- хии с ними сопоставляется набор преобразований (чтобы узел корректно помещался в общую модель). В схеме офиса, например, рабочие области и кабинеты формируются через упорядочение (размещение) элементов мебели. Далее кабинеты и рабочие об- ласти формируют отделы и так далее вверх по иерархическому дереву. На рис. 14.10 приведен пример использования нескольких систем координат и иерархического мо- делирования трехмерных объектов. Данный рисунок моделирует движение трактора. При перемещении трактора его система координат и система координат переднего колеса движутся относительно глобальной системы координат. Передние колеса вра- щаются в привязанной к ним системе координат, которая, в свою очередь, вращается в системе координат трактора при его повороте. ЛОКАЛЬНЫЕ КООРДИНАТЫ В универсальных приложениях разработки модели строятся из экземпляров (преобра- зованных копий) геометрических форм, определенных как базовый набор символов. Каждый экземпляр размещается (с надлежащей ориентацией) в глобальной системе координат, привязанной к общей структуре модели. Различные графические объек- ты, которые будут использоваться в приложении, определяются в системе координат, которая называется локальной системой координат этого объекта. Локальные коор- динаты также именуются модельными координатами или (иногда) главными коорди- натами (master coordinates). На рис. 14.11 иллюстрируется определение в локальных координатах двух символов, которые можно использовать в двухмерных приложениях построения схем.
14.3. Общие методы иерархического моделирования 1037 Рис. 14.10. Возможные си- стемы координат, исполь- зуемые при моделирова- нии движения трактора. Вращение системы коор- динат, связанной с перед- ним колесом, приводит к повороту трактора. В гло- бальной системе коорди- нат системы трактора и ко- леса движутся Стул а) б) Рис. 14.11. Объекты, определенные в локальных координатах МОДЕЛИРУЮЩИЕ ПРЕОБРАЗОВАНИЯ Чтобы построить графическую модель, к локальным определениям применяются пре- образования, в результате чего получаются экземпляры символов в общей структуре модели. Преобразования, которые применяются к определениям символов в модель- ных координатах, чтобы придать им определенную ориентацию и перевести в опре- деленную точку модели, называются моделирующими преобразованиями. Как пра- вило, в пакете моделирования присутствуют следующие типичные преобразования: трансляция, вращение и масштабирование, хотя в определенных приложениях могут использоваться и другие преобразования.
1038 Глава 14. Иерархическое моделирование СОЗДАНИЕ ИЕРАРХИЧЕСКИХ СТРУКТУР Первое действие в приложении иерархического моделирования — это построить мо- дули, объединяющие базовые символы. Сами по себе модули могут объединяться в модули более высокого уровня и т.д. Каждый исходный модуль определяется как перечень экземпляров символов и необходимых параметров преобразования каждо- го символа. Каждый модуль следующего уровня определяется как набор символов и экземпляров модулей более низких уровней плюс их параметры преобразования. Данный процесс продолжается до корня дерева, которое представляет общую модель в глобальных координатах. В пакете моделирования модуль создается последовательностью команд, подоб- ной приведенной ниже. createModulel setSymbolTransformationl insertSymboll setSymbolTransformation2 insertSymbol2 closeModulel С каждым экземпляром базового символа сопоставляется набор параметров преоб- разования этого модуля. Подобным образом модули объединяются в модули более высоких уровней, при этом используются примерно такие функции. createModule6 setModuleTransformationl insertModulel setModuleTransformation2 insertModule2 setSymbolTransformations insertSymbol5 closeModule6 Функция преобразования каждого модуля или символа определяет, как этот объект входит в модуль более высокого уровня. Существует возможность задать матрицу преобразования, которая умножается слева или справа на текущую матрицу преобра- зования либо же заменяет ее.
14.4. Иерархическое моделирование с использованием таблиц отображения 1039 Пакет моделирования может содержать базовый набор символов, однако этот набор может не иметь форм, необходимых для конкретного приложения. В этом слу- чае в программе моделирования следует создать дополнительные формы. В качестве примера приведем следующий псевдокод, иллюстрирующий спецификацию простой модели велосипеда. createWheelSymbol createFrameSymbol createBicycleModule setFrameTransformation insertFrameSymbol setFrontWheelTransformation insertWheelSymbol setBackWheelTransformation insertWheelSymbol closeBicycleModule Обычно в системе, разработанной для иерархического моделирования, можно использовать множество иных доступных процедур. Модули допускается отображать избирательно или временно исключать из представления системы. Все это позволяет разработчику экспериментировать с различными формами и структурами. Кроме того, модули можно выделять визуально или перемещать по экрану в процессе разработки. 14.4. ИЕРАРХИЧЕСКОЕ МОДЕЛИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ ТАБЛИЦ ОТОБРАЖЕНИЯ OpenGL Для описания сложных объектов в OpenGL используются вложенные таблицы отобра- жения, формирующие иерархические модели. Все символы и модули модели создают- ся функцией glNewList. Кроме того, для вложенных таблиц в определении таблицы более высокого уровня используется функция glCallList. С любым вставленным объектом могут соотноситься геометрические преобразования, определяющие поло- жение, ориентацию и размер в модуле более высокого уровня. В качестве примера приведем следующий код, предназначенный для описания велосипеда, состоящего просто из рамы (frame) и двух идентичных колес (wheel).
1040 Глава 14. Иерархическое моделирование glNewList (bicycle, GL_COMPILE); glCallList (frame); glTranslatef (txl, tyl, tzl); glCallList (wheel); glTranslatef (tx2, ty2, tz2); glCallList (wheel); glEndList ( ); Таблица отображения frame также может состоять из отдельных таблиц отображе- ния, описывающих рычаги управления, цепь, педали и другие компоненты. 14.5. РЕЗЮМЕ В приложениях компьютерной графики термином модель называют графическое представление некоторой системы. Базовые компоненты системы представлены как символы, которые определяются в локальных системах координат (модельные, или главные, координаты). Модель, например, электрическая цепь, создается путем раз- мещения элементов символов в выбранных местах с выбранной ориентацией. Многие модели строятся как иерархии символов. Иерархическую модель мож- но построить вложением модулей, составленных из экземпляров базовых символов и других модулей. Данный процесс вложения может опускаться до уровня симво- лов, которые определены графическими выходными примитивами и их параметрами. При вложении каждого символа или модуля в модуль более высокого уровня для вложенной структуры задается соответствующее моделирующее преобразование. Иерархическая модель в OpenGL реализуется с помощью таблицы отображения. Чтобы определить общую структуру системы и составляющих ее модулей, можно использовать функцию glNewList. Отдельные символьные структуры или другие модули вводятся в модуль с помощью функции glCallList, перед которой указы- вается соответствующий набор преобразований, задающих положение, ориентацию и размер введенного компонента. ЛИТЕРАТУРА Примеры моделирования с помощью OpenGL приводятся в книге [400].
Упражнения 1041 УПРАЖНЕНИЯ 14.1. Обсудите модельные представления, которые подошли бы нескольким разным системам. Обсудите также, как в каждой системе можно реализовать графические представления. 14.2. Разработайте пакет двухмерной схемы производства. Разработчику должны быть доступны меню форм элементов мебели, чтобы с помощью мыши можно было выбирать и размещать объект в любой точке в пределах одной комнаты (одноуровневая иерархия). Преобразования экземпляров можно ограничить трансляцией и вращением. 14.3. Расширьте пакет из предыдущего примера, чтобы формы элементов мебели можно было масштабировать. 14.4. Разработайте пакет двухмерной схемы производства, представляющего меню форм мебели. Следует использовать двухуровневую иерархию, чтобы элементы мебели можно было раз- мещать в различных рабочих областях, а рабочие области — систематизировать в пределах большей области. Формы мебели можно располагать в рабочих областях, используя только преобразования трансляции и вращения. 14.5. Расширьте пакет из предыдущего примера, чтобы формы элементов мебели можно было масштабировать. 14.6. Напишите набор процедур для создания и отображения на экран символов для разработки логических схем. Набор символов как минимум должен включать логические элементы И, ИЛИ и НЕ, изображенные на рис. 14.1. 14.7. Разработайте пакет моделирования логических схем, позволяющий размещать электриче- ские символы в цепи. Используйте набор символов из предыдущего примера, а для по- мещения в сеть экземпляра одной из форм используйте только трансляцию. Компонент, помещенный в сеть, должен отрезками соединяться с другими указанными компонентами. 14.8. Напишите набор процедур для редактирования модулей, созданных в программе- приложении. Процедуры должны разрешать следующие типы редактирования: объединение, вставка, замена и удаление элементов модулей. 14.9. Составьте программу удаления выделенного объекта при данных координатах границ всех отображенных объектов модели. 14.10. Напишите процедуру отображения и удаления заданного модуля модели. 14.11. Разработайте процедуру избирательно выносящую модули из изображения модели или воз- вращающую модули на экран. 14.12. Напишите процедуру визуального выделения выбранного модуля. Например, выбранный модуль должен отображаться другим цветом или вмещаться в прямоугольный контур. 14.13. Разработайте процедуру визуального выделения выбранного модуля модели — модуль дол- жен мигать (мерцать).
ГЛАВА 15 Форматы графических файлов Компьютерная сцена, созданная с имитацией мазков кистью акварельными красками (перепечатано с разрешения Aydin Controls, подразделении Aydin Corporation)
15.1. Конфигурация файлов изображений 15.4. Формат основного файла 15.2. Методы снижения цветности 15.5. Резюме 15.3. Методы сжатия файлов Л юбое записанное графическое представление называется графическим файлом или файлом изображения. Для систем растровой графики цвет- ной дисплей представляется в буфере кадров как набор RGB-значений пикселей. Как отмечалось в разделе 2.1, содержимое буфера кадров (или любого его прямоугольного блока) называется пиксельным отображением (pixmap). Хотя монохроматические изображения можно хранить в форме битовых отображений (используя для записи каждого пикселя один бит), большинство растровых изображе- ний в настоящее время записываются именно как пиксельные отображения. Вообще, любое растровое представление изображения называется растровым файлом. Для упорядочения информации в файле изображения разработано множество форматов, и полноцветные растровые файлы могут быть довольно большими, так что боль- шинство форматов включают определенную схему сжатия, позволяющую уменьшить размер файла как с целью архивации, так и с целью передачи. Кроме того, при де- монстрации изображения в системе с ограниченными цветовыми возможностями, или когда файл требуется сохранить в формате, в котором не предусмотрено исполь- зование 24 бит на пиксель, число кодов цвета в полноцветном изображении нужно уменьшить. Ниже предлагается краткое введение в тему форматов графических фай- лов, и излагаются широко используемые методы снижения размера файла и числа цветов, используемых при показе изображения на экране. 15.1. КОНФИГУРАЦИИ ФАЙЛОВ ИЗОБРАЖЕНИЯ Коды цветов пикселей в растровом файле изображения — это обычно неотрицатель- ные целые числа, а диапазон изменения кодов зависит от числа битов, доступных для представления пикселя. Для полноцветного (24 бит на пиксель) RGB-изображения на код каждого цветового элемента выделяется один байт, при этом значения R, G
1044 Глава 15. Форматы графических файлов и В меняются от 0 до 255. Несжатый файл с растровым изображением, состоящий из кодов RGB, иногда называется необработанными данными или необработанным растровым файлом. При сжатии файлов, кроме RGB, используются и другие цвето- вые модели, включая HSV, HSB и YCrCb- От формата файла зависит число доступных битов на пиксель. Формат файла обычно предусматривает заголовок, предоставляющий информа- цию о структуре файла. Для сжатых файлов заголовок может также содержать табли- цы и другие детали, необходимые для декодирования и отображения сжатого изобра- жения. Заголовок может включать различную информацию, такую как размер файла (число строк развертки и число пикселей на строку развертки), число битов или бай- тов, выделенных на пиксель, использованная схема сжатия, диапазон кодов цвета, представляющих значения пикселей, и фоновый цвет изображения. Другие характеристики файла растрового изображения — это упорядочение бай- тов в файле. Большинство компьютерных процессоров записывают многобайтовые целые числа, начиная с самого старшего разряда, но некоторые процессоры записыва- ют многобайтовые числа, начиная с младшего разряда. Термином обратный порядок (big-endian) называют упорядочение, при котором первым идет старший байт, а терми- ном прямой порядок (little endian) называют упорядочение с первым младшим байтом. В некоторых форматах файлов изображение записывается в форме геометриче- ского представления — списки координат и другая информация для прямолинейных сегментов, закрашенных областей, дуг окружности, сплайновых кривых и других примитивов. Геометрическое представление может также содержать информацию по атрибутам и параметрам наблюдения. Данный тип представления изображения назы- вается векторным форматом, даже если не все геометрические структуры опреде- лены с помощью прямолинейных сегментов. Изначально термином векторный файл называли список прямолинейных сегментов, используемых для отображения вектор- ной системы. Хотя сейчас на место векторных систем пришли растровые, и к “вектор- ным” файлам были добавлены описания нелинейных объектов, указанное название по-прежнему используется для всех файлов, содержащих геометрическое представ- ление изображения. Форматы файлов, поддерживающие геометрическое и растровое представление изображения, называются гибридными форматами или метафайлами. В приложениях научной визуализации часто используется файл изображения, представляющий собой набор значений данных, сгенерированных измерительными инструментами или средствами компьютерного моделирования. Далее такие данные применяются различными программами для визуализации (псевдоцветного отобра- жения на дисплей), изоповерхностного представления или объемной визуализации.
15.2. Методы снижения цветности 1045 Исходные RGB-коды Сокращенные RGB-коды к-1 Рис. 15.1. Равномерное снижение цветности RGB-значений в пол- ноцветном изображении до к уровней МЕТОДЫ СНИЖЕНИЯ ЦВЕТНОСТИ Для сокращения числа цветов, используемых при демонстрации изображения на экране, разработано несколько методов. Наиболее популярными из них являются те, в которых коммутация нескольких цветов (сокращенного набора) максимально близко передает исходный набор цветов. Иногда методы снижения цветности называют квантованием — термином, ис- пользуемым в физике и математике (квантовая механика и теория выборок) для обо- значения процесса, производящего набор дискретных значений по непрерывному распределению. Однако файл растрового изображения — это не непрерывное рас- пределение; он содержит конечный дискретный набор кодов цвета. Следовательно, любой метод снижения цветности просто заменяет один дискретный набор цветов другим (меньшим по размеру). Более того, распространенные процессы снижения цветности не генерируют такой наборов цветов, чтобы каждый элемент этого на- бора представлял собой набор величин, кратных некоторому выбранному значению. Другими словами, снижение цветности не дает набора квантованных кодов цвета. РАВНОМЕРНОЕ СНИЖЕНИЕ ЦВЕТНОСТИ Простой метод снижения цветности в растровом файле — разделить каждый уровень цвета R, G и В на целое число и округлить результат. Например, если разделить на 2 все компоненты R, G и В в полноцветном представлении, число возможных значений сократится до 128 уровней. Следовательно, при равномерном сокращении, группы смежных уровней цвета заменяются сжатыми уровнями цвета (рис. 15.1). Другой подход — заменить либо группу значений пикселей значением среднего пикселя группы, либо группу пикселей — средним цветом группы.
1046 Глава 15. Форматы графических файлов Вообще, можно ожидать, что для каждого из RGB-компонентов в файле изобра- жения будут представлены не все 256 значений. Следовательно, метод равномерного сокращения цветности можно применить к уровням цвета между минимальным и максимальным, реально присутствующим в файле изображения. Кроме того, можно к различным RGB-компонентам применять различные кри- терии сжатия. Например, можно так сократить полноцветное изображение, чтобы красный и зеленый компоненты представлялись 3 бит каждый (8 уровней), а синий компонент представлялся 2 бит (4 уровня). СНИЖЕНИЕ ЦВЕТНОСТИ ПО ПОПУЛЯРНОСТИ Другой подход к снижению цветности — это оставить только коды цветов, которые встречаются наиболее часто в представлении изображения. Вначале можно обрабо- тать входной файл образа, чтобы уменьшить битовое представление отдельных RGB- компонентов. Далее по этому модифицированному набору цветов строится функция плотности, или гистограмма частоты появления каждого RGB-компонента. Чтобы получить уменьшенный файл цветов с к цветами, необходимо выбрать в файле изоб- ражения к наиболее часто встречающихся цветов. МЕДИАННОЕ СОКРАЩЕНИЕ ЦВЕТНОСТИ В данном алгоритме цветовое пространство файла изображения делится на к подоб- ластей и вычисляется средний цвет каждой подобласти. Чтобы сформировать подоб- ласти, вначале определяются минимальное и максимальное значения каждого RGB- компонента: 7?тт, Rmax, Gm[n, Gmax, Дшп и Втах. Данные значения определяют границы имеющихся на изображении блоков цветов в RGB-кубе. В наибольшем из этих трех интервалов проводится медиана, и это значение используется для форми- рования двух меньших блоков цветов. Проиллюстрируем сказанное на примере. Если наибольший диапазон имеет красный компонент, вычисляется Rmedian, при котором половина кодов цветов пикселей больше этого значения, а половина — меньше. Далее блок цветов изображения разрезается на два подблока по уровню 7?median, как показа- но на рис. 15.2. Затем оба подблока цветов обрабатываются с использованием той же процедуры деления. Данный процесс продолжается, пока исходный блок цветов изоб- ражения не разделится на к подблоков. На каждом этапе процедуру деления можно применять к наибольшему подблоку. Для каждого подблока с необходимой точностью определяется средний блок, и все цвета изображения подблока заменяются средним цветом подблока.
15.3. Методы сжатия файлов 1047 Рис. 15.2. Блок цветов изображения и деление этого блока в точке, соответ- ствующей положению медианы красно- го компонента 15.3. МЕТОДЫ СЖАТИЯ ФАЙЛОВ Для уменьшения числа битов в файле изображения можно использовать множество методов сжатия, но эффективность конкретного метода зависит от типа изображе- ния. Простые методы поиска шаблонов в файле изображения эффективнее всего использовать с геометрическими структурами, которые содержат большие одноцвет- ные области, тогда как наиболее сложные схемы сжатия дают лучшие результаты с фотореалистичными изображениями компьютерной графики и оцифрованными фо- тографиями. Общий подход, применяющийся для снижения размера графического файла, — заменить коды цвета кодами, которые требуют меньшего числа битов, чем в исходном файле. Кроме того, в сжатый файл включаются коды, указывающие на конец строки развертки и конец файла изображения. Подобные алгоритмы сжатия включают операции с плавающей точкой, которые могут вводить ошибки округления. Кроме того, часть методов используют прибли- жения, которые также модифицируют цвета. В результате файл, который был декоди- рован из сжатого файла, часто содержит коды цветов, не совсем точно совпадающие с цветами исходного изображения. Например, если во входном файле код RGB-цвета задан как (247, 108, 175), после декодирования сжатого файла этот код может вы- глядеть как (242, 111, 177). Впрочем, подобные изменения цвета вполне допустимы, поскольку наши глаза нечувствительны к небольшим изменениям цвета. Методы сокращения файла, которые не затрагивают значения в файле изобра- жения, классифицируются как методы сжатия без потерь, а те, которые вводят изменения, называются сжатием с потерями. В большинстве случаев сжатие с поте- рями дает больший коэффициент сжатия файла, где коэффициент сжатия — это число битов в исходном файле, деленное на число битов в сжатом файле.
1048 Глава 15. Форматы графических файлов ГРУППОВОЕ КОДИРОВАНИЕ В данной схеме сжатия в файле изображения просто выявляются смежные одинако- вые значения. Затем в сжатом файле указывается повторяющаяся величина и число повторов. Например, если значение 125 повторяется 8 раз подряд вдоль строки раз- вертки, в сжатом файле записываются значения 8 и 125. При этом исходные восемь байт, необходимые для хранения группы, сокращаются до двух. Данная схема коди- рования также хорошо подходит для изображений с большими одноцветными обла- стями. При этом для таких изображений, как оцифрованные фотографии, характерны частые изменения цвета и малое число последовательных повторяющихся значений, так что многие коды цвета будут записываться с коэффициентом повторения 1. Для повышения эффективности стандартного алгоритма группового кодирования применяются несколько его модификаций. Например, можно использовать отрица- тельный коэффициент повторения, чтобы указать последовательность неповторяю- щихся значений, а не просто записывать коэффициент повторения 1 для каждого значения в неповторяющейся последовательности. В качестве примера сказанного можно привести следующий набор значений: {20, 20, 20, 20, 99, 68, 31, 40, 40, 40, 40, 40, 40, 40, 40, . . который можно кодировать следующим образом: {4, 20, -3, 99, 68, 31, 8, 40, . . . }, откуда видно, что значение 20 встречается 4 раза, затем идет 3 неповторяющихся значения 99, 68 и 31, за которыми, в свою очередь, следует 8 чисел 40. В приведенном примере кодирования первые 15 байт входного файла сжимаются в 8 байт. КОДИРОВАНИЕ LZW Метод кодирования, разработанный Лемпелем (Lempel), Зивом (Ziv) и Уэлшем (Welch), является модификацией ранних алгоритмов распознавания шаблонов LZ, LZ77 и LZ78. В схеме LZW повторяющиеся шаблоны в файле изображения заменя- ются кодом. Например, следующий список из 12 значений содержит два вхождения каждого шаблона {128, 96} и {200, 30, 10}: {128, 96, 200, 30, 10, 128, 96, 50, 240, 200, 30, 10, . . . }. Два данных шаблона можно заменить кодами cl и с2, а оставшийся шаблон {50, 240} соотнести с кодом сЗ. При этом 12 первых значений входного файла сокраща- ются до следующих 5 байт. {cl, с2, cl, сЗ, с2, . . . }
15.3. Методы сжатия файлов 1049 Альтернативно любую неповторяющуюся последовательность значений, такую как {50, 240}, можно записать в сжатом файле без присвоения кода. По сути, алгоритм LZW выполняет поиск повторяющихся последовательностей и строит таблицу таких последовательностей вместе с кодами, присвоенными им. Получающиеся таким образом схемы кодирования называются замещающими алго- ритмами или алгоритмами со словарем. Впоследствии сжатый файл декодируется по кодовой таблице. ДРУГИЕ МЕТОДЫ СЖАТИЯ НА ОСНОВЕ РАСПОЗНАВАНИЯ ШАБЛОНОВ Схемы распознавания шаблонов можно использовать для выделения повторений определенных черно-белых или цветных (RGB) комбинаций в файле изображения. Чтобы еще больше сократить размер файлов изображений, можно обнаружить и за- кодировать дублирующиеся строки развертки и другие шаблоны. Кроме того, для получения небольших кодированных самоподобных наборов кодов цвета можно ис- пользовать фрактальные методы. КОДИРОВАНИЕ ХАФФМАНА Сжатие файла часто дополнятся кодированием Хаффмана — для записи значений в файле изображения используется код переменной длины. При кодировании Хафф- мана самый короткий код присваивается наиболее часто встречающемуся в файле значению, а самый длинный — наименее часто встречающемуся. Основной принцип алгоритма Хаффмана тот же, что и в азбуке Морзе, в которой буквам алфавита сопоставляются символьные коды переменной длины. Буквам с высокой частотой появления в схеме Морзе присваиваются односимвольные коды, а редко встречающимся — четырехсимвольные коды. Например, буква “Е” кодируется как “точка” (•), буква “Т” кодируется как “тире” (—), а буква “Q” кодируется как четырехсимвольная последовательность из одной точки и трех тире(-• —)'. В коде Хаффмана используются не символьные, а битовые коды переменной длины, которые сопоставляются со значениями в файле изображения и позволяют добиваться больших коэффициентов сжатия. Первый этап в кодировании Хаффмана — подсчитать число вхождений каждого значения во входной файл изображения. Далее соответственно частоте вхождения значениям присваиваются битовые коды. Один метод присвоения битовых кодов пе- ременной длины заключается в построении бинарного дерева с частыми значениями вблизи вершины и редкими значениями в качестве листьев. Начиная с редких зна- чений, снизу вверх формируются поддеревья. Каждому корневому узлу поддерева присваивается числовая метка — сумма частот или меток узлов двух его потомков. !В русской азбуке Морзе приведенные коды соответствуют буквам “Е”, “Т" и “Щ". — Прим, иерее.
1050 Глава 15. Форматы графических файлов ТАБЛИЦА 15.1. Частота вхождения значения в небольшом файле-примере Значение Частота вхождения 96 177 141 85 210 43 Всего в файле: 8 4 3 3 2 1 21 Рис. 15.3. Формирование поддерева Хаффмана с использованием файловых значений 210 и 43 (2I0) (43) Рис. 15.4. Формирование поддерева Хаффмана с (141) (85) использованием файловых значений 141 и 85 Слисок оставшихся меток частот 96 177 141 85 node 8 4 3 3 3 Список оставшихся меток частот 96 node 177 node 8 6 4 3 После формирования дерева все левые поддеревья помечаются двоичным значением 0, а все правые — 1. Далее для каждого значения формируется битовый код путем конкатенации битовых меток ветвей с вершины дерева до положения узла данного значения на дереве. Для иллюстрации общих этапов построения дерева используем набор шести зна- чений из табл. 15.1. Данный набор представляет короткий файл изображения, содер- жащий 21 элемент, причем значение 96 встречается 8 раз, значение 177 — 4 раза и так далее для остальных четырех значений файла. Значения 210 и 43 в данной таблице имеют наименьшую частоту вхождения, по- этому используем эти два значения для создания первого поддерева (рис. 15.3). Корню этого поддерева присваивается метка, равная сумме вхождений двух его потомков: 3 = 2+1. Далее удаляем эти два файловых значения (210 и 43) из активного списка. Следующая наименьшая частота вхождения равна 3. Но мы только что создали подде-
15.3. Методы сжатия файлов 1051 Список оставшихся меток частот 96 node node 8 7 6 Рис. 15.5. Формирование поддерева Хаффма- на с использованием значения 177 и ранее со- зданного поддерева Список оставшихся меток частот node 96 13 8 Рис. 15.6. Формирование под- дерева Хаффмана путем объ- единения двух ранее создан- ных поддеревьев рево, которое также имеет метку узла 3. Следовательно, можно сформировать следу- ющее поддерево, используя любые два из названных трех элементов, которые имеют метку 3. Выберем два значения из файла и сформируем поддерево, изображенное на рис. 15.4, и удалим значения 141 и 85 из активного списка. Следующее поддерево строится из значения 177, частота вхождения которого равна 4, и поддерева, корень которого имеет метку 3 (рис. 15.5). Далее из активного списка удаляем значение 177 и узел дерева с меткой 3; теперь два элемента списка, имеющие наименьшую частоту, представляют поддеревья. Эти два поддерева сливаются, и в результате формируется новое поддерево, показанное на рис. 15.6. Наконец, построение бинарного дерева завершается (рис. 15.7) путем соединения значения 96 с последним сформирован- ным поддеревом. Значение, присвоенное корню дерева, равно общей частоте (21) вхождения всех значений во входном файле. Теперь, когда на бинарном дереве проставлены все значения, можно пометить левые ветви дерева двоичным значением “0”, а правые — значением “1”, как на рис. 15.8. Начав с корня дерева, проведем конкатенацию меток ветвей до всех листьев. В результате получим набор бинарных кодов переменной длины для всех значений в файле и заполним табл. 15.2, которая будет записана в сжатый файл. В данном примере есть одно значение, с которым сопоставлен однозначный бинарный код, три значения, с которыми соотнесены трехзначные бинарные коды, и два значения, с которым связаны четырехзначные коды. Редкие значения имеют более длинные коды, а частые значения — короткие.
1052 Глава 15. Форматы графических файлов (85) Список оставшихся меток частот Рис. 15.7. Полное бинар- ное дерево Хаффмана для значений из табл. 15.1 (177) Рис. 15.8. Полное бинар- ное дерево Хаффмана с метками на ветвях (210) (43) Список оставшихся меток частот Отметим важную характеристику кода Хаффмана — ни один битовый код не начинается с другого битового кода. Это позволяет расшифровать список кодирован- ных значений из файла, используя табл. 15.2 и табл. 15.3. Чтобы продемонстриро- вать алгоритм декодирования, предположим, что сжатый файл содержит поток битов {100100100 ...}. Первое битовое значение в этом файле равно 1, так что оно должно представлять значение 96, поскольку в таблице декодирования есть битовый код 1, и это значение не может быть префиксом ни одного другого кода. Далее имеем битовое значение 0. Других однобитовых кодов, кроме 1, нет, кроме того, нет двухбитовых кодов, поэтому следующий код — 001 или 0010. Проверяя таблицу индексированных кодов, находим файловое значение 210 и код 0010, что означает, что файлового зна- чения с кодом 001 быть не может. На этом этапе декодированы первые два файловых значения 96 и 210. Следующий код в потоке битов должен быть равен 010 или 0100. Файловое значение с кодом 010 существует, поэтому четырехбитового кода с таким префиксом быть не может. Следовательно, третье декодированное файловое значение равно 141. Подобным образом продолжаем анализировать поток битов, пока сжатый файл не будет декодирован полностью.
15.3. Методы сжатия файлов 1053 ТАБЛИЦА 15.2. Коды Хаффмана с индексами для файла-примера Индекс Значение из файла Бинарный код 1 2 3 4 5 6 96 1 177 000 141 010 85 ОН 210 0010 43 ООН ТАБЛИЦА 15.3. Справочная таблица битовых кодов Длина битового кода Минимальное Максимальное Первый кодовое значение кодовое значение индекс 1 3 4 1 1 1 000 ОН 2 0010 ООН 5 Кроме того, можно использовать другие схемы для генерации и распределения битовых кодов Хаффмана. Подсчитав частоту вхождения элементов, каждому файло- вому значению можно присвоить длину кода. Зная длины кодов и частоту вхождения, для разработки конкретные битовых кодов можно затем использовать алгоритм сли- яния списков. Кроме того, для присвоения кодов файловым значениям можно при- менить предопределенный набор кодов. Преимущество этого подхода — не нужно хранить коды в сжатом файле. АРИФМЕТИЧЕСКОЕ КОДИРОВАНИЕ В данной схеме сжатия для получения численных кодов последовательностей файло- вых значений используется частота вхождения элемента в файл. В алгоритме арифме- тического кодирования вначале вычисляется доля файла, занятая каждым значением. В результате получается набор подынтервалов, принадлежащих единичному интер- валу от 0,0 до 1,0. Затем каждая доля файла последовательно отображается в данные подынтервалы, и устанавливаются численные интервалы для различных комбинаций файловых значений. Для кодирования этих комбинаций используются численные гра- ницы подынтервалов.
1054 Глава 15. Форматы графических файлов ТАБЛИЦА 15.4. Частота вхождения и доля, занятая значениями в небольшом файле-примере Файловое значение Частота вхождения Доля файла Диапазон в единичном интервале И 16 0,20 0,00-0,20 V2 24 0,30 0,20-0,50 v3 40 0,50 0,50-1,00 Всего: 80 1,00 ТАБЛИЦА 15.5. Диапазон в единичном интервале для всех двухзначных величин, начинающихся со значения V3 Последовательность Диапазон в единичном интервале v3v3 0,50-0,60 v3v2 0,60-0,75 V3v3 0,75-1,00 Для иллюстрации описанного метода рассмотрим файл с 80 позициями и всего тремя различными значениями. Частота вхождения и соответствующие доли файла перечислены в табл. 15.4. Следовательно, значение Vj соотнесено с подынтервалом от 0,00 до 0,20 в единичном интервале, значение V2 соотнесено с подынтервалом от 0,20 до 0,50, и значение V3 соотнесено с подынтервалом от 0,50 до 1,00. Другими словами, 20 процентов единичного интервала соотнесено с Vj, 30 процентов — с V2 и 50 процентов — с V3. Если теперь отобразить в подынтервал V3, это значение займет 20 процентов верхней половины единичного интервала. Этот новый подын- тервал (от 0,50 до 0,60) представляет последовательность V3V1. Подобные результаты получаются при отображении V2 и V3 в подынтервал V3. В табл. 15.5 указаны диапа- зоны этих двухзначных последовательностей. Продолжая подобным образом, можно отобразить интервалы для двухзначных последовательностей в другие подынтерва- лы, чтобы получить последовательности для более длинных комбинаций файловых значений. Далее граничные значения подынтервалов используются для кодирования и декодирования последовательностей в файле. Чтобы остановить деление единичного интервала и присвоить численные коды комбинациям файловых значений, можно использовать различные алгоритмы. Стоит также отметить, что алгоритм арифметического кодирования обычно реализуется с помощью двоичных чисел, а не значений с плавающей точкой в единичном интер- вале. После этого сжатый файл представляет собой последовательность двоичных значений.
15.3. Методы сжатия файлов 1055 ДИСКРЕТНОЕ КОСИНУС-ПРЕОБРАЗОВАНИЕ Для сжатия файлов используется множество методов численного преобразования, включая преобразования Фурье и Адамара, но наиболее распространенным является метод дискретного косинус-преобразования (ДКП). Алгоритмы эффективной реали- зации для дискретного косинус-преобразования предлагают более быстрое выполне- ние и лучшую точность цветовоспроизведения в восстановленном изображении при больших коэффициентах сжатия. Для списка из п численных значений Vk, где к = 0,1, ..., п — 1, метод ДКП дает следующий набор преобразованных значений: где п — 1 Vk cos к=0 (21с + l)j'7T 2п ДЛЯ j = 0, 1, ... ,71 — 1, (15.1) для j = 0, ДЛЯ j ф 0. Следовательно, данный метод преобразования вычисляет дискретную сумму косину- соидальных слагаемых с повышающейся частотой и амплитудами, пропорциональны- ми входным значениям. Исключая возможные ошибки округления, исходные значения восстанавливаются с помощью обратного преобразования 71 — 1 7=0 (2k + l)j7r 2 71 для к = 0, 1, ... , п — 1. (15.2) Довольно часто преобразованные значения V- называются коэффициентами коси- нусных функций в формуле обратного преобразования. Это некорректно термино- логически, поскольку коэффициенты косинусоидальных слагаемых в сумме — это произведения CjV-. Для иллюстрации описанного метода преобразования рассмотрим следующий набор 8 входных значений. {215;209;211;207;192;148;88;63} При таком входе преобразованные значения, вычисленные с точностью до двух де- сятичных знаков, равны {471, 29; 143,81; -67, 76; 16,33; 7,42; -4, 73; 5,49; 0,05}.
1056 Глава 15. Форматы графических файлов ТАБЛИЦА 15.6. Расчет обратного ДКП Входные значения: 215 209 211 207 192 148 88 63 Число членов в сумме Значения обратного ДКП 4 212,63 211,85 211,53 207,42 188,43 147,65 95,47 58,02 5 215,26 209,23 208,91 210,04 191,06 145,02 92,84 60,64 8 215,00 209,00 211,00 207,00 192,00 148,00 88,00 63,00 В данном примере отметим, что амплитуды преобразованных значений заметно уменьшились, так что высокочастотные косинусоидальные члены вносят меньший вклад в восстановление исходных значений. Это основная характеристика дискрет- ного косинус-преобразования, позволяющая близко аппроксимировать исходные зна- чения, используя только несколько первых преобразованных значений. Следователь- но, чтобы получить сжатый файл изображения, достаточно вычислить и сохранить первую половину (или около того) преобразованных значений. В табл. 15.6 показаны результаты использования уравнения (15.2) с 4, 5 или всеми 8 преобразованными значениями для восстановления входных значений. Все рассчитанные значения в таблице округлены до двух десятичных знаков. Эффективность этой схемы сжатия можно повысить, преобразовав прямоуголь- ные блоки входных значений, а не линейные наборы значений вдоль строк развертки. Для квадратного блока п на п входных значений преобразованные значения вычис- ляются следующим образом: п—1п—1 = ^lm COS J=O fc=0 (2fc + 1)/7Г 2n (2j + 1)Ш7Г (15.3) где I, m = 0, 1, ..., n — 1 и 1 n 2 n — если I = 0 или m = 0, если I / 0 и m / 0.
15.4. Формат основного файла 1057 Кроме того, набор п на п входных значений восстанавливается с использованием обратного преобразования: у-Д у—! Г(2.7 + 1)Ztt1 Г(2k + 1)штг' = Е Е 2n “S к ' 05.4) 1=0 т=0 L J L где j, к — 0, 1, ..., п — 1. Данное преобразование и обратное к нему обычно реализуются с использованием групп входных значений 8 на 8, так что одновременно обрабатываются группы кодов цвета вдоль 8 строк развертки. 15.4. ФОРМАТ ОСНОВНОГО ФАЙЛА Для представления графических данных с различным содержимым были разработаны сотни форматов файлов для различных систем. Операционные системы, например, в программах системной обработки обычно используют несколько специально раз- работанных форматов. Помимо этого, существуют отдельные форматы для специфи- ческих приложений, например, трехмерное моделирование, анимация, графические пользовательские интерфейсы, программы бегущих лучей, видеозапись, программы научной визуализации и рисования, текстовые редакторы, пакеты табличных вычис- лений, связь в Internet, телевещание и передача по факсу. Кроме того, комитеты по стандартизации ISO и ANSI предложили несколько форматов и систем сжатия файлов общего пользования. Большинство растровых форматов файлов предназначены для хранения цветных изображений, но некоторые применимы только к битовым образам. Впрочем, имя формата часто вводит в заблуждение, поскольку термин битовый образ (bitmap) ча- сто применяется по отношению к эталонным цветным изображениям — пиксельным рисункам (pixmaps). Данная ситуация возникла в результате продолжающегося при- менения старого ярлыка “битовый образ” к растровому файлу. До разработки цветных дисплеев все растровые изображения хранились как битовые образы (один бит на пиксель), представляя на картине черно-белый пиксельный образ. По мере развития цветных методов файлы с пиксельными изображениями (несколько битов на пиксель) заменили битовые изображения. Но очень часто эти файлы по-прежнему называются битовыми изображениями. В результате многие схемы цветового кодирования, кото- рые используются при записи файлов изображений, называются форматами битовых отображений (bitmap formats), даже при том, что они являются форматами пиксель- ных отображений (несколько битов на пиксель). Впрочем, чтобы определить число битов, реально выделяемых в файле для записи каждого пикселя, можно обратиться к документации таких форматов.
1058 Глава 15. Форматы графических файлов Большей частью форматы, описанные в данном разделе, не относятся к статич- ным. Они подвержены постоянным изменениям и обновлениям, и часто существует множество версий определенного формата. СТАНДАРТ JPEG (JOINT PHOTOGRAPHIC EXPERTS GROUP) В стандартной форме эта широко используемая и сложная система, разработанная комитетом JPEG в Международной организации по стандартизации (International Or- ganization for Standardization, ISO) состоит из большого набора альтернатив сжатия файлов. В определении JPEG приведено более двух дюжин вариаций, так что его мож- но реализовать множеством различных способов, от простого алгоритма без потерь до весьма сильных методов сжатия с потерями. Однако данное стандартное определение JPEG не полностью характеризует, какую структуру должен иметь сжатый файл изоб- ражения, так что его можно использовать на различных компьютерных системах или в различных приложениях. Например, не задана организация информации в заголовке, и нет спецификаций модели цвета, которую следует использовать в сжатом файле. Стандарт JPEG определяет четыре общих метода сжатия файлов, которые на- зываются режимом без потерь, последовательным, прогрессивным и иерархическим режимами. В режиме JPEG без потерь схема распознавания шаблонов объединяет- ся либо с кодированием Хаффмана, либо с арифметическим кодированием. Впрочем, первоначальный режим JPEG без потерь не настолько эффективен, как другие доступ- ные форматы сжатия без потерь, так что реализуется он редко. Последовательный ре- жим JPEG базовой линии — это наиболее широко используемая разновидность JPEG. Для хранения численных значений цветных компонентов на изображении выделяет- ся 8 бит, а алгоритм сжатия объединяет дискретное косинус-преобразование либо с кодированием Хаффмана, либо с арифметическим кодированием. Расширенный по- следовательный режим также определен с большим числом альтернатив, чем после- довательный режим базовой линии, и в нем цветные компоненты можно записать, используя 16 бит. В прогрессивном режиме JPEG файл обрабатывается с использова- нием нескольких проходов, так что “уровни” изображения можно генерировать с пе- ременным разрешением. Данный режим, обычно называемый прогрессивным JPEG, становится популярным в Internet-приложениях, поскольку грубую аппроксимацию картинки можно получить быстро перед загрузкой файла изображения целиком. Дру- гой набор процедур для получения последовательно улучшающихся версий рисунка содержится в иерархическом режиме JPEG, который делит изображение на набор картинок. Это позволяет прогрессивно строить выбранные сегменты изображения. Из-за своей сложности иерархический режим JPEG используется не очень широко. В полномасштабной реализации JPEG могут предоставляться опции выбора ре- жима и параметров сжатия, таких как число членов, используемых в вычислении сумм при нахождении обратного ДКП. Кроме того, определения сжатия JPEG зада- ют, что либо кодирование Хаффмана, либо арифметическое кодирование можно объ-
15.4. Формат основного файла 1059 единять с дискретным косинус-преобразованием. Отметим однако, что реализации JPEG никогда не используют алгоритмы арифметического кодирования, поскольку эти алгоритмы запатентованы и требуют платы за использование. Хотя спецификация JPEG не определяет конкретной структуры сжатого файла изображения, существующие реализации используют формат для обмена файлами JPEG (JPEG File Interchange Format — JFIF), предложенный Эриком Гамильтоном (Eric Hamilton) из C-Cube Microsystems и основанный на предложениях множества пользователей JPEG. В этом формате заголовок файла содержит уникальный иден- тификатор JFIF (называемый подписью файла), версию JFIF, использованную для создания файла, размер изображения (либо в пикселях на сантиметр, либо в пиксе- лях на дюйм), высоту и ширину исходного изображения предварительного просмотра RGB (называется эскизом (thumbnail) изображения) и RGB-значения необязательного изображения предварительного просмотра. Значения пикселей в сжатом файле хра- нятся с использованием модели цвета YСгСь, и цветовые компоненты расположены в таком порядке: вначале Y, затем Сь, третьим идет Сг. Для полутонового (gray-scale) изображения используется только компонент Y. Другая информация в файле вклю- чает таблицы, требуемые алгоритмами сжатия. Целые числа в файлах JPEG хранятся с использованием обратного порядка битов. Кодирование файла изображения JPEG/JFIF (кодирование базовой линии или по- следовательное) обычно состоит из следующих операций. 1. Преобразование цвета. Пиксельные RGB-коды в файле изображения преобра- зуются в цветовые компоненты YСгСф. 2. Коммутация цветов. Число кодов цвета в файле можно уменьшить, используя только значения из выбранных пикселей или усреднив цветовые компоненты соседствующих групп пикселей. При простой реализации этой дискретизации (коммутация) используются коды цвета каждого второго, каждого третьего или каждого четвертого пикселя. Обычно коммутация цветовых компонентов выпол- няется с различными частотами, так что выбираются более яркие Y-компоненты. Это позволяет достичь большего сжатия, поскольку записывается меньше раз- личных значений цветности, Сг и Сь- 3. Дискретное косинус-преобразование. Используя уравнение (15.3), группы ко- дов пикселей 8 на 8 преобразуются в коды дискретного косинус-преобразования. 4. Сокращение преобразованных значений. Для дальнейшего сжатия кодиро- ванного файла изображения записывается сокращенный набор преобразованных значений (раздел 15.3). Число значений в сокращенном наборе может быть фик- сированным или рассчитываться с использованием алгоритма, определяющего вклад различных членов преобразования. 5. Кодирование Хаффмана. Завершающая операция сжатия выполняется пу- тем преобразования значений ДКП в коды Хаффмана, как обсуждалось в разделе 15.3.
1060 Глава 15. Форматы графических файлов Файловый формат обмена неподвижными изображениями (Still-Picture Inter- change File Format — SPIFF), разработанный Эриком Гамильтоном (Eric Hamilton) и комитетом ISO JPEG, является расширением JFIF. Данный формат имеет гораздо больше функций и опций, чем JFIF, и ожидается, что SPIFF со временем заменит JFIF в реализациях JPEG. Впрочем, подобно формату JPEG данный расширенный формат JFIF содержит гораздо больше опций, чем целесообразно применять в одной реализации. Например, JFIF использует всего одну модель цвета (YCrCb), a SPIFF предлагает на выбор тринадцать различных моделей. Для фотореалистичных изображений компьютерной графики и оцифрованных фотографий текущие реализации JPEG предлагают больший коэффициент сжатия, чем любые другие системы. При этом другие форматы могут гарантировать сравни- мые коэффициенты сжатия без потери информации о цвете для простых изображений, содержащих большие одноцветные области. CGM - МЕТАФАЙЛ КОМПЬЮТЕРНОЙ ГРАФИКИ Данный формат является еще одним стандартом, разработанным ISO и ANSI. Он предназначен для применения на любой компьютерной системе и в любой области компьютерной графики, включая научную визуализацию, автоматизированное проек- тирование, полиграфию, бизнес-графику, электронные публикации и любые прило- жения, использующие графические библиотеки GKS (Graphics Kernel System — ядро графических примитивов) или PHIGS (Programmer’s Hierarchical Interactive Graphics System — иерархическая интерактивная графическая система программиста). Таким образом, CGM поддерживает множество функций и опций. Как следует из названия “метафайл”, CGM позволяет представлять описание кар- тинки в форме пиксельного отображения или набора геометрических опеределений, включая такие атрибуты, как размер и тип линий, стиль заполнения и спецификации строк знаков. В файл изображения могут включаться и другие параметры, такие как максимальное значение кодов цветовых компонентов, размер таблицы цветов, список шрифтов, использованных в файле, и границы окон отсечения. Для минимизации размера файла в CGM используется схема знакового кодиро- вания, и численные бинарные коды оптимизируются для быстрого кодирования и декодирования файла изображения. Значения пикселей могут указываться с исполь- зованием различных цветовых схем, таких как модели RGB, CMYK, YCrCb, CIE и таблицы цветов. Кроме того, файлы пиксельных отображений можно сжать, исполь- зуя различные разновидности группового кодирования и кодирования Хаффмана. TIFF - ТЕГОВЫЙ ФОРМАТ ФАЙЛОВ ИЗОБРАЖЕНИЙ Консорциум компьютерных компаний под председательством Aldus Corporation раз- работал TIFF (Tag Image-File Format) как эффективный формат для передачи растро- вых изображений между различными приложениями и компьютерными системами.
15.4. Формат основного файла 1061 Несмотря на крайнюю сложность, формат TIFF — один из наиболее многофункцио- нальных и универсальных. Он широко используется в таких приложениях, как меди- цина, настольные издательские системы, графические пользовательские интерфейсы, запись спутниковых изображений и передача по факсу. Формат TIFF можно использовать с черно-белыми, полутоновыми и полноцвет- ными изображениями, а файлы TIFF предназначены для хранения множественных растровых изображений. Информация о цвете пикселей может предоставляться в форме RGB-компонентов или таблицы цветов. В формате TIFF предлагается больше альтернатив сжатия, чем в любой другой системе. Данные схемы сжатия включают комбинации группового кодирования, кодирования LZW, Хаффмана и подходят для методов JPEG. PNG - ФОРМАТ ПЕРЕНОСИМОЙ СЕТЕВОЙ ГРАФИКИ Созданный независимой группой разработчиков формат PNG предлагает крайне эф- фективную схему сжатия для хранения изображений. В качестве алгоритмов сжатия в файлах формата PNG используются кодирование Хаффмана и разновидности ко- дирования LZ. В настоящее время формат популярен в Internet-приложениях, где он применяется для хранения и передачи изображений. Он также полезен для временной записи изображений с целью повторного редактирования. Для простых изображений компьютерной графики PNG генерирует файлы с очень большими коэффициентами сжатия, сравнимыми с коэффициентами сжатия файлов JPEG. Особенности формата: целые числа записываются с обратным порядком битов, а цветовые компоненты могут задаваться с точностью до 16 бит на пиксель. В PNG поддерживается несколько опций, включая цветовые компоненты RGB и XYZ, шка- лу полутонов, таблицы цветов и альфа-факторы для предоставления информации о прозрачности. ХВМ - БИТОВЫЙ ФОРМАТ СИСТЕМЫ X WINDOW И ХРМ - ПИКСЕЛЬНЫЙ ФОРМАТ СИСТЕМЫ X WINDOW В отличие от других форматов ХВМ и ХРМ хранят информацию об изображении в виде кода С или C++, т.е. предполагается, что данный код будет обрабатываться на рабочих станциях с использованием системы X Window. Таким образом, значения пикселей представляются в массивах, записанных по строкам развертки слева напра- во. Как следует из названия, ХВМ — это формат битовых отображений (один бит на пиксель), а ХРМ — формат пиксельных отображений (несколько битов на пиксель). Большинство существующих Web-браузеров поддерживают оба указанных формата. Форматы ХВМ и ХРМ не содержат алгоритмов сжатия, но размер файлов можно уменьшить с использованием специально разработанных программ сжатия. Вместо файлов заголовка в данных форматах используются директивы предпроцессора #de-
1062 Глава 15. Форматы графических файлов fine для задания такой информации, как число пикселей на строку развертки и число строк развертки. В формате ХВМ битовое значение 1 представляет текущий цвет пе- реднего плана, а битовое значение 0 — текущий цвет фона. В формате ХРМ значения могут записываться в таблицах цветов с использованием компонентов RGB или HSV. ФОРМАТ ADOBE PHOTOSHOP Широко используемый в приложениях обработки изображений формат Adobe Pho- toshop оптимизирован для быстрого доступа к большим полноцветным растровым изображениям. В противовес этому использованная в Photoshop схема группового кодирования дает очень слабое сжатие, а в ранних версиях Photoshop вообще не применяются схемы сжатия. Значения пикселей записываются с обратным порядком байтов, и Photoshop пред- лагает несколько опций на выбор. Photoshop поддерживает пиксельные, битовые (мо- нохромные отображения) и полутоновые изображения. Цвета могут храниться с ис- пользованием цветовых компонентов RGB, CMYK или в таблицах цветов. Кроме того, для представления нескольких цветов на пиксель и полутоновых изображений, а также параметров прозрачности предлагаются различные схемы. MacPaint - ФОРМАТ MACINTOSH PAINT Продукт Apple Corporation MacPaint — это стандартный формат для всех приложений Macintosh. Файлы изображения в таком формате — это битовые отображения, значе- ние 0 означает белый, 1 — черный цвет. Формат MacPaint обычно используется для текста, рисунков от руки и иллюстративных вставок. Пиксельные значения хранятся с обратным порядком байтов, и файлы MacPaint всегда содержат 576 пикселей на строку развертки и 720 строк развертки. Для сжатия файлов изображения используется групповое кодирование. PICT - ФОРМАТ ДАННЫХ ИЗОБРАЖЕНИЯ Данный гибридный формат — это еще один продукт для приложений Macintosh от Apple Corporation. Он поддерживает изображения, которые заданы как битовые, пик- сельные отображения или геометрические представления. Файл PICT в формате гео- метрического представления содержит список функций Macintosh QuickDraw, кото- рые определяют изображение как набор сегментов прямых, многоугольников, дуг, битовых отображений, иных объектов, параметров отсечения, атрибутов и других параметров состояния. Изображения можно задать с использованием монохромной формы (битового отображения), цветовых компонентов RGB или таблицы цветов. Для сжатия растро- вых файлов можно использовать алгоритм группового кодирования.
15.4. Формат основного файла 1063 BMP - ФОРМАТ БИТОВОГО ОТОБРАЖЕНИЯ Хотя формат называется форматом битового изображения, по сути, BMP поддержи- вает файлы изображения, которые содержат несколько битов на пиксель. Данный фор- мат разработан Microsoft Corporation для приложений операционной системы Win- dows. Другой подобный формат пиксельного отображения, также именуемый BMP, используется операционной системой IBM OS/2. Пиксельные значения в файле BMP записаны с прямым порядком битов с ис- пользованием 1, 2, 4, 8, 16, 24 или 32 бит/пиксель. Цветовые коды пикселя можно задать как цветовые компоненты RGB или через таблицы цветов. Кроме того, стро- ки развертки пикселей записываются снизу вверх, а начало координат находится в нижнем левом углу пиксельного отображения. Файл BMP обычно не сжимается, но к пиксельным отображениям с 4 или 8 бит/пиксель может применяться алгоритм группового кодирования. PCX - ФАЙЛОВЫЙ ФОРМАТ PAINTBRUSH Разработанный ZSoft Corporation PCX — это еще один формат пиксельного отобра- жения, используемый операционными системами Windows. Файлы изображения в формате PCX могут содержать от 1 до 24 бит/пиксель, и значения пикселей могут задаваться с использованием RGB-компонентов или таблиц цвета. Значения запи- сываются с прямым порядком битов, а строки развертки упорядочены с вершины изображения до низа. Кроме того, растровые файлы можно сжимать, используя груп- повое кодирование. TGA - ФОРМАТ ГРАФИЧЕСКИХ АДАПТЕРОВ Truevision Разработанный Truevision Corporation для использования с графическими адаптерами Targa и Vista формат пиксельного отображения TGA также известен как формат Targa. Этот формат широко используется для редактирования видео. В формате TGA значения пикселей записываются с прямым порядком битов, а файлы изображения могут содержать 8, 16, 24 или 32 бит/пиксель. Цвета пикселей могут задаваться как RGB-компоненты или через таблицы, причем возможно два формата таблиц. Может использоваться единственная таблица цветов RGB, или в от- дельных таблицах могут предоставляться компоненты R, G и В. Обычно файлы TGA не сжимаются, хотя для больших файлов изображения может применяться групповое кодирование.
1064 Глава 15. Форматы графических файлов GIF - ФОРМАТ ГРАФИЧЕСКОГО ОБМЕНА Данный формат, разработанный для эффективной передачи по телефонной линии растровых файлов изображения, является продуктом CompuServe Corporation. Ис- пользуя алгоритм LZW, GIF дает разумно хорошее сжатие для простых изображений компьютерной графики. В то же время сжатие, которое GIF дает для фотореалистич- ных изображений, хуже, чем сжатие JPEG или PNG. Хотя GIF используется во многих приложениях, его популярность значительно снизилась, поскольку алгоритм сжатия LZW запатентован и требует платы за использование авторских прав. С помощью GIF создаются монохромные или многоцветные изображения, но значения пикселей можно задавать только в диапазоне от 1 до 8 бит, что позволя- ет использовать максимум 156 цветов. Значения пикселей записываются с прямым порядком битов с применением цветных таблиц RGB. 15.5. РЕЗЮМЕ Для систем растровой графики файл изображения — это обычно пиксельное RGB- отображение, которое часто называется необработанным растровым файлом. Пик- сельные значения RGB записываются как целые числа в диапазоне от 0 до макси- мального значения, которое определяется числом битов, доступных для представле- ния каждого пикселя. Изображение также может храниться с использованием пред- ставления, содержащего геометрические описания таких компонентов, как сегменты прямых, заполненные области и сплайны. Если растровые файлы необходимо передавать между системами или хранить в определенной форме, может потребоваться снизить число цветовых значений, пред- ставленных на изображении. Число цветов можно сокращать равномерно, различным образом объединяя цветовые уровни, например, усредняя их. Популярным методом является выбор наиболее часто встречающихся кодов цвета. Метод разрезания по ме- диане делит пространство цветов на набор блоков, причем все цвета внутри каждого блока замещаются средним цветом блока. Для хранения файлов изображения в удобной форме разработаны различные фор- маты, предназначенные для определенных приложений или систем. Данные форматы отличаются структурой файла заголовка, упорядочением битов (прямой порядок или обратный) для записи целочисленных значений и методами (если есть), используемы- ми для снижения размера файла при хранении. Эффективность метода сокращения файла выражается через коэффициент сжатия — отношение размера исходного файла к размеру сжатого файла. Алгоритмы сокращения файлов, меняющие коды цвета в файле изображения, называются методами с потерями, алгоритмы, передающие ис- ходные цвета без искажения, называются методами без потерь. Некоторые форматы файлов также подразумевают использование схем снижения цветности.
7 ! Упражнения 1065 I Общим методом сжатия файлов изображения является групповое кодирование, | при котором последовательность повторяющих пикселей замещается значением и | длиной серии. Разновидностью группового кодирования является схема сжатия фай- I лов LZW, которая заменяет повторяющиеся наборы пикселей кодом. Другие методы | сжатия, основанные на распознавании шаблонов, включают сравнение строк раз- • вертки и фрактальные процедуры для определения самоподобных наборов значений | пикселей. В кодировании Хаффмана код переменной длины так присваивается ко- | дам цвета, что наиболее часто встречающиеся значения имеют наиболее короткий । код. Арифметическое кодирование использует частоту вхождения кодов цвета в фай- I ле изображения для последовательного деления единичного интервала от 0,0 до 1,0. (Далее границы каждого подынтервала используются для кодирования последователь- ностей кодов цвета, представленных этим подынтервалом. При дискретном косинус - преобразовании коды цвета пикселей умножаются на косинусоидальные слагаемые с увеличивающейся частотой, а затем полученные произведения суммируются. Данное суммирование переводит набор кодов цвета пикселей в некоторый набор значений. Затем некоторые преобразованные значения отбрасываются, за счет чего достигается сжатие файла изображения с потерями. | Для различных графических приложений и разных компьютерных систем до- ступно множество форматов файлов. Одни форматы разработаны организациями по стандартизации ISO и ANSI, другие предлагаются компаниями — производителями программного или аппаратного обеспечения, третьи — продукты независимых групп. В число широко используемых форматов входят JPEG, TIFF, PNG и форматы для операционных систем компьютеров Apple Macintosh, X Window и Windows. ЛИТЕРАТУРА Методы снижения цветности представлены в работах [7, 122, 149, 151, 176]. В книге [130] в общем контексте обсуждаются методы обработки изображения и преобразования. Подробно различные алгоритмы сжатия файлов рассмотрены в публикациях [7, 14, 157, 276, 383, 412, 414]. Общая информация по форматам графических файлов изложена в [46, 216]. Для получения дополнительной информации по формату JPEG рекомендуется обратиться к работе [348]. Стандарт формата файлов CGM подробно освещен в книге [152]. УПРАЖНЕНИЯ 15.1. Напишите программу реализации равномерного снижения цветности для всех уровней цвета в полноцветной системе, где каждый RGB-компонент задается в целочисленном диапазоне от 0 до 255. Вход — любой целый делитель d, на который будут делиться все цветовые компоненты, а выход — набор сокращенных целых кодов цвета. 15.2. Так модифицируйте программу из предыдущего упражнения, чтобы в качестве входа ис- пользовался не делитель, а целое к, которое задает сокращенное число уровней конечного изображения. j
1066 Глава 15. Форматы графических файлов 15.3. Модифицируйте программу из упражнения 15.2, чтобы компоненты R, G и В сокращались по-разному. Сокращение цветности можно задать как целочисленный диапазон для каждого компонента или как число битов. 15.4. Напишите программу реализации популярной схемы снижения цветности для сокращения входного файла изображения до к цветов. Вход программы — массив кодов цвета пикселей и размер массива, который задается числом строк развертки и числом пикселей вдоль каждой строки развертки. 15.5. Напишите программу реализации схемы снижения цветности методом разрезания по меди- ане. Файл изображения, содержащий п кодов цвета RGB, должен сокращаться до к кодов цвета. 15.6. Напишите программу реализации группового кодирования для одной строки развертки, со- держащей 1024 целых значений, принадлежащих диапазону от 0 до 255. 15.7. Модифицируйте программу из предыдущего упражнения, чтобы она кодировала файл, со- стоящий из п строк развертки. 15.8. Напишите программу реализации упрощенного алгоритма кодирования LZ для одной строки развертки, содержащей 1024 целых значений, принадлежащих диапазону 0-255. Программа должна выполнять поиск только трехэлементных шаблонов, представляющих повторяющи- еся цвета RGB. В шаблонах используйте целочисленные коды. 15.9. Расширьте программу из предыдущего упражнения, чтобы она обрабатывала входной файл с п строками развертки. 15.10. Для данного входного файла изображения, содержащего п. строк развертки и т RGB-цветов пикселей в каждой строке, напишите программу, выдающую таблицу частот вхождения кодов цвета. 15.11. Используя частоты вхождения из предыдущего упражнения, напишите программу сжатия файла изображения с использованием кодирования Хаффмана. 15.12. Используя частоты вхождения из упражнения 15.10, напишите программу сжатия файла изображения с использованием арифметического кодирования. 15.13. Дан список 32 цветов пикселей, причем каждый пиксель определяется тремя RGB- компонентами. Напишите программу расчета значений дискретного косинус-преобразования (уравнение (15.1)) для всех восьмипиксельных последовательных групп списка. 15.14. Используя уравнение (15.2) и преобразованные значения из предыдущего упражнения, на- пишите программу расчета исходных (восстановленных) 32 цветов пикселей. 15.15. Модифицируйте программу из предыдущего упражнения, чтобы она рассчитывала обратное преобразование для любого набора из 8 пикселей, используя только выбранное значение п преобразованных значений; те. п может быть любым значением от 1 до 8 включительно. 15.16. Дан файл изображения, содержащего 32 х 32 цветов пикселей, причем каждый пиксель пред- ставлен тремя RGB-компонентами. Напишите программу вычисления значений дискретного косинус-преобразования (уравнение (15.3)) для всех последовательных групп 8x8 пикселей. 15.17. Используя уравнение (15.4) и преобразованные значения из предыдущего упражнения, на- пишите программу расчета исходных (восстановленных) цветов пикселей блока 32 х 32. 15.18. Измените программу из предыдущего упражнения, чтобы она вычисляла значения обрат- ного преобразования для любого набора 8x8 пикселей, используя заданный выбранный блок п х m преобразованных значений; т.е. пит могут присваиваться произвольные целые значения от 1 до 8 включительно.
ПРИЛОЖЕНИЕ А t В алгоритмах компьютерной графики задействовано множество математи- ческих концепций и методов. В данном приложении кратко рассмот- рены методы аналитической геометрии, линейной алгебры, векторно- го и тензорного анализа, теории комплексного переменного, кватерни- онов, теории исчисления, численного анализа и других областей, упоминающихся в данной книге. А.1. КООРДИНАТНЫЕ СИСТЕМЫ ОТСЧЕТА В приложениях компьютерной графики часто удобно использовать как прямоуголь- ные декартовы системы координат (ПДСК), так и не ПДСК-системы. В графических программах координаты обычно задаются с использованием ПДСК, но исходную спе- цификацию сцены можно давать и в не ПДСК. Для упрощения выражений, фигури- рующих в описании и преобразованиях объектов, могут использоваться сферическая, цилиндрическая и другие симметрии. ДВУХМЕРНЫЕ ДЕКАРТОВЫ ЭКРАННЫЕ КООРДИНАТЫ Для аппаратно-независимых команд графического пакета экранные координаты точ- ки указываются в первом квадранте двухмерной декартовой системы координат стан- дартной ориентации (рис. А. 1, а). Начало координат этой системы отсчета находится в левом нижнем углу экрана. Строки развертки нумеруются, начиная с 0 в верхней части экрана, так что во внутреннем представлении положение точки на экране от- считывается от верхнего левого угла экрана. Следовательно, аппаратно-зависимые команды, например, команды интерактивного ввода, и работа с окнами на дисплее требуют в качестве системы отсчета инвертированной декартовой системы коорди- нат, показанной на рис. А.1, б. Значения по горизонтали в двух системах совпадают,
1068 Приложение А. Математика компьютерной графики Рис. А.1. Декартовы координаты точки на экране отсчитываются от нижнего (панель а) или верхнего (панель б) левого края экрана а инвертированные значения у следующим образом преобразовываются в значения у, отсчитываемые от низа экрана: У = Утах У invert- (А. 1) В некоторых пакетах начало экранной системы координат может помещаться в про- извольное положение, например, центр экрана. СТАНДАРТНЫЕ ДВУХМЕРНЫЕ ДЕКАРТОВЫ СИСТЕМЫ ОТСЧЕТА Для задания глобальных координат, координат точки наблюдения и других объектов в двухмерной наблюдаемой области будем использовать прямоугольные декартовы системы координат. Координаты в этих системах могут быть положительными или отрицательными с любым диапазоном возможных значений. Чтобы спроектировать двухмерное изображение в экранные координаты, будем задавать отсекающее окно и точку наблюдения. ПОЛЯРНЫЕ КООРДИНАТЫ НА ПЛОСКОСТИ ху К часто используемым недекартовым системам координат относится полярная (рис. А.2), в которой координаты точки задаются радиальным расстоянием г от нача- ла координат и углом в, который луч г составляет с горизонталью. Положительным считается направление против часовой стрелки. Связь между декартовыми и поляр- ными координатами показана на рис. А.З. Рассмотрев прямоугольный треугольник на рис. А.4 и используя определение тригонометрических функций, получаем следую- щие выражения для преобразования полярных координат в декартовы: (А.2) х — г cos в, у = г sin в.
А.1. Координатные системы отсчета 1069 Рис. А.2. Система отсчета в полярных координатах, сфор- мированная концентрическими окружностями и прямыми линиями Рис. А.З. Связь между полярными и декартовыми координатами Рис. А.4. Правильный треугольник с гипотенузой г, катетами х и у и углом 6 Обратное преобразование из декартовых в полярные координаты: (А.З) Значения угловых координат можно измерять в градусах или безразмерных единицах (радианах). Один радиан определяется как угол, стягиваемый дугой, длина которой равна радиусу окружности. Данное определение иллюстрируется на рис. А.5, где изображены две линии, пересекающиеся на плоскости, и окружность с центром в точке пересечения Р. Для любой окружности, центрированной в Р, значение угла в в радианах равно отношению в — - (радиан), (А.4)
1070 Приложение А. Математика компьютерной графики Рис. А.5. Угол в, стягиваемый дугой окружности длины s и радиуса г Рис. А.6. Координатное представление точки Р как положения (т, у, z) в стандартной правосторон- ней декартовой системе координат Ось у а) где s — длина дуги окружности, стягивающей в, г — радиус окружности. Полный угол вокруг точки Р равен длине окружности (2лг), деленной на г, или 2тг радиан. В градусах длина окружности делится на 360 дуг равной длины, так что каждая дуга стягивает угол в 1 градус. Следовательно, 360° = 2л радиан. Для задания координат могут использоваться и другие конические сечения, кроме окружностей. Например, используя концентрические эллипсы, можно получить эл- липтические координаты. Подобным образом в параболических или гиперболических системах координат используются другие типы симметрии. СТАНДАРТНЫЕ ТРЕХМЕРНЫЕ ДЕКАРТОВЫ СИСТЕМЫ КООРДИНАТ На рис. А. 6, а показана удобная ориентация координатных осей в трехмерной декар- товой системе координат. Эта система называется правосторонней, поскольку, как показано на рис. А. 6, б, ориентацию осей в этой системе можно определить так: если захватить ладонью правой руки ось z, чтобы захват шел от положительного направления оси х к положительному направлению оси у с углом 90° между ними, большой палец будет идти по положительному направлению оси z. В большинстве программ компьютерной графики описание объектов и другие координатные пара- метры задаются в правосторонних декартовых координатах. В данной книге (в том числе приложении) всегда предполагается, что декартовы системы координат право- сторонние, если специально не оговорено противное.
А.1. Координатные системы отсчета 1071 Рис. А.7. Левосто- ронняя декартова си- стема координат, на- ложенная на поверх- ность монитора Декартовы системы координат являются ортогональными, т.е. оси координат пер- пендикулярны друг другу. Кроме того, в декартовых системах координат оси — это прямые линии. При этом во многих приложениях удобны системы координат с кри- выми осями. Большинство подобных систем также ортогональны, т.е. расстояния по осям до любой точки пространства взаимно перпендикулярны. ТРЕХМЕРНЫЕ ДЕКАРТОВЫ ЭКРАННЫЕ КООРДИНАТЫ Когда проекция трехмерной сцены отображается на мониторе, для каждой точки экрана записывается информация о глубине. Отметим, что трехмерное положение, соответствующее каждой точке экрана, часто отсчитывается в левосторонней системе координат, изображенной на рис. А.7. В этом случае большой палец левой руки указы- вает положительное направление оси z при таком обхвате этой оси, что пальцы левой руки идут от положительной оси х к положительной оси у, проходя угол 90°. Поло- жительные значения z указывают положение перед плоскостью экрана для каждой точки на плоскости ху, и большие значения вдоль положительного направления оси z интерпретируются как координаты точки, расположенной дальше от наблюдателя. ТРЕХМЕРНЫЕ КРИВОЛИНЕЙНЫЕ СИСТЕМЫ КООРДИНАТ Любая недекартовая система координат называется криволинейной. Выбор системы координат для конкретного графического приложения зависит от таких факторов, как симметрия, простота вычислений и преимущества визуализации. На рис. А.8 пока- зана общая криволинейная система координат, сформированная тремя координатны- ми поверхностями, причем для каждой поверхности одна координата фиксирована. Например, поверхность Х1Х2 определяется уравнением хз = const 3. Координат- ные оси любой системы координат — это пересечение координатных поверхностей. Если координатные поверхности везде пересекаются под прямыми углами, имеем ортогональную криволинейную систему координат. Неортогональные криволиней- ные системы координат полезны в таких приложениях, как визуализация движения, подчиняющегося законам общей теории относительности, но в сфере компьютерной графики они используются реже, чем ортогональные.
1072 Приложение А. Математика компьютерной графики Рис. А.8. Общая криволинейная система координат Рис. А.9. Цилиндрические координаты р, в и z Задание пространственного положения в цилиндрических координатах представ- лено на рис. А.9 с обозначенной декартовой системой координат. Поверхность посто- янного р представляет собой вертикальный цилиндр; поверхность постоянного в — вертикальная плоскость, содержащая ось г; наконец, поверхность постоянного z — это горизонтальная плоскость, параллельная декартовой плоскости ху. Для перевода из цилиндрической системы координат в декартову используются соотношения a? = pcos#, y = psin$, z = z. (A.5) Другой широко распространенной криволинейной системой координат является сфе- рическая (рис. А. 10). Сферические координаты иногда называют полярными коор- динатами в трехмерном пространстве. Поверхность постоянного г — сфера; по- верхность постоянного 0 — вертикальная плоскость, содержащая ось г; поверхность постоянного ф — конус с вершиной в начале координат. Если ф < 90°, конус рас- положен над плоскостью ху. Если </>>90°, конус расположен под плоскостью ху. Преобразование из сферических координат в декартовы определяется соотношениями х = г cos в sin ф, у = г sin# sin0, г = гсо&ф. (А.6)
А.1. Координатные системы отсчета 1073 Рис. А.10. Сферические координаты г, в и ф Рис. А.11. Телесный угол ш, стягиваемый участком сфе- рической поверхности площадью А и радиусом г ТЕЛЕСНЫЙ УГОЛ Определение телесного угла формулируется по аналогии с определением двух- мерного угла 0 между двумя пересекающимися прямыми (уравнение (А.4)). Для трехмерного угла, впрочем, требуется рассмотреть конус с вершиной в точке Р и сферу с центром в Р, как показано на рис. А.11. Телесный угол ш, принадлежащий конусоидальной области с вершиной в точке Р, определяется как = (А. 7) где А — площадь сферической поверхности, отсеченной конусом, а г — радиус сферы. Кроме того, по аналогии с двухмерными полярными координатами безразмерная единица телесных углов называется стерадианом. Полный телесный угол вокруг точки Р — это общая площадь сферической поверхности (4тгг2), деленная на г2, или 4тг стерадиан.
1074 Приложение А. Математика компьютерной графики °в Р____________________ Система координат В Рис. А.12. Координаты точки Р в двух раз- дд личных декартовых системах отсчета Рис. А.13. Двухмерный вектор V, определенный в декартовой системе координат как разность ко- ординат двух точек А.2. ТОЧКИ И ВЕКТОРЫ Н---------------------- х Система координат А Существует фундаментальное различие между понятием геометрической точки и век- тором. Точка — это положение, заданное координатами в некоторой системе отсчета, где координаты и другие свойства точки зависят от выбора системы отсчета. Вектор, с другой стороны, имеет свойства, не зависящие от выбора системы координат. СВОЙСТВА ТОЧКИ На рис. А.12 иллюстрируется расчет координат двухмерной точки Р в двух системах отсчета. В системе А точка имеет координаты, которые определяются упорядоченной парой (х, у), и ее расстояние от начала координат равно \/х2 + у2. В системе отсчета В та же точка имеет координаты (0, 0), и расстояние до начала координат системы В равно 0. СВОЙСТВА ВЕКТОРА В выбранной системе координат вектор можно определить как разность координат двух точек. Следовательно, для двухмерных точек Pi и Р2 на рис. А.13 вектор можно задать как V = Р2 - Pl = (х2 -Х1, у2 ~ У1) = (K,Vy), (А.8)
А.2. Точки и векторы 1075 где декартовы компоненты (или декартовы элементы) Vx и Vy — это проекции V на оси х и у. Кроме того, те же компоненты вектора можно получить, используя координаты двух других точек в этой системе отсчета. Фактически число пар точек, дающих одинаковые компоненты вектора, бесконечно, и вектор часто определяется положением одной точки, при этом предполагается, что вторая — это начало отсчета текущей системы координат. Следовательно, вектор не имеет фиксированного по- ложения в системе координат. Кроме того, если преобразовать представление V в другую систему отсчета, координаты положений Pi и Р2 изменятся, но стандартные свойства вектора останутся теми же. Вектор описывается как направленный отрезок, который имеет два фундамен- тальных свойства: длину (модуль) и направление. Для двухмерного вектора на рис. А. 13 модуль вектора можно рассчитать, используя теорему Пифагора: |V| = y/vft + V^. (А.9) Направление вектора задается по-разному. Например, его можно выразить через угол, который вектор составляет с горизонталью: fVv\ а = arctg I 77- ) • (А. 10) \ *х / Вектор имеет ту же длину и направление независимо от его расположения в пре- делах системы координат. Кроме того, модуль вектора не зависит от координатного представления. Впрочем, если преобразовать вектор в другую систему координат, значения его компонентов и направление в системе координат могут измениться. На- пример, вектор можно так преобразовать в декартову систему координат с осями, повернутыми относительно данной системы, чтобы направление вектора совпадало с положительным направлением новой оси у. Для представления трехмерного декартового вектора V = (Vx,Vy,Vz) модуль вектора определяется как M = y/Vx2 + Vy2 + Vz2- (А.П) Кроме того, направление вектора можно задать через направляющие углы, a, ft и у, которые вектор образует с каждой координатной осью (рис. А. 14). Направляющими называют положительные углы, которые вектор образует со всеми положительными направлениями осей. Эти углы вычисляются следующим образом: К „ к vz cosa-—, cos/?=p^, cos7=—. (A.12)
1076 Приложение А. Математика компьютерной графики Рис. А.14. Направляющие углы а, /3 и 7 Рис. А.15. Вектор силы тяжести F и вектор скорости v Значения cos a, cos /3 и cos 7 называются направляющими косинусами вектора. По су- ти, чтобы задать направление, достаточно указать только два направляющих косинуса V, поскольку cos2 а + cos2 /3 + cos2 7 = 1. (А. 13) Векторы используются для представления любых величин, имеющих модуль и на- правление. Два распространенных примера — сила и скорость (рис. А.15). Силу можно рассматривать как величину толчка или тяги вдоль определенного направле- ния. Вектор скорости определяет, насколько быстро объект движется в определенном направлении. СЛОЖЕНИЕ ВЕКТОРОВ И УМНОЖЕНИЕ НА СКАЛЯР По определению сумма двух векторов получается сложением соответствующих их компонентов: Vl + V2 = (V1T + V2x, Vly + V2?/, Vlz + V2z). (A.14) Геометрическое сложение двухмерных векторов иллюстрируется на рис. А. 16. Для получения суммы векторов конец одного вектора совмещается с началом другого, а суммарный вектор рисуется от начала первого вектора до конца второго. Сложение вектора со скаляром не определено, поскольку скаляр имеет только одно числовое значение, тогда как вектор в n-мерном пространстве имеет п численных компонентов.
А.2. Точки и векторы 1077 Рис. А.16. Два вектора (па- нель а) можно сложить гео- метрически, совместив конец одного и начало другого (па- нель б) и проведя вектор- сумму от начала первого век- тора в конец второго I I Рис. А.17. Скалярное произведение двух векторов вычисляется умножением параллельных компонентов Умножение вектора на скалярное значение s определяется как sV = (sVx,sVy,sVz). (А. 15) Например, если значение скалярного параметра s равно 2, каждый компонент V 1 удваивается, и его модуль также увеличивается в два раза. Кроме того, объединять векторы можно, различным образом используя мульти- пликативные процессы. Один из распространенных методов — перемножить модули двух векторов, чтобы это произведение можно было использовать при формировании другой векторной или скалярной величины. СКАЛЯРНОЕ ПРОИЗВЕДЕНИЕ ДВУХ ВЕКТОРОВ Для двух данных векторов можно определить скалярную величину Vi • V2 = |Vi||V2|cos0, 0 < О < 7Г (А.16) где 0 — меньший из двух углов между направлениями векторов (рис. А. 17). Данная схема умножения называется скалярным произведением двух векторов или внутрен- ним произведением (особенно в области тензорного анализа). Уравнение (А.16) спра- ведливо в любом координатном представлении, и его можно интерпретировать как произведение параллельных компонентов двух векторов, где |V 21 cos 0 — проекция вектора V2 на направление вектора Vi. Кроме координатно-независимой формы скалярного произведения, существует представление и через координаты. Для декартовой системы отсчета скалярное про- изведение вычисляется как V!. v2 = У1жУ2х + vlyv2y + v12v22. (А.17)
1078 Приложение А. Математика компьютерной графики Рис. А.18. Векторное произведение двух векторов — это вектор, перпендикулярный двум исходным, длина которого равна площади заштрихованного параллелограмма Скалярное произведение является обобщением теорема Пифагора, и скалярное про- изведение вектора на самого себя дает квадрат модуля вектора. Кроме того, скалярное произведение двух векторов равно нулю тогда и только тогда, когда два вектора пер- пендикулярны (ортогональны). Скалярные произведения коммутативны: Vi»V2 = V2’V], (А.18) поскольку результатом операции является скаляр. Кроме того, скалярные произведе- ния дистрибутивны относительно прибавления вектора: V1 • (V2 + V3) = Vi . V2 + V! . V3. (A.19) ВЕКТОРНОЕ ПРОИЗВЕДЕНИЕ ДВУХ ВЕКТОРОВ На основе двух данных векторов можно рассчитать следующий вектор: Vi х V2 = u| Vi | | V21 sin 0, 0 < 0 < тг. (A.20) Параметр u в данном выражении — единичный вектор (длина 1), одновременно пер- пендикулярный Vi и V2 (рис. А.18). Направление и определяется правилом пра- вой руки\ ось, перпендикулярная плоскости, содержащей Vi и V2, обхватывается так, чтобы пальцы правой руки заворачивались от Vi к V2. Далее направление и указывается большим пальцем. Определенная таким образом величина называется векторным произведением двух векторов, и уравнение (А.20) справедливо в любом координатном представлении. Векторное произведение двух векторов — это вектор, перпендикулярный плоскости, содержащей оба вектора, а модуль векторного произ- ведения равен площади параллелограмма, сформированного двумя векторами. Векторное произведение можно также выразить через компоненты векторов в конкретной системе отсчета. В декартовой системе координат компоненты векторного произведения равны V1 х V2 = (VlyV2z - V12V2y, V12V2i - VlxV2z, VlxV2y - VlyV2x). (All) Если обозначить единичные векторы (длины 1) вдоль осей х, у и z через и^, иу и и2, векторное произведение можно записать через декартовы компоненты, используя
А.З. Тензоры 1079 Рис. А.19. Трехмерные векторы криволинейных осей координат понятие детерминанта (см. раздел А. 5). uT Uy Uz V1 х V2 = vlx Viy vlz (A.22) v2x V2y v2z Векторное произведение любых двух параллельных векторов равно нулю. Следо- вательно, векторное произведение вектора на самого себя равно нулю. Кроме того, векторное произведение некоммутативно, фактически оно антикоммутативно: Vi х V2 = ~(V2 х Vi). (A.23) Векторное произведение также неассоциативно; т.е. V! х (V2 х V3) ф (Vi х V2) х V3. (A.24) В то же время векторное произведение дистрибутивно относительно прибавления или вычитания вектора: Vi х (V2 + V3) = (Vi х V2) + (Vi x V3). (A.25) A.3. ТЕНЗОРЫ Обобщением концепции вектора является класс объектов, именуемых тензорами. Формально тензор определяется как величина с заданным рангом и определенными свойствами при преобразовании тензора из одного координатного представления в другое. Для ортогональных систем координат свойства преобразования очевидны и совпадают со свойствами векторов. Отметим, что тензорами описываются различные физические свойства объектов, такие как напряжение, деформация и электропровод- ность. Ранг тензора, а также размерность пространства, в котором он определен, опре- деляется числом компонентов (также именуемых элементами или коэффициентами) в этом тензоре. Частными случаями тензоров являются скалярные величины и векто- ры. Скаляр — это тензор нулевого ранга, вектор — единичного. По сути, ранг тензора задает число индексов, используемых, чтобы различать элементы тензора, а размер-
1080 Приложение А. Математика компьютерной графики ность пространства определяет число значений, которые может принимать каждое значение. Таким образом, скалярная величина (тензор нулевого ранга) имеет нуль индексов, а вектор (тензор первого ранга) — один. Иногда любой параметр с одним индексом неправильно называют одномерным, а любой параметр с двумя индек- сами — двухмерным. Однако размерность величины зависит от пространственного представления, а не от числа индексов. В двухмерном пространстве единственный индекс вектора может принимать два значения, а двухмерный вектор имеет два ком- понента. В трехмерном пространстве единственный индекс вектора может принимать три значения, а трехмерный вектор имеет три компонента. Аналогично тензор ран- га 2 имеет два индекса, и в трехмерном пространстве данный тензор имеет девять компонентов (по три значения на каждый индекс). БАЗИСНЫЕ ВЕКТОРЫ И МЕТРИЧЕСКИЙ ТЕНЗОР В n-мерной системе отсчета можно задать направления координат, используя набор осевых векторов, обозначенных и^, где k = 1, 2,..., п, как на рис. А. 19, где векторы, идущие по осям, выходят из начала координат трехмерного криволинейного про- странства. Каждый вектор, направленный по координатной оси, задает направление одной пространственной оси в любой точке вдоль нее. Касательные к этим осям фор- мируют линейно независимый набор векторов. Следовательно, осевой вектор нельзя выразить как линейную комбинацию других векторов. Кроме того, любой другой вектор в этом пространстве можно записать как линейную комбинацию осевых век- торов, а набор осевых векторов называется базисом или набором базисных векторов этого пространства. Вообще, пространство называется векторным, а базис состоит из минимального числа векторов, необходимых для представления любого другого вектора этого пространства в виде линейной комбинации базисных векторов. ОПРЕДЕЛЕНИЕ БАЗИСНЫХ ВЕКТОРОВ В КООРДИНАТНОМ ПРОСТРАНСТВЕ Базисные векторы любого пространства определяются по радиус-векторам г — век- торным представлениям любой точки в пространстве. Например, в трехмерном де- картовом пространстве радиус-вектор любой точки (х, у, z) равен г = ж + уиу + zuz, (А.26) где uT, uy и иг - единичные базисные векторы осей х, у и г. В отличие от других координатных представлений, декартовы базисные векторы постоянные и не зависят
А.4. Базисные векторы и метрический тензор 1081 от пространственных координат, так что получаем дг дг дг uT = —, uy = —, u2 = —. (А.27) дх у ду dz Аналогично для любого трехмерного пространства формулируется выражение для радиус-вектора r(x], Х2, Х3) через координаты в этом пространстве, и далее базисные векторы определяются как k = 1,2,3. (А.28) ОХк В общем случае базисные векторы йк не являются ни постоянными, ни единичны- ми — они представляются функциями пространственных координат. В качестве примера приведем радиус-вектор в двухмерных полярных координатах f = г cos 0 uT+ r sin 0 uy, (А.29) а базисные векторы в полярных координатах записываются как дг ur = — = cos 0 uT + sin 0 u,., ch- x y' zL (A.30) от u0 = zzz — ~ r sin 0 uT + r cos 0 u„. 89 y В этом пространстве вектор ur, который является функцией 0, — единичный, но зависящий от г и 0. Вектор йе к таковым не относится. ОРТОНОРМИРОВАННЫЙ БАЗИС Часто векторы в базисе нормируются так, что модуль каждого вектора равен 1. Чтобы получить единичные базисные векторы в любом трехмерном пространстве, исполь- зуйте формулу Ul. Ufc = —к = 1,2,3. (А.31) Этот набор единичных векторов называется нормированным базисом. Кроме того, в декартовых, цилиндрических, сферических и других распространенных системах отсчета, включая полярную, оси координат взаимно перпендикулярны во всех точках пространства, и в таких случаях набор базисных векторов называется ортогональным базисом. Набор единичных ортогональных базисных векторов называется ортонор-
1082 Приложение А. Математика компьютерной графики мированным базисом, и эти базисные векторы удовлетворяют следующим условиям. U& • Ufc = 1, для всех к, л • , . (А-32) Uj • Ufc = U, для всех j к. Хотя в основном мы имеем дело с ортогональными системами, в некоторых приложе- ниях используются неортогональные, например, в теории относительности и схемах визуализации для определенных наборов данных. Двухмерная декартова система имеет следующий ортонормированный базис: ux = (l,0), up = (0,1). (А.ЗЗ) Ортонормированный базис трехмерной декартовой системы координат записывает- ся так: ит = (1,0,0), = (0,1,0), u2 = (0,0,1). (А.34) МЕТРИЧЕСКИЙ ТЕНЗОР Для “обычных” координатных пространств (т.е. тех, в которых можно определить рас- стояние, и которые формально называются римановыми пространствами) скалярные произведения базисных векторов формируют элементы метрического тензора этого пространства: gjk = Uj • ufc. (А.35) Следовательно, метрический тензор симметричен и имеет ранг 2: др- = дк}- Мет- рические тензоры обладают несколькими полезными свойствами. Элементы метри- ческого тензора можно использовать, чтобы определить 1) расстояние между двумя точками этого пространства, 2) уравнение перехода в другое пространство и 3) ком- поненты различных дифференциальных векторных операторов (таких как градиент, дивергенция и ротор) этого пространства. В ортогональном пространстве t/jfc = 0, дляу к. (А.36) Например в декартовой системе координат, где базисные векторы — постоянные еди- ничные векторы, метрический тензор состоит из следующих компонентов: (1, если j — к д,к = < (декартово пространство). (А.37) [ 0 в противном случае
A.5. Матрицы 1083 Для базисных векторов в полярных координатах (уравнения (А. 30)) метрический тензор можно записать в матричной форме g = 1 0 ' 0 г2 (полярные координаты). (А.38) Для цилиндрической системы отсчета базисные векторы равны йр = cos в uT + sin 0 uy, u^ = —psin0uT + pcos0uy, u2 = u2. (A.39) Матричное представление метрического тензора в цилиндрических координатах: II ьс ’10 0 0 р 0 0 0 1 (цилиндрические координаты). (А.40) В сферических координатах базисные векторы имеют вид ur = cos в sin фмх + sin 0 sin ф иу + cos ф и2, йе = — г sin 0 sin </> их + г cos 0 sin ф иу, (А.41) йф = г cos 0 cos ф u r + г sin 0 cos фиу — г sin ф и2. Подставляя эти базисные векторы в уравнение (А.35), получаем следующее матрич- ное представление метрического тензора: А.5. ’1 g = о 0 0 0 ' г2 sin2 ф 0 0 г2 (сферические координаты). (А.42) МАТРИЦЫ Матрица — это прямоугольный массив величин (численных значений, выражений или функций), называемых элементами матрицы. Несколько примеров матриц при- ведено ниже 3,60 -0,01 2,00 -5,46 0,00 1,63 ех х е2х х2 [ai й2 аз], (А.43) Матрицы классифицируются согласно числу строк и столбцов. В предыдущих при- мерах матрицы (слева направо) называются матрицами 2 на 3, 2 на 2, 1 на 3 и 3 на 1. Если число строк равно числу столбцов, как во втором примере, матрица называется квадратной.
1084 Приложение А. Математика компьютерной графики В общем случае матрицу г на с можно записать как ’шц 7«12 • ’ ТПщ’ м = 77*21 77*22 ’ • rn2c , (A.44) _mri mr2 TYlrc _ где тр. представляет элементы матрицы М. Первый индекс любого элемента — номер строки, второй — номер столбца. Матрица, состоящая из единственной строки или единственного столбца, пред- ставляет вектор. Следовательно, две последние матрицы, приведенные в форму- ле (А.43), — это соответственно вектор-строка и вектор-столбец. Вообще, матрицу можно рассматривать как совокупность векторов-строк или векторов-столбцов. При записи различных математических операций в матричной форме использует- ся стандартная договоренность — вектор представляется матрицей-столбцом. Соглас- но этой договоренности матричное представление трехмерного вектора в декартовых координатах имеет вид (А.45) Несмотря на то что данное стандартное матричное представление используется и для точек, и для векторов, между ними есть существенное различие. Векторное представ- ление точки всегда подразумевает, что вектор соединяет начало координат с указанной точкой. В то же время при переходе от одной системы отсчета к другой расстояние от точки до начала координат меняется. Кроме того, точки нельзя складывать и при- менять к ним векторные операции, такие как скалярное и векторное произведения. УМНОЖЕНИЕ НА СКАЛЯР И СЛОЖЕНИЕ МАТРИЦ Чтобы умножить матрицу М на скалярное значение s, умножим каждый элемент rrijk на скаляр. Проиллюстрируем сказанное на примере: если 1 2 4 5 6 то ЗМ = 3 12 6 9 15 18
А.5. Матрицы 1085 Сложение матриц определяется только для матриц, имеющих равное число строк г и столбцов с. Для любых двух матриц г на с сумма получается сложением соответ- ствующих элементов. Например, так 12 3] Г 0,0 1,5 0,2 ] _ Г 1,0 3,5 3,2 4 5 б] + [-6,0 1,1 -10,о] - [-2,0 6,1 -4,0 УМНОЖЕНИЕ МАТРИЦ Произведение двух матриц определяется обобщением скалярного произведения век- торов. Матрицу А размером т на п можно умножить на матрицу В размером р на q и получить произведение матриц А В при условии, что число столбцов А равно числу строк В. Другими словами, п должно быть равно р. Далее произведение мат- риц получаем вычислением сумм произведений элементов векторов-строк матрицы А с соответствующими элементами векторов-столбцов матрицы В. Таким образом, чтобы найти произведение С = АВ, (А.46) необходимо вычислить матрицу С размером т на q, элементы которой определяются следующим образом: п Cij ] Q'ik^kj • (А.47) fc=l В следующем примере матрица 3 на 2 в обычном порядке умножается на матрицу 2 на 2, в результате чего получается матрица 3 на 2. ’ 0 -Г 5 7 —2 8 '0 - 1 + (-1) -3 5-1 + 7-3 -2 - 1 + 8-3 0-2 + (-1) -4 5-2 + 7-4 -2-2 + 8-4 '-3 -4‘ 26 38 22 28 1 2 3 4 Умножение векторов в матричной форме записи дает тот же результат, что и скалярное произведение, при условии, что первый вектор выражен как вектор-строка, а второй — как вектор-столбец. Например, так. [1 2 3] 4 5 = [32] 6
1086 Приложение А. Математика компьютерной графики Данное произведение векторов дает матрицу с единственным элементом (матрицу 1 на 1). Впрочем, если умножить векторы в обратном порядке, получим следующую матрицу 3 на 3: 4 5 6 [12 3] = 8 12' 10 15 12 18 Как видно из приведенных произведений, умножение матриц в общем случае неком- мутативно. Следовательно, АВ ВА. (А.48) В то же время матричное умножение дистрибутивно относительно прибавления матрицы: А(В + С) = АВ + АС. (А.49) ТРАНСПОНИРОВАНИЕ МАТРИЦЫ Транспонированная матрица Мт получается из матрицы Мт перестановкой строк и столбцов. Например, 1 2 3 4 5 6 1 4 2 5 3 6 (А.50) Транспонированное произведение матриц выражается следующим образом: (М1М2)Т = М2 Mf. (А.51) ДЕТЕРМИНАНТ МАТРИЦЫ Если дана квадратная матрица, на основе ее элементов можно вычислить число, называемое детерминантом матрицы. Расчет детерминантов полезен при анализе и решении широкого диапазона задач. Детерминант матрицы второго порядка А определяется как det А = ап а21 Й12 а22 = 0-110-22 ~ 0-12021. (А.52)
А.5. Матрицы 1087 Детерминанты больших матриц получаются рекурсивно из детерминантов малых порядков. Чтобы рассчитать детерминант порядка 2 или больше, можно выбрать любой столбец к матрицы п на п и вычислить детерминант как det А = l)j+fca?-fc det Ajfc, (А.53) j-i где det Aj*; — детерминант (n — 1) на (п — 1) подматрицы, полученной из А удале- нием j-й строки и к-го столбца. Альтернативно можно выбрать любую строку j и вычислить детерминант как det А = ^(-l)j+kajkdetAjk. (А.54) fc=i Для эффективного вычисления детерминантов больших матриц (скажем, п > 4) мож- но использовать численные методы. Один способ расчета детерминанта — разложить матрицу на два множителя: А = L U, где все элементы матрицы L над диагональю равны нулю (нижняя треугольная матрица), и все элементы матрицы U под диаго- налью равны нулю (верхняя треугольная матрица). Далее, вычисляя произведение диагональных элементов матриц L и U, получаем detA. Данный метод основан на следующем свойстве детерминантов: det(A В) = (det A)(detB). (А.55) Другой метод расчета детерминантов базируется на процедурах гауссова исключения, рассмотренных в разделе А. 14. ОБРАТНАЯ МАТРИЦА Для данной квадратной матрицы можно получить обратную матрицу тогда и только тогда, когда детерминант матрицы не равен нулю. Если обратная матрица суще- ствует, матрица называется несингулярной. В противном случае матрица называется сингулярной. Для большинства практических приложений, где матрица представляет некоторое физическое действие, логично ожидать, что обратная матрица существует. Матрица, обратная к квадратной матрице М размером п на п, обозначается как М"1 и MM"1=M“1M = I, (А.56) где I — единичная матрица. Все диагональные элементы I равны, все остальные (недиагональные) — нуль.
1088 Приложение А. Математика компьютерной графики Мнимая ось Рис. АЛО. Действительный и мнимый компоненты точки z на комплексной плоскости х Действительная ось Элементы обратной матрицы М 1 можно вычислить через элементы М: г (-l?+fc detMfcj detM (А.57) где т~^ — элемент в j-й строке и k-м столбце матрицы М-1 и М^- — подматрица (п — 1) х (п — 1), полученная удалением к-й строки и j-ro столбца матрицы М. Для больших значений п можно эффективно вычислить значения детерминантов и элементов обратной матрицы, используя численные методы. А.6. КОМПЛЕКСНЫЕ ЧИСЛА По определению комплексным числом z называется упорядоченная пара действитель- ных чисел, представленная следующим образом: г=(х,у), (А.58) где х называется действительной z, а у—мнимой частью z. Действительная и мнимая части комплексного числа обозначаются как ж = Ке(г), у = Im(z). (А.59) Геометрически комплексное число можно описать как точку на комплексной плоско- сти (рис. А.20). При Re(z) = 0 комплексное число z называется чисто мнимым. Подобным об- разом действительное число можно представить как комплексное число с Im(z) = 0. Следовательно, любое действительное число можно записать в виде х = (х, 0). Комплексные числа возникают при решении уравнений, подобных х1 + 1 = 0, х2 — 2х + 5 = 0,
А.6. Комплексные числа 1089 которое не имеет действительных решений. Следовательно, понятие комплексного числа и правила комплексной арифметики развиваются как расширение операций с действительными числами и дают решения задач, подобных приведенной выше. ОСНОВЫ КОМПЛЕКСНОЙ АРИФМЕТИКИ Сложение, вычитание и скалярное умножение комплексных чисел выполняются с использованием тех же правил, что и для двухмерных векторов. Например, сумма двух комплексных чисел равна 21 + z2 = (^1,2/1) + (х2,У2) = (х! + х2, yi + 2/2), и любое комплексное число можно записать в виде суммы z = (х,у) = (х,0) + (0, у). Произведение двух комплексных чисел Z] и z2 определяется следующим образом: (^1, 2/1)(^2,2/2) = (^1^2 - У1У2,^1У2 +^2У1)- (А.60) Данное определение комплексного умножения сводится к определению действитель- ного умножения, если мнимые части равны нулю: (а?1,0)(х2,0) = (xix2,0). МНИМАЯ ЕДИНИЦА Чисто мнимое число с у = 1 называется мнимой единицей и обозначается как г=(0,1). (А.61) (Инженеры-электрики часто используют для обозначения мнимой единицы символ j, поскольку символом г представляется сила тока.1) Из правила комплексного умножения получаем г2 = (0,1)(0,1) = ( —1,0). Следовательно, г2 — действительное число —1, и i = \Л1. (А. 62) Чисто мнимое число можно представить, используя одну из следующих форм: z = iy = (0, у). 'Сказанное справедливо для англоязычной литературы. У нас мнимая единица обозначается только как г. — Прим. перев.
1090 Приложение А. Математика компьютерной графики А общее комплексное число выражается в виде z = х + iy. (А.63) Используя определение i, можно доказать, что данное представление удовлетворяет правилам комплексного сложения, вычитания и умножения. КОМПЛЕКСНО-СОПРЯЖЕННОЕ ЧИСЛО И МОДУЛЬ КОМПЛЕКСНОГО ЧИСЛА Другая концепция, связанная с комплексным числом, — комплексно-сопряженное чис- ло, которое определяется как z — х — iy. (А.64) Следовательно, комплексно-сопряженное г — это отражение z относительно оси х (действительной). Модуль, или абсолютное значение, комплексного числа определяется как |z| = = \/х1 у2. (А.65) Данное число указывает расстояние на комплексной плоскости точки z от начала координат, что иногда называется длиной вектора комплексного числа. Следователь- но, модуль комплексного числа — это просто представление теоремы Пифагора на комплексной плоскости. КОМПЛЕКСНОЕ ДЕЛЕНИЕ Чтобы найти отношение двух комплексных чисел, выражение для дроби можно упро- стить, умножив числитель и знаменатель на комплексно-сопряженное знаменателя. Далее используются правила умножения и определяются компоненты получающего- ся комплексного числа. Следовательно, действительная и мнимая части отношения двух комплексных чисел равны 21 2122 22 22 Z2 ~У2) ^2 + У2 (А. 66) / а?1Х2 + У1У2 \ ^2 + У2 %2У1 -ХхУ2\ х2 + У2 /
A. 7. Кватернионы 1091 ПРЕДСТАВЛЕНИЕ КОМПЛЕКСНОГО ЧИСЛА В ПОЛЯРНЫХ КООРДИНАТАХ Операции умножения и деления значительно упрощаются, если выразить действи- тельную и мнимую части в полярных координатах (рис. А.21): z = r(cos в + i sin 0). (А.67) Кроме того, z в полярной форме можно записать так: z = reie, (А.68) где е — основание натурального логарифма (е « 2, 718281828) и егв = cos в + i sin в, (А.69) что называется формулой Эйлера. Используя представление в полярных координатах, произведение двух комплекс- ных чисел вычисляют умножением их модулей и сложением их полярных углов. Следовательно, 212:2 = Г1Г2ег^1+02\ (А.70) Чтобы разделить одно комплексное число на другое, их модули делятся один на другой, и от полярного угла уменьшаемого отнимается полярный угол вычитаемого: — = (А.71) Z2 Г2 Полярное представление можно также использовать для получения корней из ком- плексных чисел. Корни п-й степени комплексного числа вычисляются следующим образом: y~z= tyr ( О + 2 /С7Г \ (в + 2 Ат7Г cos ------------ + i sin --------------- \ п / \ п /с = 0,1,2, ...,7г-1. (А.72) Эти корни лежат на окружности радиуса yfr с центром в начале координат комплекс- ной плоскости, и они формируют вершины правильного тг-угольника. КВАТЕРНИОНЫ Концепция комплексных чисел расширяется на большие размерности с использова- нием кватернионов — величин с одним действительным и тремя мнимыми компо- нентами: q = s + ia + jb + fcc, (A.73)
1092 Приложение А. Математика компьютерной графики Рис. А.21. Полярные координаты на комплексной плоскости где коэффициенты a, b и с — действительные числа, а параметр s — действительное число, называемое скалярной частью. Параметры i, j, k определяются следующими свойствами: г2 = j2 = fc2 = — 1, ij = —ji = к. (A.74) Из этих свойств следует, что jk = —kj = i, ki = — гк = j. (A.75) Умножение на скаляр определяется по аналогии с соответствующей операцией для векторов и комплексных чисел. Следовательно, все четыре компонента кватерниона умножаются на скалярное значение. Таким образом, сложение кватернионов опреде- ляется как сложение соответствующих элементов: <71 + <72 = (si + s2) + г(°1 + а2) + Л&1 + Ь2) + fc(ci + с2). (А.76) Умножение двух кватернионов выполняется с использованием формул (А.74) и (А.75). Можно также использовать для записи кватернионов следующую форму упоря- доченной записи, подобную упорядоченному представлению комплексного числа: q=(s,v). (А.77) Параметр v в этом представлении — вектор (а, Ь, с). Используя упорядоченную форму записи, сложение кватернионов можно выразить следующим образом: <71 + <72 = («1 + S2, vi + v2). (А.78) Умножение кватернионов относительно компактно записывается через скалярное и векторное произведение векторов: <71 <72 = (slfi2 - V1 • v2; S1V2 + S2V1 + Vi X V2). (A.79)
А.8. Непараметрические представления 1093 Квадрат модуля амплитуды определяется по аналогии с таким же параметром ком- плексного числа — как сумма квадратов следующих компонентов кватерниона: |д|2 = S2 + V • V. (А.80) Для вычисления обратного кватерниона используется формула 9-1 = kp(s’~v)’ (А'81) так что QQ-1 = q-Lq = (1,0). А.8. НЕПАРАМЕТРИЧЕСКИЕ ПРЕДСТАВЛЕНИЯ Если характеристики объекта записываются непосредственно через координаты ис- пользуемой системы, представление называется непараметрическим. Например, по- верхность можно описать одной из следующих функций в декартовой системе коор- динат: /1(х,у,г)=0, или z = f2(x, у). (А.82) Первая форма в уравнении (А.82) называется неявным выражением для поверхности, вторая — явным представлением. В явном представлении х и у называются незави- симыми, az— зависимой переменными. Подобным образом, трехмерную кривую можно представить в непараметриче- ской форме как пересечение двух поверхностных функций, а кривую можно предста- вить парой функций у = f(x) и z = g(x), (А.83) где координата х является независимой переменной. Значения зависимых перемен- ных у и z определяются из уравнений (А.83) при подстановке значений х, входящих в предопределенный интервал. Непараметрические представления полезны при описании объектов в данной си- стеме отсчета, но они имеют некоторые недостатки при использовании в графиче- ских алгоритмах. Если требуется гладкий график, независимую переменную нужно менять в тот момент, когда первая производная f(x') либо д(х) становится боль- ше 1. Это требует постоянной проверки значений производных, чтобы определить, когда нужно поменять ролями независимую и зависимую переменные. Кроме того, уравнения (А.83) гарантируют неудобный (громоздкий) формат представления много-
1094 Приложение А. Математика компьютерной графики значных функций. Например, неявное выражение для окружности с центром в начале координат плоскости ху имеет вид 2 I 2 2 г\ х +у —г =0, а явное выражение для у — это неоднозначная функция у = ±\/ г'1 — х2. Вообще, в графических алгоритмах описания объектов удобнее всего давать в форме параметрических уравнений. А.9. ПАРАМЕТРИЧЕСКИЕ ПРЕДСТАВЛЕНИЯ Объекты можно классифицировать согласно числу параметров, необходимых для опи- сания координат объектов. Кривая, например, в декартовой системе отсчета класси- фицируется как одномерный, а поверхность — как двухмерный евклидов объект. Опи- сание объекта через его размерность называется параметрическим представлением. Декартово описание точек вдоль кривой можно представить в параметрической форме, используя следующую векторную функцию точки P(u) = (x(u), y(u), z(u)), (А.84) где каждая декартова координата — это функция параметра и. В большинстве слу- чаев можно нормировать три координатные функции, чтобы параметр и менялся от 0 до 1,0. Например, окружность на плоскости ху с радиусом г и центром в нача- ле координат можно определить в параметрической форме, используя следующие параметрические функции. х(и) = г cos(2ttu), у(и) = г sin(27ru), z(u) = 0, 0 < и < 1. (А.85) Поскольку кривая определяется на плоскости ху, можно исключить функцию z(u), которая имеет постоянное значение 0. Подобным образом точки на поверхности можно представить, используя следу- ющую декартову векторную функцию точки: Р(и, и) = (х(и, и), у(и, v), z(u, v)). (А.86) Все декартовы координаты теперь являются функциями двух поверхностных пара- метров и и V. Сферическая поверхность с радиусом г и центром в начале координат,
A. 10. Операторы скорости изменения 1095 Рис. А.22. Сегмент сферической поверхности, описанный линиями постоянного и и линиями постоянного v в уравнениях (А.87) например, описывается уравнениями x(u,v) = г cos(2ttu) sin(?rv), y(u,u) = г sin(27ru) sin(?rn), z(u, V) = Г COs(tTh), 0 < u,v < 1- (A. 87) Параметр и описывает линии постоянной долготы на поверхности, а параметр v — постоянной широты. Параметрические уравнения снова нормируются так, чтобы и и v принимали значения из диапазона 0-1,0. Фиксируя один из параметров и изменяя другой в пределах единичного интервала, можно получить линии широты и долготы для любого сферического сегмента (рис. А.22). А.10. ОПЕРАТОРЫ СКОРОСТИ ИЗМЕНЕНИЯ Для непрерывной функции одной независимой переменной, например f(x), скорость изменения функции при любом значении х можно определить, используя производ- ную /(х) по х. Данная функция определяется следующим образом: Д/ /(ж + Дж) -/(ж) — - пт —---------------— dx Az—>о Дж (А.88) Приведенное определение является основой численных схем решения задач, в кото- рых фигурирует скорость изменения некоторых величин. Производные таких распро- страненных функций, как полиномиальные и тригонометрические, представлены в таблицах. Для задач со скоростью изменения, в которых фигурируют простые функ- ции, обычно можно получить аналитическое решение. В то же время во многих случаях для решения задач с производными требуются численные методы. Если дана функция нескольких переменных, операции скорости изменения от- дельных переменных именуются частными производными. Например, для функции, подобной f(x,y,z,t), можно определить скорость изменения функции по любому из
1096 Приложение А. Математика компьютерной графики координатных направлений х, у, z или параметру времени t. Частная производная конкретной независимой переменной определяется уравнением (А.88), где все осталь- ные независимые переменные полагаются постоянными. Таким образом, например, частная производная f по времени определяется как df_ = f(x, y,z,t + At) - f(x, у, z, t) dt ~ д™о At и вычисляется в некоторой пространственной точке в определенный момент времени. Несколько операторов частных производных встречаются настолько часто, что они получили собственные имена, такие как градиент, оператор Лапласа, дивергенция и ротор. Эти операторы полезны в различных приложениях — определении геометрии и ориентации объектов, описании поведения объектов в определенных ситуациях, расчете эффектов электромагнитного излучения и анализе наборов данных в задачах научной визуализации. ГРАДИЕНТ Векторный оператор со следующими декартовыми компонентами называется опера- тором градиента. _ / д д д \ grad = V = I —, —, — I (А.89) \<Эх ду dzJ Символ V называется набла или просто оператором градиента. Оператор градиента удобно использовать, например, при вычислении вектора нормали к поверхности. Ко- гда поверхность описывается непараметрическим представлением f(x.y,z) — const, нормаль к поверхности в любой точке вычисляется как N = V/ (вектор нормали для непараметрически представленной поверхности). (АЛО) Например, сферическую поверхность радиуса г можно представить в локаль- ных координатах с помощью непараметрического декартового представления f(x, у, z) =х2 + у2 + z2 = г2, а градиент f равен вектору нормали к поверхности (2х, 2у, 2z). В то же время, если поверхность представлена параметрической функ- цией P(u, и), нормаль к поверхности можно определить, используя векторное про- изведение <9Р дР N = -7— X -7— (вектор нормали для параметрического представления поверхности). (А.91) ди ди
A. 10. Операторы скорости изменения 1097 ПРОИЗВОДНАЯ ПО НАПРАВЛЕНИЮ Градиент и скалярное произведение векторов также можно использовать для получе- ния скалярного произведения, называемого производной по направлению функции /: = и • V/. (А.92) ди Действуя этим оператором на функцию /, получаем скорость ее изменения в на- правлении, заданном единичным вектором и. Чтобы проиллюстрировать сказанное, определим производную по направлению для сферической поверхностной функции f = х2 + у2 + z2 в направлении z: где и2 — единичный вектор, идущий по положительному направлению оси z. Для следующего вектора в плоскости ху 1 1 u = + v^Uy производная по направлению функции / вычисляется согласно уравнению (А.92): ди у/2 дх у/2 ду ОБЩАЯ ФОРМА ОПЕРАТОРА ГРАДИЕНТА В любой трехмерной ортогональной системе координат компоненты оператора гра- диента рассчитываются следующим образом: 3 л V = <А”) “ y/gkk dxk В данном выражении каждое щ представляет единичный базисный вектор в на- правлении х^-й координатной оси, а дьь — диагональные компоненты метрического тензора данного пространства. ОПЕРАТОР ЛАПЛАСА Оператор градиента и скалярное произведение векторов можно использовать для получения скалярного дифференциального оператора, именуемого лапласианом или
1098 Приложение А. Математика компьютерной графики оператором Лапласа, который в декартовых координатах записывается следующим образом: 2 г-, д2 д2 д2 V2 = V • V =---------1-------1----. дх2 ду2 dz2 (А.94) Символ V2 часто называется квадратом градиента (набла в квадрате). В любой трехмерной ортогональной системе координат лапласиан функции f(x,y, z) вычис- ляется как V2/ = 1 [— f ^922933 + д (х^зздп df ) V911922933 |_^1 \ у/gn дхх) дх2 \ у/g^ дх2) ! д / y/gug22 df дх3 у/д^ дх3 (А.95) Уравнения, в которых фигурирует лапласиан, возникают во многих приложениях, включая описание эффектов электромагнитного излучения. ОПЕРАТОР ДИВЕРГЕНЦИИ Скалярное произведение векторов можно также использовать для выполнения с опе- ратором градиента и векторной функцией операции, в результате которой получается скалярная величина, называемая дивергенцией вектора, которая в декартовых коор- динатах записывается так: л. dVx dVv dVz divV = V • V = —^ + ~ Ox Oy oz (A.96) В данном выражении Vx, Vy и Vz — декартовы компоненты вектора V. Диверген- ция — это мера скорости увеличения или уменьшения векторной функции, такой как напряженность электрического поля в точке пространства. В любой трехмерной ортогональной системе координат дивергенция вектора V равна 1 divV = V • V = Q _________ Q .------- —(у/д22дззУ1) + д—(т/533511 ^2) + л/511522533 L^l дх2 0^(\/511522^з) , (А.97) где параметры , V2 и V3 — компоненты вектора V по координатным направлениям Xi, х2 и хз, а дм — диагональные элементы метрического тензора.
А.11. Теоремы об интегральном преобразовании... 1099 ОПЕРАТОР РОТОРА Другой весьма полезный дифференциальный оператор — ротор вектора, который вводится с использованием оператора градиента и векторного произведения. Декар- товы компоненты ротора вектора равны dVz dVy dVx dVz dVv dVx\ л* у Jb j «Л/ 4 dy dz ’ dz dx ' dx dy ) (A.98) Указанные операции дают меру вращения, связанного с векторной величиной, такой как рассеяние электромагнитного излучения. В любой трехмерной ортогональной си- стеме координат компоненты ротора можно выразить через компоненты метрического тензора, используя следующее представление через детерминанты. rot V = V х V = , л/511522533 \/51Г Ui d dx\ \/51Г^1 а/522 u2 d dx2 y/922 ^2 (A.99) Здесь — единичные базисные векторы пространства, gkk — диагональные элементы метрического тензора. А.11. ТЕОРЕМЫ ОБ ИНТЕГРАЛЬНОМ ПРЕОБРАЗОВАНИИ ОПЕРАТОРОВ СКОРОСТИ ИЗМЕНЕНИЯ Во многих приложениях встречаются задачи, включающие скорость изменения, кото- рые необходимо проинтегрировать (просуммировать) по некоторой области простран- ства — вдоль какой-то траектории, по поверхности или объему пространства. Часто задачу можно упростить, применив теорему, позволяющую преобразовать интеграл по поверхности в линейный интеграл, линейный интеграл в интеграл по поверхно- сти, интеграл по объему в интеграл по поверхности или интеграл по поверхности в интеграл по объему. Данные теоремы о преобразованиях имеют огромное значение при решении широкого диапазона практических задач.
1100 Приложение А. Математика компьютерной графики Рис. А.23. Интегрирование по граничной кривой С выполня- ется против часовой стрелки, если смотреть на поверхность извне (теорема Стокса) Рис. А.24. Для вычисления линейных интегралов в теореме Грина граничные кривые Cj и Сз обходятся так, чтобы внутренняя область (заштрихована) все- гда находилась слева ТЕОРЕМА СТОКСА Для непрерывной векторной функции F(x,y,z), определенной в некоторой поверх- ностной области, теорема Стокса утверждает, что интеграл перпендикулярного ком- понента ротора F равен линейному интегралу F по периметру поверхности С. Сле- довательно, ndA = J) F • г ds, (А. 100) где граница С должна быть “кусочно-гладкой”, что означает, что С должна быть непрерывной кривой или кривой, составленной из конечного числа непрерывных секций, таких как дуги окружности или сегменты прямых. В данном выражении п — единичная нормаль к поверхности в любой точке, dA — дифференциальный элемент поверхности, г — единичный касательный вектор к граничной кривой С в любой точ- ке, a ds — дифференциальный отрезок прямой вдоль С. Направление интегрирования по С — против часовой стрелки при наблюдении поверхности спереди (раздел 3.15), как показано на рис. А.23.
А.11. Теоремы об интегральном преобразовании... 1101 ТЕОРЕМА ГРИНА ДЛЯ ПЛОСКОЙ ПОВЕРХНОСТИ Если рассмотреть область на плоскости ху, ограниченную кусочно-гладкой кривой С (как в теореме Стокса), теорему Грина на плоскости можно выразить в декартовой форме f f (df2 dfA Г / / -х------х- ах dy = ф (Л dx + Д ау). J 7 площадь \ &х оу J Jc (А.101) Здесь fi(x, у) и f2(x, у) — две непрерывные функции, определенные везде в плос- кой области, ограниченной кривой С, а направление интегрирования по С — против часовой стрелки. Кроме того, теорему Грина можно также применить к области с внутренними дырами, подобной представленной на рис. А.24, но при этом придется еще интегрировать по внутренним граничным кривым по часовой стрелке. Хотя теорема Грина и была сформулирована независимо, она является част- ным случаем теоремы Стокса. Чтобы продемонстрировать это, определим векторную функцию F с декартовыми компонентами (Д, f2, 0). Далее теорему Грина можно записать в векторной форме: / / (rotF) • u2 dA — <р F • г ds, (А. 102) J Уплощадь JC где uz — единичный вектор, перпендикулярный плоскости ху (в направлении z), dA = dx dy, а другие параметры те же, что и в уравнении (А. 100). Теорему Грина для плоской поверхности можно использовать для вычисления площади плоской области, положив Д = 0 и f2 = х. Далее из теоремы Грина находим, что площадь А плоской фигуры равна площадь р xdy. (АЛОЗ) Подобным образом, если положить Д = — у и Д = 0, получим А = I I dxdy = J площадь у dx. (А. 104) Складывая два предыдущих уравнения на плоскости, получаем А = - (xdy - ydx). (А. 105)
1102 Приложение А. Математика компьютерной графики Кроме того, данное выражение в декартовых координатах можно преобразовать в выражение в полярных координатах г2 dO. (А. 106) Теорему Грина на плоскости можно выразить во множестве других полезных форм. Например, если определить Д = df /ду и Д = df /dx для некоторой непрерывной функции /, получаем [[ V2fdxdy = <i <^-ds, (А.107) J J площадь J С где df/dri — производная f по направлению внешней нормали к граничной кривой С. ТЕОРЕМА О ДИВЕРГЕНЦИИ (ГАУССА-ОСТРОГРАДСКОГО) Две предыдущие теоремы позволяют преобразовать интегралы по поверхности в ин- тегралы по контуру и наоборот. Теорема Гаусса-Остроградского — это выражение для преобразования интеграла по объему в интеграл по поверхности или наоборот. Данная теорема известна также под другими названиями — теорема Грина в про- странстве и теорема о дивергенции. Итак, для непрерывной трехмерной векторной функции F, определенной в объеме пространства, теорему Гаусса-Остроградского можно выразить в векторной форме III divF dV = f f F-ndA, (А.108) J J J vol J J surf где dV — дифференциальный элемент объема, n — вектор нормали для граничной поверхности, a dA — дифференциальный элемент площади поверхности. Теорему Гаусса-Остроградского можно использовать для получения некоторых полезных интегральных преобразований. Например, если F = V/ для некоторой непрерывной трехмерной функции /, получаем пространственную версию уравне- ния (А.107): П ! V2fdV=[f ^-dA. (А.109) J J Jvo] J Aurf dn В данном уравнении df/дп — производная f по направлению нормали к поверхности. Из теоремы Гаусса-Остроградского можно вывести выражения для объема про- странственной области с помощью интеграла по поверхности. В зависимости от того,
A. 12. Площадь и центр масс многоугольника 1103 Рис. А.25. Многоугольник, определенный п вершинами на плоскости ху как представлена векторная функция F, можно получить любое из приведенных ниже декартовых выражений для интеграла по поверхности. V = [ [ [ dxdydz = J J Jvol ~ xdydz = ydzdx= zdxdy — (А. ПО) J J surf J J surf J J surf = - I I (x dy dz + у dz dx + z dx dy) 3 J Aurf УРАВНЕНИЯ ГРИНА Из теоремы Гаусса-Остроградского можно вывести множество других интегральных преобразований. Указанные ниже интегральные уравнения называются уравнениями Грина, первой и второй формулами Грина или тождествами Грина. //bf^+7Л v/2)<iv - (А“ ° l/bf^h - =/Ь (л^ -м <А 112) В данных выражениях /1 и /г — непрерывные трехмерные скалярные функции, dfi/дп и dfz/dn — их производные в направлении нормали к поверхности. А.12. ПЛОЩАДЬ И ЦЕНТР МАСС МНОГОУГОЛЬНИКА Интегральные преобразования из раздела А. 11 можно использовать для расчета раз- личных свойств объектов для приложений компьютерной графики. В программах, включающих геометрические преобразования, моделирование, разработку систем и анимацию, часто требуются площадь и центр масс многоугольника.
1104 Приложение А. Математика компьютерной графики ПЛОЩАДЬ МНОГОУГОЛЬНИКА Из уравнения (А. 103) можно получить площадь многоугольника, выразив декартовы координаты в параметрической форме и вычислив интеграл по периметру много- угольника. Параметрические уравнения п сторон многоугольника с п вершинами на плоскости ху (рис. А.25) выражаются в следующей форме: х = хк + (хк+1 - хк)и 0 < и < 1, к = 1,2, ... ,n, (А.113) У = Ук + (Ук+i ~ Ук)и где xn+1 = Xi и yn+1 = yi. Подставляя дифференциальное выражение dy = (yk+i — yk)du и параметриче- ское выражение для х в уравнение (А. 103), получаем А = £ xdy = п -1 = 52 / [хк + Ok+1 - ^fc)w](yfc+i - Ук) du = k=lJ° n = £(yfe+i ~ Ук)1хк + (zfc+i - £fc)/2] = fc=i 1 n = ~ ^(хкУк+1 ~ хкУк + хк+1ук+1 - хк+1ук). (A.114) 2 fc=l Для каждого отрезка второй и третий члены этой суммы сокращаются с подобными членами, имеющими противоположный знак, в последующих значениях к. Следова- тельно, площадь многоугольника равна т п А =-^(xkyk+i-xk+iyk). (А.115) 2 fc=l ЦЕНТР ТЯЖЕСТИ МНОГОУГОЛЬНИКА По определению центр тяжести — это положение центра масс объекта постоянной плотности (все точки объекта имеют одинаковую массу). Следовательно, координаты центра масс — это просто средние значения координат всех точек в границах объекта. Для некоторых простых многоугольников центр масс можно получить, усреднив положения вершин. Однако в общем случае усреднение вершин не дает точного расположения центра масс, поскольку не учитывает все другие точки многоугольника. Как показано на рис. А.26, среднее положений вершин близко к точке наибольшей концентрации вершин, тогда как центр масс — это центральная точка всей площади многоугольника.
A. 12. Площадь и центр масс многоугольника 1105 Рис. А.26. Координаты центра масс многоугольника и среднее координат вершин Положение центра масс (х, у) многоугольника на плоскости ху определяется усреднением координат всех точек в границах многоугольника: _ 1 [[ , , х = — Il xdxdy = — 7площадь А 1 Г Г (А.116) У = 7 // ydxdy = л J V площадь В данных выражениях рх и ру называются площадью по осям х и у соответственно, причем предполагается, что единичная площадь имеет единичную массу. Все параметры многоугольника можно определить, используя те же процедуры, что и для расчета площади многоугольника. Из теоремы Грина для плоскости получа- ем линейный интеграл, эквивалентный интегралу по площади, который вычисляется с использованием параметрического представления декартовых координат по кра- ям многоугольника. В теореме Грина для плоских поверхностей (уравнение (А. 101)) утверждается, что f f (df2 д/Л Г / / ------] dx “У = ф (Л dx + /2 ay)- J J площадь \ vx vy / Jc (A. 117) Для вычисления px можно в предыдущем преобразовании положить /2 = \х2 и /1 = 0, так что Рх = 11 xdxdy = | х2 dy. J J площадь “ J С (A. 118) Из параметрических представлений (А. 113) сторон многоугольника получаем х2 =х% + 2xk(xk+i ~ Xk)u + (rrfe+1 - хк)2и2
1106 Приложение А. Математика компьютерной графики и dy = (j/fc-H ~yk)du для всех п сторон, помеченных k = 1,2,..., п. Следовательно, п — /-1 Мх = £ Ук+1гу Ук / \хк + 2xfc(xfc+1 - хк)и + (xfe+1 - хк)2и2] du = fc=l 2 7о 1 п = g £(^+1 +хк~)(хкук+1 - хк+1ук). (А.119) ° к=1 Для вычисления уу сделаем подстановку Д = — |у2 и Д = 0 в теорему Грина и получим Ру = [[ ydxdy = ^- <L y2dx. (А.120) J ./площадь JC Используя параметрические представления (А. 113) для вычисления линейного инте- грала, получим 1 п РУ= g £(l/fc+l + Ук)(хкУк+1 - хк+1Ук)- (А.121) Для любого данного набора вершин многоугольника далее используются значения А, ух и из уравнений (А. 116), с помощью которых вычисляются координаты центра масс многоугольника. Поскольку выражение (хкук+± — xk+iyk) возникает при вычислениях всех трех величин (А, ух и уу), для всех отрезков его достаточно рассчитать один раз. А.13. РАСЧЕТ СВОЙСТВ МНОГОГРАННИКА Методы, подобные тем, что разработаны для многоугольников, применяются для определения свойств многогранников. Однако при этом вычисляется объем, а не площадь, и центр масс находится усреднением точек по всему объему многогранника. Объем любой пространственной области следующим образом вычисляется в гаус- совых координатах /Л dx dy dz. (А. 122)
A. 14. Численные методы 1107 Данный интеграл можно преобразовать в интеграл по поверхности, используя одно из уравнений (А.110). Для многогранника поверхностный интеграл можно вычислить, используя параметрическое представление точек каждой грани тела. Положение центра масс многогранника можно найти, используя методы, подоб- ные разработанным для многоугольников. По определению положение центра масс области пространства (имеющей единичную массу на единицу объема) в декартовых координатах — это среднее всех точек области: х v J J Jvol =vl/Lxdxdydz=v’ y=H/Lydxdsdz=v' ~z=v//Lzdxdydz=v- (A. 123) Как и ранее, объемные интегралы можно преобразовать в поверхностные, подставить параметрические представления декартовых координат и вычислить поверхностные интегралы по граням многогранника. А.14. ЧИСЛЕННЫЕ МЕТОДЫ В алгоритмах компьютерной графики часто требуется решить систему линейных, нелинейных, интегральных уравнений и других функциональных форм. Кроме того, чтобы визуализировать дискретный набор точек данных, бывает полезно отобразить непрерывную функцию на кривой или поверхности, которая аппроксимирует точки набора данных. В данном разделе кратко изложены основные алгоритмы решения различных численных задач. РЕШЕНИЕ СИСТЕМ ЛИНЕЙНЫХ УРАВНЕНИЙ Для переменных х^, где А: = 1,2, ...,п, систему п линейных уравнений можно записать следующим образом аих1 + + • • + а\пхп = /ц, а21^1 + ^22^2 + • • + й2пхп = &2, (д 124) anlxl + Йп2-^2 Т * ’ * Т С^пп-Хп — где значения параметров а.ц. и bj известны. Данный набор уравнений можно выразить в матричной форме АХ = В, (А. 125)
1108 Приложение А. Математика компьютерной графики где А — квадратная матрица п на п, элементы которой — коэффициенты X — вектор-столбец значений Xj, а В — вектор-столбец значений bj. Решая данное мат- ричное уравнение относительно X, получаем х = а'в. (А. 126) Данную систему уравнений можно решить тогда и только тогда, когда А — несин- гулярная матрица; те. ее детерминант не равен нулю. В противном случае обратная матрицы А не существует. Один из методов решения системы уравнений — использовать метод Крамера'. det Ajt Xk = ------, detA (A. 127) где Ajt — матрица A, k-й столбец которой замещен элементами В. Данный метод це- лесообразен для задач с несколькими переменными. Однако, если число переменных больше 3 или 4, он крайне неэффективен из-за большого числа умножений, требу- емых для вычисления каждого детерминанта. Расчет одного детерминанта п на п требует более п! умножений. Более эффективно систему уравнений можно решить, используя различные вари- анты гауссова исключения (Gaussian elimination). Основную идею гауссова исключе- ния можно проиллюстрировать на следующей системе двух уравнений. Xi + 2х2 = —4 + 4^2 = 1 (А. 128) Чтобы решить данный набор уравнений, первое следует умножить на —3, затем сложить их, чтобы исключить член xi, в результате чего получится уравнение -2х2 = 13, решение которого — Х2 = —13/2. Данное значение затем подставляется в любое из исходных уравнений и получается х\ = 9. Данный стандартный подход можно использовать для решения любой системы линейных уравнений, хотя существуют алгоритмы более эффективного выполнения исключения и обратной подстановки. Модификацией гауссова исключения является метод LU-разложения (или LU- факторизации) решения систем линейных уравнений. В этом алгоритме вначале матрица А факторизуется в две матрицы, именуемые нижней треугольной матрицей L и верхней треугольной матрицей U, такой что A = LU. (А. 129)
A. 14. Численные методы 1109 Все элементы матрицы L над диагональю имеют значение 0, а все диагональные элементы — значение 1. Все элементы матрицы U под диагональю имеют значение 0. Далее уравнение (А. 125) можно переписать как LUX = B. (А.130) Это позволяет решить две следующие более простые системы уравнений. LY = В, UX = Y (А.131) Как только элементы матрицы Y в уравнении (А.131) будут найдены, их используют во второй системе уравнений для определения элементов матрицы X. В качестве примера рассмотрим факторизацию матрицы коэффициентов размером 2 на 2. ’2 3‘ 8 5 1 01 Г2 3 4 1 0-7 Один из методов вычисления элементов матриц-факторов выражен в следующей системе уравнений, где и,^ — элементы верхней треугольной матрицы U, a ltj — элементы нижней треугольной матрицы L. Ц1J 01 j, j 11 2, ..., п 1ц = ——, г = 2,3, ..., п ЦЦ t-i = aij — likukj J = М + 1, ..., тг; i > 2 (А. 132) fc=l Zjj — I &ij ' lik'U'kj j — j 4“ 1, j 4“ 2, . . . , П, J' > 2 \ k=i ) Гауссово исключение иногда приводит к значительным ошибкам округления, а другие методы также могут не давать точного решения. В подобных случаях для решения можно использовать метод Гаусса-Зейделя. Данный метод также эффективен при решении системы линейных уравнений, если известно приблизительное решение. В этом подходе дается изначальное предположение относительно значений переменных Хк, затем итеративно вычисляются последовательные аппроксимации, пока разность между двумя последовательными значениями всех Хк не станет малой. На каждом этапе рассчитываются приблизительные значения переменных: 61 Й122:2 «13^3 ’ * * ^1пХп Х1 = ------------------------------- ап
1110 Приложение А. Математика компьютерной графики Ъ-2 — «212^1 — ^23^3 — • — a%nxn X? =-------------------------------------- a22 (А. 133) Если матрицы А можно переупорядочить так, чтобы модуль диагонального элемента был больше суммы модулей других элементов строки, метод Гаусса-Зейделя гаран- тированно сходится к верному решению. ПОИСК КОРНЕЙ НЕЛИНЕЙНЫХ УРАВНЕНИЙ Корень функции f(x) — это значение х, при котором f(x) = 0. Вообще, функция f(x) может быть алгебраическим выражением, например, полиномом, или вклю- чать трансцендентные функции. Алгебраическим называется выражение, содержащее только арифметические операторы, возведение в степень и извлечение корней. Транс- цендентные функции, такие как тригонометрические, логарифмические и экспонен- циальные функции, представляются бесконечными степенными рядами. Корни нелинейного уравнения могут быть действительными, комплексными чис- лами или их комбинациями. Иногда можно получить аналитические выражения для всех корней в зависимости от сложности уравнения. Например, известно, как найти точное решение любого полиномиального уравнения до степени 4, а корни простых трансцендентных уравнений, таких как sin х = 0, равны х = ктг для любого целого значения к. Однако в большинстве случаев, представляющих практический интерес, чтобы получить корни нелинейного уравнения, требуется использовать численные процедуры. Один из наиболее популярных методов поиска корней нелинейных уравнений — алгоритм Ньютона-Рапсона. Это итеративная процедура, аппроксимирующая /(z) как линейную функцию на каждом шаге итерации (рис. А.27). Начнем с первоначаль- ной “догадки” хо относительно значения корня. Далее рассчитываем аппроксимацию корня, xi, определив, где касательная то пересекает ось х. В xq огибающая (первая производная) кривой равна df _ f(x0) dx xq — xi Следующая аппроксимация корня равна Х1 = ХО - /foo) Г(хоУ (А. 134) (А. 135)
A. 14. Численные методы 1111 Рис. А.27. Аппроксимация кривой при исходном значении хо прямой линией, касательной кривой в этой точке Рис. А.28. Интеграл от /(ж) равен площади между функци- ей и осью х на интервале от а до Ь где /'(хо) обозначает производную f(x), вычисленную в точке х = xq. Описанная процедура повторяется при каждой аппроксимации, пока разность между последова- тельными аппроксимациями не станет достаточно малой. Помимо решения задач, включающих действительные переменные, алгоритм Ньютона-Рапсона можно применить к функции комплексной переменной f(z), к функции нескольких переменных и системам нелинейных функций, действительных или комплексных. Кроме того, если алгоритм Ньютона-Рапсона сходится к корню, он будет сходиться быстрее любого другого метода поиска корней. Но сходимость гарантируется не всегда. Например, метод дает сбой, если при итерации в некоторой точке производная f'(x) превращается в 0. Кроме того, в зависимости от колеба- ний кривой последовательные аппроксимации могут уводить текущее значение от положения корня. Другой метод, менее скоростной, но гарантированно сходящийся, — это метод деления пополам. В этом алгоритме нужно определить интервал х, содержащий ко- рень. Далее применяется процедура двоичного поиска в этом интервале, чтобы при- близиться к одному корню. Вначале находится середина интервала и определяется, где расположен корень — в нижней или верхней его половине. Данная процедура повторяется для всех последующих подынтервалов, пока разность между последова- тельными положениями середины не станет меньше заданного значения. Для уско- рения вычислений можно не делить пополам каждый интервал, а интерполировать последовательные положения х (метод ложного положения).
1112 Приложение А. Математика компьютерной графики Рис. А.29. Аппроксимация интегра- ла суммой площадей маленьких пря- моугольников b х Рис. А.ЗО. Функция с высокочастотными осцилляциями ВЫЧИСЛЕНИЕ ИНТЕГРАЛОВ Интегрирование — это процесс. Для функции одной переменной х интеграл /(г) ра- вен площади “под” кривой, как показано на рис. А.28. Для простых подынтегральных выражений часто можно определить функциональную форму интеграла, но, в общем случае, интегралы вычисляются с использованием численных методов. Из определения интеграла можно записать следующее численное приближение: ь п f(x)dx^'^2fk(x')i\xk. (А.136) fc=i Функция fk(x'\ является аппроксимацией f(x) на интервале Дхк. Например, кривую можно аппроксимировать постоянным значением на каждом подынтервале, а затем сложить площади получающихся прямоугольников (рис. А.29). Данная аппроксима- ция улучшается (вплоть до точного значения) при уменьшении шага деления в интер- вале от а до Ь. Впрочем, если шаг слишком мал, значения площадей прямоугольников могут потеряться в шуме округления. Полиномиальные аппроксимации функции на каждом подынтервале в общем да- ют лучшие результаты, чем аппроксимация прямоугольниками. При использовании линейной аппроксимации получающиеся подобласти являются трапециями, поэтому данный метод аппроксимации называется формулой трапеций. Если для аппроксима- ции функции на каждом подынтервале использовать квадратические полиномы (пара- болы), получим формулу Симпсона, и аппроксимация интеграла будет выглядеть так:
A. 14. Численные методы 1113 Рис. А.31. Случайная точка (х, у), сгенерированная в пря- моугольной области, включающей функцию f(x) на ин- тервале от а до b п—1 п—2 /(«) + /(6) + 4 52 f(xk) + 2^2 f(xk) (нечет.)&=1 (чет.)&=2 (А. 137) В данном выражении интервал от а до b делится на п интервалов равной длины Дж = п (А. 138) где п кратно 2, а хо = а, хк = хк_ 1 + Дж, к = 1,2, ..., п. Для функции с быстро меняющейся амплитудой, такой как в примере на рис. А.ЗО, может быть сложно точно аппроксимировать функцию на подынтервалах. Кроме то- го, кратные интегралы (включающие несколько переменных интегрирования) трудно вычислить по формуле Симпсона или иными методами аппроксимации. В подобных случаях можно применить метод Монте-Карло. Термин Монте-Карло используется для описания методов, включающих использование процедур со случайными числа- ми для решения детерминированных задач. Метод Монте-Карло применяется для вычисления интегралов путем генерации п случайных точек в прямоугольной области, содержащей /(ж) в интервале от а до b (рис. А.31). Далее вычисляется аппроксимация интеграла: /(ж) dx sa h(b — a) count, (А.139) где параметр h — высота прямоугольника, a nCOunt — число случайных точек, находя- щихся между /(ж) и осью ж. Для вычисления случайной точки (ж, у) в прямоуголь- ной области вначале генерируется два случайных числа, ri и 7’2, далее вычисляет- ся величина h = 7/max — Ж = а + 7’1(6 — й), у = T/min "Г ?’2^- (А. 140) Подобные методы можно использовать для поиска кратных интегралов.
1114 Приложение А. Математика компьютерной графики При расчете х и у в уравнении (А. 140) предполагается, что случайные числа Г1 и тг равномерно распределены в интервале (0, 1). Для получения гд и г? можно использовать генераторы случайных чисел из математических или статистических библиотек либо же можно применить следующий алгоритм, называемый линейным конгруэнтным генератором: ik = a i-k-i + c(mod m), k = 1,2,3, ... ik (A-Ml) rk = —, m где а, с, m и io — целые числа, io — начальное значение (seed). Параметр m выбирается максимально возможным на конкретной машине, причем значения а и с выбираются так, чтобы строка случайных чисел до первого повтора значения была самой длинной. Например, на машине с 32-битовым представлением целых чисел можно положить т = 232 - 1, а = 1664525 и с = 1013904223. РЕШЕНИЕ ОБЫЧНЫХ ДИФФЕРЕНЦИАЛЬНЫХ УРАВНЕНИЙ Любое уравнение, содержащее дифференциальные операторы скорости изменения, называется дифференциальным уравнением. Величины могут непрерывно менять зна- чения от одной точки до другой. Они также могут меняться со временем в фикси- рованной точке и варьировать многие другие параметры, такие как температура или ускорение вращательного движения. Уравнение, содержащее производные функции одной переменной, называется обычным дифференциальным уравнением. Чтобы ре- шить дифференциальное уравнение, нужно либо найти функциональную форму, удо- влетворяющую уравнению, либо использовать численные методы для определения значений величин через выбранные интервалы. Чтобы решить дифференциальное уравнение, нужно также знать одно или несколько начальных значений. Уравнение, содержащее только первую производ- ную, называется дифференциальным уравнением первого порядка и требует одного начального значения. Уравнение, содержащее первые и вторые производные, назы- вается дифференциальным уравнением второго порядка и требует двух начальных значений и так далее для уравнений, включающих производные высших порядков. Существует две стандартные классификации для начальных значений. Задачей с на- чальными условиями называется задача, в которой для одного значения независимой переменной заданы известные условия. В краевой задаче известные условия заданы на границах зависимой переменной. Простой пример задачи с начальными условиями — это дифференциальное урав- нение первого порядка — = f(x,t), x(t0) = Хо, (А. 142)
A. 14. Численные методы 1115 где х представляет некоторую зависимую переменную, которая меняется со временем t (независимая переменная), /(х, t) — известная функция, описывающая изменение во времени первой производной х, xq — данное значение х в начальный момент времени to- Представленное уравнение можно также записать в виде oLr = f(x, t) dt. Кроме того, из определения производной дифференциалы можно аппроксимировать с помощью конечных интервалов: ^х~ f(х,tк^At, к — 0,1, ..., п, (А. 143) где Да:/;. = rrfc+i — Хк и Aijt = — ijt для п шагов времени. Обычно берутся равные временнь/е интервалы и используются следующие инкрементные вычисле- ния для определения значений х в каждый момент времени при данном значении .tq в момент to- (А. 144) Данная численная процедура называется методом Эйлера, и она аппроксимирует х отрезками в каждом временном интервале At. Хотя метод Эйлера легко реализовать, в общем случае он не слишком точен. Улучшить этот базовый численный алгоритм можно, используя приведенное ниже разложение в ряд Тейлора и объединяя члены высоких порядков с целью аппрокси- мации разностного уравнения. x(t + At) = x(t) + :r'(t)At + ^x"(t)At2 + • • (A. 145) Поскольку x'(t) = f(x, t), получаем x"(t) = f'(x, t) и так далее для старших произ- водных. Более точный и более распространенный метод решения дифференциальных уравнений первого порядка — алгоритм Рунге-Кутта, также именуемый алгорит- мом Рунге-Кутта четвертого порядка. Данная процедура основана на разложении в ряд Тейлора до четвертого порядка и дает следующий алгоритм: а = f(xk,tk)At b = f(xk + а/2, tk + At/2)At с = f(xk + b/2, tk + At/2)At d = f(xk + c, tk + At)At (A. 146) tk+1 = tk + At xk+1 = xk + (a + 2b + 2c + d)/6, к = 0,1, ... n — 1
1116 Приложение А. Математика компьютерной графики Подобные методы можно применять для решения обычных дифференциальных урав- нений высоких порядков. Общий подход заключается в следующем: использовать разложение х в ряд Тейлора, чтобы оно включало члены с х", х'" и так далее, в зависимости от порядка дифференциального уравнения. Например, из разложения в ряд Тейлора можно получить следующую аппроксимацию второй производной. x"(tt) « ^l-^t + ^-1 (А.147) РЕШЕНИЕ УРАВНЕНИЙ В ЧАСТНЫХ ПРОИЗВОДНЫХ Как можно было ожидать, уравнения в частных производных обычно сложнее обыч- ных дифференциальных уравнений. Впрочем, для решения данных уравнений част- ные производные также можно заменить конечными разностями. Рассмотрим вначале функцию /(г, £), зависящую только от координаты х и вре- мени t. Уравнение в частных производных, содержащее df/dx и df /dt, можно свести к обычному дифференциальному уравнению, заменив пространственную про- изводную конечными разностями. Это позволяет заменить функцию двух переменных функцией одной переменной (времени) с одним индексом: f(x,f)-+ f(xk,t)-+ fk(t). (А. 148) Далее частные производные заменяются следующими выражениями. df = fk+i ~ fk дх (А. 149) df = dfk dt dt После этого мы решаем уравнение для конечного числа точек х, используя предо- ставленные начальные или граничные условия. Для старших производных можно использовать разложение в ряд Тейлора, чтобы получить аппроксимации в конечных разностях. В качестве примера можно исполь- зовать следующую аппроксимацию второй пространственной производной f по х. d2f(x,t) A+i(t)-2A(t) + /fc-i(i) м ism dx? Az2 (A15U) Когда даны функции, определенные на поверхностях или в объеме, пространство можно поделить равномерной сеткой и использовать конечные разности по каждой координате.
A. 14. Численные методы 1117 Другой подход, который применяется для решения уравнений в частных произ- водных, — это метод конечных элементов. Сетка точек накладывается на рассматри- ваемую область, которой может быть поверхность или объем пространства, а затем с помощью различных методов в узлах решаются парные уравнения. В описываемом методе используется аппроксимирующее функциональное решение, а не уравнения в конечных разностях. В зависимости от задачи интеграл записывается для неко- торой величины, например, потенциальной энергии или остаточной ошибки. Далее для минимизации этой потенциальной энергии или остаточной ошибки применяет- ся некоторая процедура, например, метод наименьших квадратов. Эта минимизация дает значения неизвестных параметров в функции, аппроксимирующей решение. АППРОКСИМАЦИЯ НАБОРОВ ДАННЫХ МЕТОДОМ НАИМЕНЬШИХ КВАДРАТОВ Часто при компьютерном моделировании или научных исследованиях с визуализа- цией результатов получаются наборы данных, по которым практически всегда тре- буется определить описывающую их функциональную форму. Стандартный метод получения функции, аппроксимирующей предложенный набор данных, — алгоритм наименьших квадратов. Чтобы применить этот метод, вначале следует выбрать об- щий тип функции, например, линейную, полиномиальную или экспоненциальную функцию. Затем нужно определить значения параметров выбранной функциональ- ной формы. Двухмерную прямолинейную функцию, например, можно описать двумя параметрами: углом наклона и точкой пересечения с осью у. Параметры функции определяются минимизацией суммы квадратов разностей между теоретическими зна- чениями функции и реальными значениями данных. Чтобы проиллюстрировать названный метод, рассмотрим двухмерный набор из п точек данных, помеченных (xk, ук), где k = 1, 2, ..., п. После выбора функциональ- ной формы f(x), которая будет использована для описания распределения данных, записывается выражение для функции ошибки Е — сумма квадратов разностей между f(xk) и точками данных ук: п Е = ^[Ук-(А.151) fc=i Далее посредством минимизации ошибки Е находятся параметры функции f(x). В качестве примера рассмотрим набор данных, который необходимо описать ли- нейной функцией fix') = а0 + сцх.
1118 Приложение А. Математика компьютерной графики Тогда п Е = ^[Ук- 2Ыао + a\xk) + <Zo + 2aoaizfc + a%xk] (A. 152) fc=i Поскольку ошибка E — это функция двух переменных (ао и од), минимизируем Е следующими двумя связанными уравнениями. дЕ п, —— = 2ук + 2ао + 2aixk] — О да° п (А-153) дЕ _п А — = ^2 \~^Укхк + 2аохк + 2aiXk] = О 1 fc=l Данную систему двух линейных уравнений можно решить, используя метод Крамера, что дает (Ek ^fcXSfc Ук) - (Еь ^XEk хкУк) D n Ek хкУк - (Ek ^kXEk Ук) (А. 154) где оба выражения имеют следующий общий знаменатель: (А. 155) Подобная схема вычислений применяется и для других функций. Для полинома /(ж) = а0 + aix + а^х2 Н-----F апхп, например, чтобы определить значения параметров ак, нужно решить систему п ли- нейных уравнений. Кроме того, можно также применить аппроксимацию по методу наименьших квадратов к функциям нескольких переменных f(xi,X2, ... ,хт), ко- торая может быть линейной или нелинейной по каждой из своих переменных.
Предметный указатель Символы “Информационная” перчатка, ПО “Растянуть и сплющить”, 1004 А А-буфер, 742 Adobe Photoshop, 1062 AGL, 130 Apple GL, 130 В BMP, 1063 BSP-дерево, 67Г, 751 С CGM, 1060 CSG, 664 CSG-примитивы, 665 G GIF, 1064 GKS, 127 GL, 127 GLU, 129 GLUT, 130 GLX, 130 I Internet, 121 J Java 2D, 128 Java 3D, 128 JPEG, 1058 L L-грамматика, 708 LU-факторизация, 1108 M MacPaint, 1062 MAG, 896 MIN, 896 MIP-образ, 906 О Open Inventor, 128; 130 P PCX, 1063 PGL, 130 PHIGS, 127 PICT, 1062 PNG, 1061 R RGBA, 271 s SPIFF, 1060 T Taiga, 1063 TGA, 1063 TIFF, 1060
Предметный указатель 1145 и URL, 122 V VRML, 128 W WGL (Windows-to-OpenGL), 130 X XBM, 1061 XPM, 1061 A Абсолютное значение, 1090 Автоматизированная хирургия, 71 Автоматизированное проектирование, 40 производство, 44 Аксонометрическая проекция, 516 Алгоритм граничного заполнения, 304 Ньютона-Рапсона, 1110 наименьших квадратов, 1117 отсечения, 459 потокового заполнения, 309 Рунге-Кутта, 1115 художника, 747 Алгоритмы со словарем, 1049 Альфа-фактор, 134 Анимация, 999 Аппарат состояний, 266 Аппроксимация, 595 Атрибуты, 126 группы, 336 стек, 337 Аттрактор, 692 Аффинное преобразование, 419 Б Базис, 1080 нормированный, 1081 ортогональный, 1081 ортонормированный, 1082 Базисные функции, 599 Безье кривые, 611 Бета-сплайны, 636 непрерывность, 637 параметр натяжения, 637 параметр смещения, 637 Би-сплайны, 624 кубические, 630 неравномерные, 634 открытые равномерные, 632 равномерные, 626 Бизнес-визуализация, 716 Бинарное разбиение пространства, 67Г, 751 Битовое отображение, 82; 228 Битовый образ, 1057 Богемы, 865 Брезенхема алгоритм, 157 Буфер глубины, 231', 277; 549; 738 кадра, 80; 81 накопления, 277; 742 регенерации, 80 цвета, 80; 232; 277 шаблонов, 231; 277 В Введение псевдослучайного шума, 819 Вектор длина, 1090 верха, 441; 509 сдвига, 348 трансляции, 348
1146 Предметный указатель Вектор- столбец, 1084 строка, 1084 Векторное произведение, 1078 Векторные дисплеи, 83 Векторный файл, 84', 1044 формат, 1044 Векторы векторное произведение, 1078 ортонормальные, 3 70 скалярное произведение, 1077 сложение, 1076 Вертикальная проекция, 516 трассировка, 83 Верх изображения, 508 Видимая поверхность, 840 Визуализация плоских поверхностей, 823 поверхностей по Гуро, 824 поверхностей по Фонгу, 827 поверхностей постоянной интенсивности, 823 поверхности, 775 Виртуальная реальность, 46', 95 Внешняя система координат, 123\ 437 Внутренний угол, 202 Воксель, 670 Выпуклая оболочка, 596 Выражение алгебраическое, 1110 Г Гамма, 981 Гамма-коррекция, 812 Генератор, 678 Геометрическая модель, 1029 непрерывность, 599 Геометрические преобразования, 126\ 347 Геометрическое представление, 1044 Главные оси, 516 Глиф, 725 Глубина, 501 поля, 846 Голосовая система, 118 Горизонтальная проекция, 516 трассировкой,83 Градиент, 1096 Грамматика форм, 707 Графики в горизонталях, 717 Графический контроллер, 99 планшет, 112 сервер, 121 Графтал, 708 Грина уравнения, 1103 Групповое кодирование, 101 Группы атрибутов, 336 д Двойная буферизация, 1001 Двойное преломление, 803 Двухмерное преобразование наблюдения, 439 Деление области, 752 пространства, 839 Деловая визуализация, 48 Детерминант, 1086 Джойстик, 109 Диаграмма цветности МКО, 980 Диафрагментарное число, 845 Дивергенция, 1098 Динамическое описание, 1016 Дискретное косинус-преобразование, 1055
Предметный указатель 1147 Дисплеи растрового сканирования, 80 Дисплей с выборочным сканированием, 83 Дифференциальное масштабирование, 354 уравнение, 1114 Диффузия ошибок, 821 Диффузное отражение, 783; 855 Длина волны,974 Дополнительные цвета, 977; 982 Дополнительный шум, 819 Дробная размерность (фрактала), 676 Дрожание, 849 Ж Жесткая структура, 369 Жесткое преобразование, 349 Жидкие кристаллы, 90 Жидкокристаллические дисплеи, 89 ЖКД, 89 3 Завершающие действия, 1005 Заголовок, 1044 Задача с начальными условиями, 1114 Задний буфер, 1021 Зайчик, 783 Закон Гука, 713 Закон Снелла, 803 Закон Френеля, 792 Закон Ламберта, 785 Закрашенная область, 200 Закрашивание криволинейных фигур, 303; 304 многоугольников, 303 Замещающие алгоритмы, 1049 Замкнутая ломаная линия, 152 Запрос, 335 Зеркальное отражение, 783 Значение, 989 И Идеальный диффузный отражатель, 785 Иерархическое описание, 1029 Изолинии, 717 Изометрическая проекция, 516 Изоповерхность, 719 Иллюминат С, 980 Индексный цветовой режим, 272 Инициатор, 678 Интенсивность, 270; 777; 855 Интерполяция, 595 Исследование видимых поверхностей, 735 Источник света, 776 К Кадр, 80 Каплевидные объекты, 592 Каркасная схема, 201 Карта проекций, 866 фотонов, 866 цветов, 268 Квадрики, 579 Квадродерево, 668 Кватернионы, 405; 1091 Кинематическое описание, 1008; 1016 Кисти, 282 Клавиатура, 106 Клеточное заполнение, 293 Ключевой кадр, 1003 Кодирование LZW, 1048 Кодирование ячеек, 101 Коды области трехмерные, 558 Комбинированные мониторы, 87 Комплексная плоскость, 1088 Комплексно-сопряженное число, 1090 Комплексное число, 1088
1148 Предметный указатель Компьютерная анимация, 999 Конвейер наблюдения, 124; 505 Коническое сечение, 190 Конструктивная стереометрия, 664 Контурные графики, 717 представления, 574 Конус зрения, 535 Координатные границы,144 оси, 1071 поверхности, 1071 Координаты абсолютные, 146 относительные, 146 моделирования, 123 наблюдения, 124 устройства, 124 Коэффициент непрозрачности, 805 прозрачности, 295; 805 рассеянного отражения, 789 смешивания, 274 Краевая задача, 1114 Кривая Пеано, 677 Криволинейные системы координат, 1071 Кривые атрибуты, 284 Безье кубические, 620 свойства, 617 Курсив, 317 Курсор, 455 Л Лапласиан, 1097 Линии потока, 722 соединение, 281 стиль, 281 Логические устройства ввода, 920 Локальная система координат, 1036 Локальные координаты, 123 М Маска, 228; 293 удельного веса, 327 Массив вершин, 226 среды, 863 Масштабирование, 354 Масштабные коэффициенты, 354 Матрица, 1083 Безье, 622 верхняя треугольная, 1087; 1108 детерминант, 1086 квадратная, 1083 несингулярная, 1087 нижняя треугольная, 1087; 1108 обратная, 1087 ортогональная, 369 проекции модели, 421 псевдослучайного шума, 819 сингулярная, 1087 транспонирование, 1086 Матрицы жестких преобразований, 369 сложение, 1085 умножение, 1085 умножение слева, 366 умножение справа, 366 Метафайл, 1044 Меташарики, 594 Метод Гаусса-Зейделя, 1109 деления пополам, 1111 Крамера, 1108 конечных элементов, 1117 Монте-Карло, 1113
Предметный указатель 1149 случайного смещения средней точки, 686 Эйлера, 1115 Метрический тензор, 1082 Мнимая единица, 1089 Многогранники, 574 правильные, 575 Многоугольник, 201 вогнутый, 202 деление, 204-206 выпуклый, 202 вырожденный, 202; 204 задние грани, 214 мозаичное представление, 224 передние грани, 214 площадь, 1104 центр тяжести, 1104 Множество Мандельброта, 698 Моделирование, 1029 Моделирующие преобразования, 1037 Модель, 1029, 1040 Вона, 782 диффузного отражения, 852 затенения, 775 освещения, 775 пользователя, 962 Фонга, 790 цвета, 976 RGB, 85 HSV, 989 RGB, 983 XYZ, 979 YIQ, 985 Модельные координаты, 1036 Модуль, 1032; 1090 Мозаичное представление многоугольников, 224 Мощность излучения, 855 Мышь, 107 Мягкий объект, 594 Мягкое окрашивание, 295 Н Наборные диски, 107 Наложение, 323 текстуры, 870 Направляющие углы, 509; 1075 Насыщенность, 989; 993 света, 975 Насыщенные тона, 978 Научная визуализация, 48; 715 Начертание, 235 Невидимые грани, 736 Необработанный растровый файл, 1044 Неподвижная точка, 355 Непрерывность второго порядка по параметру, 598 нулевого порядка по параметру, 598 первого порядка по параметру, 598 Непрозрачная поверхность, 801 Нить накала, 76 Нормаль к плоскости наблюдения, 508 Нормированные координаты, 124; 545 О Обработка изображений, 69 Обратная динамика, 1017 кинематика, 1017 Обратный порядок записи, 1044 Объем наблюдения, 507 нормированный, 545 Ограничение, 928 Ограничивающий прямоугольник, 144 Однородные координаты, 358 Однородный параметр, 149 Ожидание, 1005 Окно
1150 Предметный указатель выбора, 925 изображения, 130 наблюдения, 437 Окружность, 169 Октодерево, 668 Оператор Лапласа, 1098 Операции управления, 126 Ориентация, 318 Ортогональная проекция, 516 нормировка, 520 Ортогональные системы координат, 1071 Ортографическая проекция, 516 Освещение, 784 Оси отражения, 376 Основные цвета, 977 Ось вращения, 351 Отображаемый объем, 507 Отображение кадра, 881 Отображение среды, 864 Отображение шероховатости, 878 Отражение, 376 Отсекающее окно, 438; 518 Отсечение, 459 кривых, 564 линий,559 многоугольников, 562 точек, 559 Оттенок, 975; 989; 993 Очередь событий, 927 П Параллельная проекция, 500; 515 Параметр атрибута, 265 Параметрическая непрерывность, 597 Параметры состояния, 266 Передний буфер, 1021 Переменные состояния, 266 Перенос битовой строки, 233 блока, 233 пиксельной строки, 233 Пересылка блока, 383 Период, 974 волны, 975 Перспективная проекция, 500; 515 Перо, 282 Пиксель, 80 Пиксельная маска, 281 Пиксельное отображение, 82; 228; 1043 Пиктограмма, 72; 963 Пирамида зрения, 535 Плазменные табло, 88 Планшет, 113 Плоскости отсечения дополнительные, 567 Плоскость наблюдения, 500 отражения, 416 отсечения, 506; 519 параметры, 213 проекции, 500; 508 Поблочная передача, 383 Поверхности Безье, 622 би-сплайновые, 636 второго порядка, 579 мозаичное представление, 201 Поворот, 351 Подчеркивание контуров, 817 Позиционная непрерывность, 637 Покадровая анимация, 1000 Показатель зеркального отражения, 790 Показатель преломления, 803 Поле клавиш, 107 просмотра, 438; 548; 553 тяжести, 932
Предметный указатель 1151 Полином, 193 Полиномы Бернстайна, 612 Положение глаза, 508 наблюдения, 508 Полупрозрачная поверхность, 801 Полутона, 814 Полутоновое изображение, 814 Полярная система координат, 1068 Полярные координаты, 1072 Послесвечение, 79 Построение хода луча, 758\ 829 Правая разность, 644 Правило Горнера, 643 Крамера, 213 ненулевого числа витков, 207 правой руки, 1078 четного-нечетного, 207 Представление в однородных координатах, 358 непараметрическое, 1093 параметрическое, 1094 с разбиением пространства, 574 Преломление света, 803 Преобразование моделирования, 126 наблюдения, 126 окна, 439 Примитивы,143 геометрические, 143 Принтер, 119 Проекция аксонометрическая, 516 вертикальная, 516 горизонтальная, 516 изометрическая, 516 кабинетная, 525 косоаксонометрическая, 525 косоугольная параллельная, 523; 526 косоугольная перспективная, 542 ортогональная, 5/6; 550 ортографическая, 516 параллельная, 500; 515 перспективная, 500; 5/5; 53/; 553 симметричная перспективная, 552 центр, 530 Прозрачная поверхность, 801 Производная по направлению, 1097 частная, 1095 Проникновение луча, 85 Пространство векторное, 1080 риманово, 1082 текстуры, 870 Процессор дисплея, 99 Прямая уравнение, /53 Прямой порядок записи, 1044 Прямые атрибуты, 278 Пятно рассеяния, 846 Р Равномерное масштабирование, 354 Радиан, 1069 Радиус-вектор, 1080 Разрешение, 80 Раскадровка, 1003 Распределенное построение хода лучей, 849 Растровая операция, 233; 383 Растровый файл, 1043 Расчет луча, 666; 757; 829 Режим RGB, 270 RGBA, 270 проектирования, 421
1152 Предметный указатель проекции модели, 421 Ротор, 1099 Сортировка по глубине, 746 Спектральный цвет, 973 Спецификация действия, 1007 С Самоподобие, 672 Свертка, 361 Световое перо, 117 Светоизлучающие диоды, 89 Связь, 928 Сдвиг, 381 Сенсорная панель, 115 Сетка многоугольников, 201 Сжатие без потерь, 1047 с потерями, 1047 СИД, 89 Силовые линии, 722 Символы, 322 начертание, 235 шрифт, 235 Система координат, многих частиц, 710 наблюдения, 439; 441 наблюдения uvn, 511 состояний, 266 Системы высокой четкости, 80 координат внешние, 144 криволинейные, 1071 ортогональные, 1071 полярные, 1068 правосторонние, 1070 сферические, 1072 цилиндрические, 1072 реального цвета, 87 Скалярное произведение, 1077 Сканер, 114 Смешивание цветов, 273 Сплайновая кривая, 194; 594 поверхность, 594; 601 Сплайны NURBS, 639 Безье, 611 базисная матрица, 600 деление, 646 естественные, 603 интерполяция, 602 Катмалла-Рома, 608 Коханека-Бертелса, 609 Оувергаузера, 608 параметр натяжения, 608 параметр непрерывности, 611 параметр смещения, 611 рациональные, 638 стыковочные функции, 601 фундаментальные, 607 функции OpenGL, 649 эрмитовы, 604 Стек атрибутов, 337 матриц модельной проекции, 423 Стерадиан, 1073 Стереоскопическое наблюдение, 504 Сторона задняя, 316 передняя, 316 Строка развертки, 80 Стыковочные функции, 599 Субокно, 455 Суперквадрики, 583 Сфера, 579 Сферическая система координат, 1072 Сшивка, 313
Предметный указатель 1153 Т Таблица отображения, 84; 239 Тексель, 870 Текстура, 312 Текстурные координаты, 870 Текущая матрица, 421 Текущее окно, 453 состояние текстуры, 905 Тела Платона, 5 75 Теневой луч, 833 Тензор, 1079 метрический, 1082 ранг, 1079 Тени, 807; 978 Теорема Гаусса-Остроградского, 1102 Грина в пространстве, 1102 Грина на плоскости, 1101 о дивергенции, 1102 Стокса, 1100 Тона, 978 Тонкопленочные электролюминесцентные дисплеи, 89 Тор, 581 Точечная диффузия, 822 Точка атрибуты, 277 взгляда, 509; 550 внешняя, 207 внутренняя, 207 схождения, 533; 534 Трансляция, 348 Трансформация, 66; 1008 Трекбол, 109 Трехцветная теория, 983 У Угол зеркального отражения, 789 обзора, 539 падения, 787 поворота, 351 преломления, 803 Упорядочение по глубине, 501 Упорядоченный шум, 819 Уравнение диффузного отражения, 858 Уравнение тонкой линзы, 845 Условие, 928 Условия непрерывности, 597 Ф Файл изображения, 1043 регенерации отображения, 84 Физическое моделирование, 713 Фильтрация, 329 Форм-фактор, 858 Формула Симпсона, 1112 трапеции, 1112 Эйлера, 1091 Фрактальная геометрия, 672 Функции ввода, 126 Функции запроса, 335 Функция обратного вызова, 456 X Характеристическое отношение, 81 ц Цвет, 267; 322; 783; 973; 975 RBG, 267 Цветность, 975 Цветовая гамма, 977 Центр вращения, 351 проекции, 530
1154 Предметный указатель Цикл обработки GLUT, 456 Цилиндрические координаты, 1072 Цифровой дифференциальный анализатор, 755 Цифровой преобразователь, 110 Ч Чайник GLUT, 587 Частота Найквиста, 323 регенерации, 76 Чистота света, 975 Ш Шаблон, 312 Шарнирные фигуры, 1017 Шкала яркости, 269 Шрифт, 235; 317 битовый, 236 растровый, 235 с засечками, 235 эскизный, 236 Штриховка, 293 Э Экземпляр, 1030 Экранные координаты, /24; 744; 548 ЭЛТ, 75 Электронно-лучевая трубка, 75; 76 Эллипс, 178 оси, 178 фокусы, 178 эксцентриситет, 180 Эллипсоид, 580 Я Яркость, 270; 800; 993 Ячейка узора, 293
Алфавитный указатель функций OpenGL GIF, 1064 GKS, 127 GL, 127 GLCOLORLOGICOP, 250 GL_LINES, 249 GL_ONE_MINUS_SRC_ALPHA, 913 GLPOLYGON, 249 GL_SELECT, 968 GL SRC_ALPHA, 913 glBegin (GL_LINE_LOOP), 249 glBegin (GL LINE STRIP), 249 glBegin (GL_LINES), 249 glBegin (GLPOINTS), 248 glBegin (GL_POLYGON), 249 glBegin (GL_QUAD_STRIP), 249 glBegin (GL_QUADS), 249 glBegin (GL_TRIANGLE_FAN), 249 glBegin (GL_TRIANGLE_STRIP), 249 glBegin (GL_TRIANGLES), 249 glBindTexture, 905; 914 glBitmap, 231; 237; 250 glBlendFunc, 274; 334; 340- 892- 913 glCallList, 241; 250; 1039; 1040 glClear, 277; 770 glClearColor, 134; 276; 277; 494 glClearDepth, 770 glClearlndex, 277; 494 glClipPlane, 567; 568; 570 glColor, 134; 271; 287; 340; 913 glColorPointer, 275; 340 glCopyPixels, 234; 250; 386; 387 glCopyTexImage, 914 glCopyTexImage2D, 904 glCopyTexSublmage, 914 glCopyTexSubImage2D, 904 glCullFace, 765; 770 glDeleteLists, 250 glDeleteTextures, 905; 914 glDepthFunc, 766; 770 glDepthMask, 766; 770; 892 glDepthRange, 770 glDrawBuffer, 233; 250; 386 glDrawElements, 226; 227; 249 glDrawPixels, 231-234; 250; 387 glEdgeFlag, 315; 341 glEdgeFlagPointer, 316 glEnable, 341; 729; 913; 914 glEnable (GL_CULL_FACE), 770 glEnable (GL_DEPTH_TEST), 770 glEnable (GL DITHER), 913 glEnable (GL NORMALIZE), 913 glEnable (lightName), 913 glEnableClientState, 226; 249; 275; 340; 913 glEndList, 239; 250 glEvalCoord, 729 glEvalMesh, 729 glFlush, 136 glFog, 768; 770; 890; 913 glFrontFace, 316; 341; 764 glFrustum, 553; 554; 570
1156 Алфавитный указатель функций OpenGL glGenList, 240; 250 glGenTextures, 914 glGet, 335; 341 glGetBooleanv, 335, 1021; 1025 glGetDoublev, 335 glGetFloatv, 335; 660 glGetlntegerv, 335; 432; 494; 660 glGetTexLevelFunction, 908 glGetTexLevelParameter, 914 gllndex, 272, 287; 340 gllndexPointer, 276; 340 gllnitNames, 948; 968 gllnterleavedArrays, 276 gllsList, 241; 250 gllsTexture, 914 glLight, 882; 913 glLightModel, 886; 913 glLineStipple, 289; 322; 341 glLineWidth, 288; 322; 341 glListBase, 242; 250 glLoadldentity, 243; 426; 432 glLoadMatrix, 432 glLoadName, 948; 968 glLogicOp, 234; 250 glMap, 729 glMapGrid, 729 glMaterial, 888; 913 glMatrixMode, 135; 421; 423; 432; 549; 550 glMultMatrix, 422; 432 glNewList, 239, 250; 1039 glNormal, 893 glNormal, 913 glNormalPointer, 913 glOrtho, 550-552; 570 glOrtho2D, 147 glPixelMap, 234 glPixelStorei, 231 glPixelTransfer, 234 glPixelZoom, 432 glPointSize, 287; 341 glPolygonMode, 313; 315; 341 glPolygonOffset, 314; 770 glPolygonStipple, 311; 341 glPopAttrib, 337; 341 glPopClientAttrib, 337 glPopMatrix, 432 glPopName, 949; 968 glPushAttrib, 336; 337; 341 glPushClientAttrib, 337 glPushMatrix, 432 glPushName, 948; 968 glRasterPos, 230; 231 glRasterPos, 250 glReadBuffer, 233; 386 glReadPixels, 233; 234; 250 glRect, 218; 248 glRect, 249 glRenderMode, 948; 968 glRotate, 432 glRotate, 425 glScale, 432 glScale, 426 glSelectBuffer, 947; 968 glShadeModel, 291; 312; 893; 913; 954 glTexCoord, 914 glTexCoordPointer, 904; 914 glTexEnv, 914 glTexEnvi, 902 glTexImage, 905; 906; 908; 909 glTexImagelD, 914 glTex!mage2D, 899; 914 glTex!mage3D, 901; 914 glTexParameter, 896; 900; 907; 908; 914 glTexParameter, 903 glTexSublmage, 908; 914 glTexSub!mage2D, 906 glTranslate, 432 glTranslate, 425 GLU, 129
Алфавитный указатель функций OpenGL 1157 gluBeginCurve, 656; 657; 730 gluBeginSurface, 730 gluBeginTrim, 730 gluBuild*MipmapLevels, 914 gluBuild*Mipmaps, 914 gluBuild2DMipmapLevels, 907 gluBuild2DMipmaps, 907 glubyte, 311 gluCylinder, 588; 729 gluDeleteNurbsRendercr, 657; 659; 730 gluDeleteQuadric, 589; 729 gluDisk, 588; 729 gluEndCurve, 656; 657; 730 gluEndSurface, 730 gluEndTrim, 730 gluGetNurbsProperty, 660; 730 gluLoadSamplingMatrices, 660; 730 gluLookAt, 549; 550; 570 gluNewNurbsRenderer, 656; 658; 730 gluNewQuadric, 587; 728 gluNurbsCallback, 659; 660; 730 gluNurbsCallbackData, 730 gluNurbsCurve, 656; 657; 661; 730 GLUnurbsObj, 656 GLUnurbsObj *bsplineName, 730 gluNurbsProperty, 658; 730 gluNurbsSurface, 658; 730 gluOrtho2D, 135; 147; 148; 248; 450; 494; 552 gluPartialDisk, 589; 729 gluPerspective, 552; 553; 570 gluPickMatrix, 949; 968 gluPwlCurve, 661; 730 gluQuadricCallback, 589; 729 gluQuadricDrawStyle, 587; 728 gluQuadricNormals, 589; 729 GLUquadricObj;, 728 gluQuadricOrientation, 589; 729 gluQuadricTexture, 909; 914 gluSphere, 587; 728 GLUT, 130 GLUTDEPTH, 770 glutAddMenuEntry, 954; 969 glutAddSubMenu, 969 glutAttachMenu, 954; 969 glutBitmapCharacter, 238; 250 glutButtonBoxFunc, 946; 968 glutCreateMenu, 954; 957; 958; 969 glutCreateSubWindow, 495 glutCreateWindow, 131; 494 glutDestroyMenu, 958; 969 glutDestroyWindow, 494 glutDetachMenu, 961; 969 glutDeviceGet, 946 glutDialsFunc, 946; 968 glutDisplayFunc, 131; 135; 137; 456; 495 glutFullScreen, 494 glutGet, 495 glutGetMenu, 958; 969 glutlconifyWindow, 494 glutldleFunc, 495; 1021; 1025 glutlnit, 131; 451; 494 glutlnitDisplayMode, 133; 270; 340; 494; 770 glutlnitDisplayMode (GLUT_DOUBLE), 1025 glutlnitWindowPosition, 132; 494 glutlnitWindowSize, 132; 494 glutKeyboardFunc, 939; 942; 967 glutMainLoop, 132; 495 glutMotionFunc, 939; 967 glutMouseFunc, 934; 935; 967 glutPassiveMotionFunc, 939; 967 glutPopWindow, 456; 495 glutPositionWindow, 453; 494 glutPostRedisplay, 495; 955; 958 glutPushWindow, 495 glutRemoveMenuItem, 962; 969 glutReshapeFunc, 250; 494
1158 Алфавитный указатель функций OpenGL glutReshapeWindow, 453; 494 glutSetColor, 272; 340 glutSetCursor, 495 glutSetlconTitle, 494 glutSetMenu, 957; 969 glutSetWindow, 494 glutSetWindowTitle, 494 glutShowWindow, 495 glutSolidCone, 555; 728 glutSolidCube, 576; 728 glutSolidDodecahedron, 576; 728 glutSolidlcosahedron, 576; 728 glutSolidOctahedron, 576; 728 glutSolidSphere, 585; 728 glutSolidTeapot, 587; 728 glutSolidTetrahedron, 576; 728 glutSolidTorus, 586; 728 glutSpaceballButtonFunc, 945; 968 glutSpaceballMotionFunc, 946; 968 glutSpaceballRotateFunc, 946; 968 glutSpecialFunc, 942; 967 glutStrokeCharacter, 238; 250 glutSwapBuffers, 1021; 1025 glutTabletButtonFunc, 967 glutTabletMotionFunc, 945; 967 glutWireCone, 585; 728 glutWireCube, 576; 728 glutWireDodecahedron, 576; 728 glutWirelcosahedron, 576; 728 glutWireOctahedron, 576; 728 glutWireSphere, 585; 728 glutWireTeapot, 587; 728 glutWireTetrahedron, 576; 728 glutWireTorus, 586; 728 glVertex, 148-150; 216; 218; 219; 230; 248; 249; 893 glVertex, 248 glVertexPointer, 226; 227; 249 glViewport, 494; 554 GLX, 130
Рис. 1 Рис. 1.2 Рис. 1.1 Рис. 1.4 Рис. 1.3 Рис.1.5 Рис. 1.6
Рис. 1.8 Рис. 1.9 Рис.1.10 Рис. 1.11
Рис. 1.13 Рис. 1.14 Рис.1.16 Рис. 1.17 Рис. 1.18
Рис. 1.20 Рис. 1.21 Рис. 1.22 Рис. 1.23 Рис. 1.25 Рис. 1.24 Рис. 1.26
Рис. 1.27 Рис. 1.29 Рис. 1.30 Рис.1.31 Рис. 1.32
Рис. 1.34 Рис. 1.36
Рис. 1.39 Рис. 1.43 Рис. 1.49 Рис. 1.50 Рис. 1.54 Рис. 1.55
Рис. 1.56 Рис. 1.57 Рис. 1.58 Рис. 1.59
Рис, 1.60 Рис. 1.63 Рис. 1.64
—____•• -'“М Рис. 1.73 Рис. 2 Рис. 2.12 Рис. 2.18
Raytniccn' Recess Raylracers' Recess Рис. 2.19 Рис. 2.33
Рис. 2.37 Рис. 2.38 Рис. 2.39
Рис. 2.53
Рис. 3 Рис. 3.66 I
Рис. 4 Рис. 4.15
Закрашенные полосы пикселей Положения, занесенные в стек Рис. 4.30 б) 2 1 б 5 4 1 5 4 1 Рис. 4.29
Рис. 6
Рис. 7 Рис. 7.2 Рис. 7.4
Рис. 8.80 Рис. 8.81 Рис. 8.82 Рис. 8.84
Рис. 8.86 Рис. 8.87 Рис. 8.88 Рис. 8.95
Рис. 8.102
Рис. 8.103 Рис. 8.104 Рис. 8.110 Рис. 8.109 Рис. 8.111
Рис. 8.112 Рис. 8.116 Рис. 8.115
Рис. 8.117 Рис. 8.122 Рис. 8.121
Рис. 8.123 Рис. 8.126 Рис. 8.127 Рис. 8.129 Рис. 8.132
Рис. 8.138
Рис. 9 Рис. 9.27 Рис. 10
Рис. 10.6 ка = 0 ••OOOJ Рис. 10.15 0,0 0.2 04 0.6 0,8 1.0 Рис. 10.14 Рис. 10.21 -С WCC оз°С с с с с 16 32 64 123 „pcnent
Рис. 10.26 Рис. 10.27
Рис. 10.50 Рис. 10.53
Рис. 10.68 Рис. 10.70
Raytracers' Recess • Parallel camera models • Slereo clipping Рис. 10.Zb Рис. 10.84 Рис. 10.85
Рис. 10.93 Рис. 10.95 Рис. 10.96
Рис. 10.99 Рис. 10.100
Рис. 10.102
Рис. 10.111
Рис. 11 Рис. 11.11
Рис. 11.12 Рис. 11.15 Рис. 11.16 Рис. 11.17 Рис. 11.18
Рис. 12
Рис. 13.11 Рис. 13.12
Рис. 14
Рис. 14.8 Рис. 14.9 Рис. 15
КОМПЬЮТЕРНАЯ ГРАФИКА ТРЕПЕ ИЗДННЕ Дональд Херн М. Паулин Бейнер В переработанном третьем падании дайной книги рассмотрены основные принципы разработки, использования п анализа систем компьютерной графики. Кроме того, показано, как описанные концепции nporpuMMirpyioTt'fi с помощью функции OpenGL. Подробно обсуждаются аппаратные и программные компоненты графических систем: двух- и трехмерная графика рассмотрена в рамках единого комплексного подхода. Материал изложен гак. что любой человек, не имеющий специальных знаний о компьютерной графике, научи гея создавать изображен пи от простых, построенных с помощью прямых отрезков, до весьма сложных фотореалистичных сцеп. ОСНОВНЫЕ ИЗМЕНЕНИЯ • Полное п понятное объяснение функций основной библиотеки OpenGL и дополнительных библиотек GLU и GLUT • Более 100 программ, иллюстрирующих использование функций OpenGL • Примеры кодов на C++, в том числе более 20 полных программ • Рассмотрение двух- и трехмерных методов компьютерной графики • Обзор последних достижений в методах и приложениях компьютерной графики ОБ АВТОРАХ Дональд Херн работает на факультете информатики Иллинойского университета в Урбана- Шампейн с 1985 года. В настоящее время он читает различные курсы но компьютерной графике, пауке визуализации, вычислительным системам и прикладной математике, является автором множества статей но этим темам и руководит многочисленными исследовательскими проектами. М. Наулин Бейкер работает на факультете информатики и в школе информации при университете Индианы университете Пердью. Доктор Бейкер является выдающимся ученым и директором Лаборатории глобальных технологий визуализации и интерактивных пространств, также она работает в исследовательских группах по использованию компьютерной графики И виртуальной реальности для изучения научных данных. Ранее доктор Бейкер занимала поет помощника директора по визуализации и виртуальным средам в Национальном центре по использованию суперкомпьютеров США (National Center for Supercomputing Applications NCSA), Иллинойский университет. Издательский дом “ВИЛЬЯМС" www.wiliiamspublishing.com PEARSON Prentice Hall Upper Saddle River, NJ 07458 www. p tenth a 11 . com
Этот файл был взят с сайта http://all-ebooks.com Данный файл представлен исключительно в ознакомительных целях. После ознакомления с содержанием данного файла Вам следует его незамедлительно удалить. Сохраняя данный файл вы несете ответственность в соответствии с законодательством. Любое коммерческое и иное использование кроме предварительного ознакомления запрещено. Публикация данного документа не преследует за собой никакой коммерческой выгоды. Эта книга способствует профессиональному росту читателей и является рекламой бумажных изданий. Все авторские права принадлежат их уважаемым владельцам. Если Вы являетесь автором данной книги и её распространение ущемляет Ваши авторские права или если Вы хотите внести изменения в данный документ или опубликовать новую книгу свяжитесь с нами по email.