Разделы
Главная Сапромат Моделирование Взаимодействие Методы Инновации Индукция Исследования Факторизация Частоты
Популярное
Как составляется проект слаботочных сетей? Как защитить объект? Слаботочные системы в проекте «Умный дом» Какой дом надежнее: каркасный или брусовой? Как правильно создавать слаботочные системы? Что такое энергоэффективные дома?
Главная »  Сапромат 

1 2 3 4 5 6 7 8 ... 29

Глава 2. Компоненты САПР

PowerMILL - зарегистрированная торговая марка Delcam International Inc. Pro/ENGINEER - зарегистрированная торговая марка Parametric Technology Corp. SolidDesigner - зарегистрированная торговая марка Hewlett-Packard Company. Solid Edge - зарегистрированная торговая марка Intergraph Corporation. SolidWorks - зарегистрированная торговая марка SolidWorks Corporation. VERICUT - зарегистрированная торговая марка CGTech. VersaCAD - зарегистрированная торговая марка T&W Systems, Inc. Unigraphics - зарегистрированная торговая марка Unigraphics Solutions, Inc.

2.4. САПР на базе Windows

Когда рынок программного обеспечения CAD/CAM/CAE достиг зрелости, ситуация на нем радикально изменилась. Инженеры и производители свыклись с тем, что им нужно нечто большее, нежели просто средства построения двумерных чертежей. Они давно ждали появления гибких систем построения трехмерных чертежей, которые могли бы использоваться на всех этапах, от проектирования до производства. До недавних пор промышленные приложения доминировали на рынке традиционных средств CAD высшего класса. К счастью, персональные компьютеры со временем стали невероятно быстрыми и мощными, а многие разработчики программного обеспечения начали выпускать хорошие программные продукты, использующие преимущества превосходной графической среды Microsoft Windows 95 и NT. Первые программные продукты этой категории были выпущены в 1995 г., а первые версии большинства продуктов датированы 1996 г. Все новые продукты обладали следующими общими особенностями. Во-первых, они разрабатывались с максимальным использованием функций Windows 95 и Windows NT, и потому их интерфейсы получались схожими с интерфейсами других программ Microsoft. Фактически эти программы были похожи на другие продукты Microsoft для автоматизации конторского труда, поэтому пользователи чувствовали себя комфортно в знакомой среде и быстро осваивали их. Кроме того, новые программы поддерживали функции внедрения и связывания объектов (Object Linking and Embedding - OLE), характерные для офисных пакетов Microsoft. Таким образом, любое изображение трехмерной детали или устройства, созданное в пакете геометрического моделирования, может использоваться другими программами Microsoft. Представьте, насколько удобна эта возможность при подготовке пользовательской документации. Вы просто копируете трехмерное представление деталей из системы CAD и вставляете его в нужное место текстового файла, созданного и редактируемого в текстовом процессоре. В настоящее время эта функция OLE расширяется с целью включения поддержки трехмерных данных1, что значительно облегчит передачу данных между разными системами CAD.

Во-вторых, в новых системах использовался компонентный подход, согласно которому важнейшие компоненты программного обеспечения выбираются из до-

1 Новая возможность называется OLE for Design & Manufacturing - OLE для проектирования и производства.

2.4. САПР на базе Windows

ступных программ, после чего разработчик системы просто объединяет прс веренные технологии, сосредоточивая свое внимание на деталях, относящихс непосредственно к проектированию. Например, разработчик системы может и< пользовать ACIS от Spatial Technology, Parasolids от Unigraphics Solutions ил Designbase от Ricoh в качестве моделирующего ядра (ключевого компонент обеспечивающего работу с пространственными объектами в трех измерениям и Constraint Solver от D-cubed для параметрического проектирования. Такой пo ход позволяет сократить время на разработку, причем пользователю будут пр< доставлены именно те возможности, которые понадобятся ему в процессе npoei тирования конкретного продукта.

В-третьих, новые системы основаны на объектно-ориентированной технологи три аспекта которой нам придется рассмотреть особо. С точки зрения программ] рования объектно-ориентированная технология означает написание модульнь программ таким образом, чтобы обеспечить независимое повторное использов; ние модулей. Типичным объектно-ориентированным языком программирована является С++. Каждая функция может быть написана на этом языке таким обр, зом, что она будет действовать как независимое целое. Объектно-ориентирова] ная технология определяет также интерфейс между системой и пользователи Объектная ориентированность пользовательского интерфейса означает, что ка> дый элемент интерфейса самостоятельно реагирует на изменения в ситуаци и на действия пользователя. Это значительно облегчает работу пользователя системой. Объектно-ориентированная технология используется и для эффекти: ного хранения данных. В обычных системах CAD данные о детали обычно хр нятся в нескольких файлах: один файл используется для геометрической форм] другой - для сетки конечных элементов, третий - для траектории движенг фрезы станка с ЧПУ, и т. д. В объектно-ориентированных системах все данны относящиеся к одной детали, хранятся в одном файле. При сохранении одинаю вых данных в разных файлах происходит избыточное дублирование, а в объек но-ориентированных системах этого удается избежать, что приводит к знач] тельной экономии памяти.

В-четвертых, системы поддерживают либо параметрическое1, либо вариационн! моделирование. Оба подхода позволяют пользователю определять форму, зад вая ограничения, а не характеристики отдельных элементов этой формы. Еди ственное различие в том, что в одном случае ограничения учитываются одновр менно, а в другом - последовательно. Примером непосредственной работы элементами формы является определение прямоугольника как двух набор*, параллельных отрезков, находящихся на конкретном расстоянии друг от друг Однако тот же прямоугольник может быть определен при помощи ограничени например заданием условия перпендикулярности смежных отрезков и рассто ния между параллельными отрезками. Многие системы, поддерживающие во можность параметрического или вариационного моделирования, воспринимай очевидные ограничения, такие как перпендикулярность и параллельность, неп средственно из начального эскиза пользователя, позволяя уменьшить объем вв димых данных. В этом случае от пользователя требуется только ввести размер

1 Пример приводится в разделе 5.3.1.



после чего он сможет изменять форму, варьируя эти размеры. Такая функция системы называется моделированием по размерам (dimension-driven modeling). Это означает, что геометрия определяется размерами детали и может быть легко изменена переопределением этих размеров. В таких системах пользователь может также указывать отношения между размерами, которые будут сохраняться при изменении самих размеров. Это один из механизмов, позволяющих сохранить идеи разработчика в конечном продукте. Однако задать все ограничения, определяющие геометрию, может быть достаточно затруднительно, особенно для сложной детали. В таких ситуациях системам, поддерживающим параметрическое и вариационное моделирование, требуются дополнительные сведения для проектирования.

Наконец, в системы встраивается поддержка совместного проектирования через Интернет. Эта поддержка позволяет удаленным пользователям работать над одной и той же деталью, имея перед глазами ее модель на своих экранах. Разработчики могут также проверять проект в целом, сравнивая свои детали с деталями других разработчиков. Для того чтобы воспользоваться этой возможностью, нужно как минимум описать деталь в формате VRML. В приложении М сравниваются возможности систем CAD для Windows.

Вопросы и задачи

1. Перечислите компоненты графического устройства и объясните назначение каждого из них.

2. Объясните, почему необходимо обновление экрана векторного или растрового графического устройства.

3. Объясните, каким образом в векторных устройствах реализуется анимация.

4. Объясните, почему независимо от сложности растрового изображения оно не мерцает на растровом устройстве.

5. Сколько цветов можно одновременно отобразить на растровом графическом устройстве с 12-разрядными плоскостями (4-разрядные плоскости для красного, 4-разрядные для зеленого и 4-разрядные для синего)?

6. Перечислите преимущества аппаратной конфигурации, состоящей из объединенных в сеть рабочих станций.

7. Перечислите доступные вам программы для построения двумерных чертежей.

8. Перечислите доступные вам системы геометрического моделирования.

9. Перечислите доступные вам системы САМ. Коротко опишите функции каждого программного продукта.

0. Перечислите доступные вам программы CAE. Коротко опишите функции каждого программного продукта.

Глава 3

Основные концепции графического программирования

Интерактивное манипулирование формами составляет значительную часть работы с системами CAD/CAM/CAE. Следовательно, важнейшей составляющей таких систем является программное обеспечение, создающее графическое изображение на экране монитора. Поэтому нам придется изучить терминологию и основные понятия графического программирования.

3.1. Графические библиотеки

Термин программирование на компьютере (computer programming) раньше означал написание сочинения на языке компьютерных команд в соответствии с предопределенными правилами грамматики. В ответ на вводимые числа выполняемое сочинение порождало ожидаемые числа и символы на терминале или в файле данных. В наши дни на входе и выходе сочинений все чаще находится графическая информация. Такое программирование называется графическим (graphics programming), а область его применения - компьютерной графикой (computer graphics).

Помимо основного программного обеспечения, необходимого для обычного программирования (операционная система, редактор и компилятор), графическое программирование требует наличия специальных графических программ. Графические программы делятся на два класса: драйверы устройств и графические библиотеки.

Драйвер устройства может рассматриваться как набор аппаратно-зависимых кодов, непосредственно управляющих процессором графического устройства таким образом, что электронный пучок оказывается направленным в нужное место (см. главу 2). Драйверы обязательно являются аппаратно-зависимыми, то есть жестко привязанными к конкретным графическим процессорам. Примерно то же самое можно сказать об ассемблере, конкретный вид которого может выполняться только на процессорах одной и той же модели. То же происходит, если графическая программа использует драйвер устройства непосредственно (рис. 3.1). Такую графическую программу при переходе на другое графическое устройство придется переписывать с использованием новых команд драйвера. Более того, команды драйвера устройства весьма примитивны, поэтому такая программа была бы очень длинной, если бы она должна была решать какую-либо сложную задачу. К тому же программа эта получилась бы плохо читаемой. Программисты предпочитают писать программы на языках высокого уровня. Графическое программирование не могло стать исключением, особенно если



представить все неудобства, связанные с использованием команд драйвера низкого уровня. Поэтому с графическими устройствами стали поставляться библиотеки, получившие название графических (graphics libraries}. Графическая библиотека, как, например, и математическая, представляет собой набор подпрограмм, предназначенных для решения определенных задач. Конкретная подпрограмма может изображать на экране прямую, круг или иной объект. Графическая библиотека основывается на командах драйвера устройства (рис. 3.2). Каждая подпрограмма создается с использованием поддерживаемого набора команд драйвера. Например, подпрограмма, изображающая круг, может быть составлена из отдельных команд драйвера, рисующих на экране точки или короткие отрезки.

Приложение

Драйвер

Устройства ввода-вывода

Рис. 3.1. Непосредственное использование драйвера устройства

Графическая библиотека .............................

Драйвер

JM, ,; . ,.

Устройство ввода-вывода

Рис. 3.2. Использование графической библиотеки

Подпрограммы графической библиотеки могут использоваться точно так же, как подпрограммы математической. Нужная подпрограмма вызывается из основной программы аналогично тому, как вызываются функции синуса и косинуса, когда программисту требуется вычислить их значения. Одна из проблем использования подпрограмм графической библиотеки связана с тем, что их названия и способы вызова (входные и выходные аргументы) у каждой библиотеки свои. Это не создавало бы трудностей, если бы одна графическая библиотека могла работать со всеми существующими устройствами, что теоретически было бы возможным, если бы все существующие драйверы устройств поддерживали ее. Однако по некоторым причинам производители программного обеспечения не хотят или не могут создать графическую библиотеку, которая могла бы работать со всеми драйверами, а потому у каждой библиотеки имеется свой круг поддерживаемых драйверов. Следовательно, такая библиотека может работать лишь с ограниченным набором графических устройств, а графические программы, рассчитанные на работу со множеством устройств, приходится переписывать с использованием нескольких библиотек.

Чтобы обойти эту проблему, разработчики графических библиотек могли бы использовать одинаковые наборы подпрограмм с одинаковыми названиями, аргументами и возможностями. (На практике каждая подпрограмма реализуется разработчиками по-разному.) Тогда графические программы не требовали бы изменения на уровне исходного кода даже при изменении графических устройств. Одним из примеров такого подхода является графическая система CORE, предложенная в 1977 г. группой SIGGRAPH (Special Interest Group on Computer Graphics) Ассоциации вычислительной техники (Association for Computing Machinery - ACM). Однако графическая система CORE не предоставляет достаточного набора команд для использования всех возможностей растровых устройств, потому что эти устройства не были широко распространены во времена

разработки системы. Примерно в то же время Международная организация по стандартизации (International Standards Organization - ISO) разработала систему графического ядра (Graphics Kernel System - GKS). GKS считается стандартом в двухмерной графике, а позже эта система была расширена до GKS-3D с поддержкой трехмерной графики.

И у CORE, и у GKS есть определенные недостатки в отношении динамического отображения и гибкого взаимодействия с пользователем. Поэтому организация ISO предложила еще один стандарт, получивший название Иерархическая система программирования интерактивной графики (Programmers Hierarchical Interactive Graphics System - PHIGS). Этот стандарт стал стандартом де факто для большинства графических рабочих станций. Затем он был расширен и получил название расширение PHIGS для X (PHIGS extension to X - РЕХ), потому что в него были включены функции работы с окнами системы X window. Графические программы, написанные на РЕХ, в сетевой среде могут использоваться независимо от типа рабочей станции. Это достоинство было унаследовано от системы X window, о которой будет коротко рассказано в конце главы. Коммерческая графическая библиотека OpenGL развивалась независимо от организаций по стандартизации, однако с течением времени она набирает все большую популярность благодаря гибкости в управлении рабочими станциями и персональными компьютерами в сетевой среде. OpenGL - расширение графической библиотеки GL (фирменной графической библиотеки для компьютеров Silicon Graphics1). Благодаря популярности компьютеров Silicon Graphics в областях, связанных с компьютерной графикой, библиотека OpenGL постепенно приобретает статус графического стандарта де факто.

3.2. Системы координат

Для вывода изображения объекта на экран графического устройства необходимо решить две основные задачи:

□ указать положение всех точек объекта в пространстве;

□ определить положение их образов на мониторе.

Для задания положения точек в пространстве и на мониторе используются системы координат. Важно понимать, как связаны между собой различные системы координат. Особенно это важно для проектирования трехмерного объекта на плоский экран. Проекция на экране строится по тем же законам, что и проекция реального объекта на сетчатке человеческого глаза.

Первой среди систем координат мы рассмотрим систему координат устройства (device coordinate system), которая определяет положение точки на экране. Эта система состоит из горизонтальной оси и и вертикальной оси v (рис. 3.3). Обратите внимание, что начало отсчета может выбираться произвольно. Осей и и v достаточно для задания положения любой точки экрана, поэтому третья ось, перпендикулярная первым двум, не определяется. Положение любой точки задается двумя целыми числами и и и, равными числу пикселов между началом ко-

1 Silicon Graphics - компания, производящая графические рабочие станции, такие как Indigo и 02.



фдинат и точкой по осям и и v. Однако одна и та же точка может задаваться раз-1ыми парами киев зависимости от положения начала координат, направления )сей и масштаба. Эти параметры для разных графических устройств устанавли-}аются достаточно произвольно (см. рис. 3.3). Поэтому аппаратные координаты I графической программе могут потребовать изменения при смене графического -стройства.


1-*- и


Рис. 3.3. Системы координат устройства

виртуальная система координат устройства (virtual device coordinate system) юзволяет избежать описанной выше проблемы. Виртуальная система координат стройства фиксирует точку отсчета, направление и масштаб осей для всех рабо-их станций. Слово виртуальный означает, что данная система отсчета суще-твует только в воображении программиста. Обычно начало отсчета располага-тся в левом нижнем углу экрана, ось и откладывается вправо, а ось v - вверх. 1бе координаты могут изменяться в диапазоне от нуля до единицы. Точка, положение которой задается в виртуальной системе координат, на любом экране \дет попадать в одно и то же место. Это дает программисту возможность едино-бразно определять формы, не заботясь о конкретных системах координат уст-ойств. Графическая программа передает виртуальные координаты подпрограм-н драйвера устройства, которая преобразует их в координаты конкретного стройства.

&иртуальная и обычная системы координат устройства позволяют задавать по-ожение точки на плоском экране. Займемся теперь системами координат для боты с трехмерным пространством. Основных трехмерных систем координат сего три: внешняя система координат (world coordinate system), система коорди-ат модели (model coordinate system) и система координат наблюдателя (viewing oordinate system).

нешняя, или мировая система координат (world coordinate system), - это опор-ая система, используемая для описания интересующего нас мира. Внешней она вляется по отношению к объекгам этого мира. Например, такая система может спользоваться для описания расположения и ориентации парт, стульев и доски, ели интересующий нас мир представляет собой класс.

ледующим шагом является описание формы каждого объекта мира. Форма L-ъекта определяется координатами всех или некоторых характеристических то- к объекта по отношению к системе координат, связанной с ним, - системой

координат модели (model coordinate system). Координаты точек объекта, определенные таким образом, не изменяются даже тогда, когда объект перемещается или вращается в пространстве. Они действительно зависят только от формы объекта. Система координат модели перемещается вместе с тем объектом, к которому она привязана. Поэтому форма каждого объекта определяется в его собственной системе координат модели. Расположение и ориентация любого объекта задаются относительным положением и ориентацией модельной системы координат данного объекта по отношению к внешней системе координат. Относительное расположение и ориентация систем координат определяются матрицей преобразования, о которой будет рассказано в разделе 3.7. Наличие внешней системы координат и модельных систем для всех объектов полностью определяет мир, то есть расположение и форму всех объектов данного мира. Другими словами, применение матриц преобразования позволяет получить координаты любой точки любого объекта во внешней системе.

Следующий шаг - проектирование трехмерных объектов или их точек на монитор подобно тому, как они проектируются на сетчатку человеческого глаза. В компьютерной графике используется два вида проекций: перспективная и параллельная (рис. 3.4).


Рис. 3.4. Два вида проекций: а - перспективная; б - параллельная

Оба вида требуют задания двух точек: точки зрения и точки наблюдения. Точка зрения (viewpoint) - это глаз наблюдателя. Точка наблюдения (viewsite) - это точка объекта, определяющая направление луча зрения . Вектор, проведенный от точки зрения к цели, задает направление наблюдения.

В перспективной проекции (perspective projection) все точки рассматриваемого объекта соединяются с центром проекции, который обычно лежит на линии, соединяющей точку зрения и цель1. Точки пересечения этих линий с экраном образуют проекцию. Экран располагается между точкой зрения и целью. В параллельной проекции (parallel projection) линии от всех точек объекта проводятся в направлении наблюдателя параллельно направлению наблюдения, а точки пересечения этих линий с экраном формируют проекцию. Экран, как и в перспективной проекции, располагается перпендикулярно направлению проектирования. Такая проекция называется ортогональной2.

1 В противном случае проекция называется косоугольной. 1 В косоугольной проекции ориентация экрана произвольна.



Точки проекции, получаемые любым из описанных методов, легко могут быть рассчитаны, если координаты точек проецируемого объекта даны в системе координат xvyvzv (рис. 3.4)1. Например, координаты точек параллельной проекции объекта попросту равняются соответствующим координатам X и Ye точек объекта. Система координат xvyrzv называется наблюдательской (viewing coordinate system), поскольку она облегчает расчет проекции наблюдения. Наблюдательская система координат строится таким образом, чтобы обладать перечисленными ниже характеристиками. Начало этой системы координат располагается в рассматриваемой точке, ось z направлена из начала координат в точку зрения, а ось уг параллельна вертикальной оси экрана (см. рис. 3.4). Третья ось, х, определяется как векторное произведение первых двух. У большинства людей вертикальное направление в пространстве естественным образом ассоциируется с вертикальным направлением на экране, поэтому ось yv считается проекцией вертикального вектора из пространства на экран. В большинстве графических библиотек пользователю приходится задавать вектор вертикали в пространстве (up vector) в мировых координатах. Положение точки зрения и точки наблюдения также задается в мировых координатах (рис. 3.5).

Мировая система координат.

Точка наблюдения


Точка зрения Рис. 3.5. Точка зрения и точка наблюдения

После определения наблюдательской системы координат и вычисления координат точек всех интересующих нас объектов остается только вычислить положение их проекций на экране. Мы уже знаем, что для параллельной проекции это сделать очень легко. Поэтому мы займемся описанием процедуры вычисления координат в перспективной проекции. Рассмотрим виды сверху и сбоку (рис. 3.4, а, рис. 3.6). Интересующая нас точка на рисунке выделена, ее координаты мы обозначим как Х, У„, Z,.

Начало координат наблюдательской системы координат может находиться в точке зрения, а ось z при этом должна указывать на точку наблюдения. Оси х,. и у„ определяются так же, как обычно, в результате чего система становится левосторонней. Следствием этого является то, что точки с большими значениями Z оказываются дальше от наблюдателя. По соглашению, принятому в этой книге, объекты с большими значениями Z расположены ближе к наблюдателю.


Рис. 3.6. Расчет проекции

Из подобия треугольников следует, что

Xs =-rrXv; (3-1)

Ys =-±-Yv. (3.2)

S L-Zv

В формулах (3.1) и (3.2) Xs и Ys - расстояния до проекции выбранной точки. Расстояния измеряются в горизонтальном и вертикальном направлениях от точки, где ось zv пересекается с экраном. Далее, L - расстояние между точкой наблюдения и центром проекции, а S - расстояние между центром проекции и экраном. Формулы (3.1) и (3.2) показывают, что точка с большими значениями Zt, будет иметь большие значения Х5 и Ys, благодаря чему далекий отрезок кажется меньше, чем близкий той же длины. Расстояния Xs и Ys преобразуются в виртуальные координаты устройства с учетом желаемого положения центра изображения и его размеров (на мониторе).

Взаимоотношения перечисленных выше систем координат иллюстрирует рис. 3.7. Как уже говорилось, системы координат связаны друг с другом матрицами преобразования. Так, положение и ориентация каждой из модельных систем координат по отношению к мировой задаются соответствующими матрицами преобразований. Наблюдательская система координат также может быть определена относительно мировой при помощи матрицы преобразования, если задать положение точек зрения и наблюдения, а также вектор вертикали. Процедура расчета точек проекции с использованием матриц преобразования выглядит следующим образом. Сначала координаты проецируемой точки преобразуются из модельных в мировые при помощи матрицы преобразования, определяющей переход от модели, к которой относится точка, к мировой системе координат. Эта операция



(рис. 3.8) называется преобразованием модели {model transformation). Затем координаты этой точки преобразуются из мировой системы координат в наблюдательскую. Эта операция (см. рис. 3.8) называется преобразованием наблюдения (viewing transformation). Наконец, координаты в наблюдательской системе координат преобразуются в значения Xs и Ys по формулам (3.1) и (3.2), а затем - в виртуальные координаты устройства. Эта операция (рис. 3.8) называется преобразованием проекции (projection tranformation). Наконец, виртуальные координаты устройства преобразуются в обычные подпрограммой драйвера. Результат показан на рис. 3.8.

Мировая система координат

Наблюдательская yv система

координат . Система координат модели


Точка зрения

Рис. 3.7. Соотношение систем координат

Значение координаты в системе модели

Преобразование модели

Значение координаты в мировой системе

Виртуальные координаты устройства

Преобразование просмотра

Значение координаты в наблюдательской системе

....... М^

Преобразование проецирования

Координаты устройства

Рис. 3.8. Преобразования между системами координат

Все эти преобразования обычно выполняются внутри графической библиотеки, а программисту приходится только указывать сведения, необходимые для проведения преобразований. Например, трансляции и повороты объектов учитываются при преобразовании модели, положение точки зрения, точки наблюдения и вектора вертикали - при преобразовании наблюдения, а тип проекции, расположение центра проекции и экрана - при преобразовании проецирования. Однако графические библиотеки примитивного уровня могут потребовать от программиста самостоятельного написания кода для всех этих преобразований. Подробнее мы расскажем об этом в разделе 3.7.

3.3. Окно и видовой экран

Термин окно (window) в сетевой компьютерной среде обозначает область экрана монитора рабочей станции, посредством которого пользователь взаимодействует с вычислительными ресурсами, подключенными к той же сети. В компьютерной графике этот термин имеет иное значение. Окно - это область пространства, проецируемая на монитор. Объекты, находящиеся вне окна, на мониторе не появляются. В этом смысле оно подобно окну дома, через которое человеку, сидящему внутри дома, видна лишь часть внешнего мира. Вероятно, эта аналогия была основанием для выбора соответствующего термина. Окно обычно определяется как прямоугольник, лежащий на экране и заданный значениями Хг, и У„ в системе координат просмотра (рис. 3.9 и рис. 3.10). Видимая область пространства, называемая просматриваемым объемом (viewing volume), зависит от типа проекции. Для параллельной проекции эта область имеет форму параллелепипеда, а для перспективной - форму пирамиды.


Рис. 3.9. Окно и просматриваемый объем для параллельной проекции

Просматриваемый объем при проектировании может давать довольно сложное изображение, поскольку в него могут попадать ненужные объекты, расположенные вблизи наблюдателя или вдали от него. Иногда бывает удобно ограничить этот объем двумя плоскостями, из которых одна располагается ближе, а дру-



1Я - дальше (рис. 3.11). Для параллельной проекции ближняя и дальняя пло- сости определяются так же, как и для перспективной.


Рис. 3.10. Окно и просматриваемый объем для перспективной проекции


Рис. 3.11. Ближняя и дальняя плоскости

идовой экран (viewport) - это область экрана, где будет отображаться проеци-уемое изображение (рис. 3.12). В эту область проецируется просматриваемый бьем, определяемый обычным окном. Отображение состоит из трансляции и исштабирования, учитывающих расстояние между центром видового экрана и снтром монитора, а также разницу размеров окна и видового экрана. Другими ловами, значения Xs и Ys, полученные по формулам (3.1) и (3.2), должны быть величены или уменьшены таким образом, чтобы центр окна попадал в центр ндового экрана, а не в центр монитора. Кроме того, они должны быть подверг-уты масштабированию, чтобы четыре граничные точки окна стали четырьмя >аничными точками видового экрана. Соотношение сторон у окна должно быть аким же, как и у видового экрана, в противном случае изображение будет искажено, и круг, например, превратится в эллипс.

Дисплей

Видовой экран 1

Видовой экран 2

Рис. 3.12. Видовые экраны

Ниже приведен пример кода, задающего окно и видовой экран с использованием графической библиотеки OpenGL. В OpenGL окно просмотра также определяется как трехмерный объем. Однако результат получается таким, как если бы третье измерение окна просмотра просто игнорировалось.

static GLint viewports - {0. 0. 400. 400}:

/* Видовой экран задается координатами окна1. Первый и второй аргументы

определяют положение левого нижнего угла окна просмотра, а третий

и четвертый - размер прямоугольника. */ static GLclamped depth range[] = {0.0. 1.0}:

/* Первый и второй аргументы представляют собой поправки к минимальному

и максимальному значениям, которые могут храниться в буфере глубины. */ static GLdouMe viewing volume[] - {-100.0. 100.0. -100.0. 100.0. -10.0. 100.0}:

/* Горизонтальный и вертикальный размеры окна задаются в координатах

просмотра (аргументы 1-4). Пятый и шестой аргументы определяют

расстояние от экрана до ближней и дальней плоскостей соответственно. */ glOrtho(viewing volume[0]. viewing volume[l]. viewing volume[2]. viewing volume[3], vi ewing volume[4]. viewingvolume[5]):

/* Определяет тип проекции - параллельный - и создает матрицу

ортографического параллельного просматриваемого объема, после чего

умножает на него текущую матрицу. */ glViewport(viewport[0]. viewport[l]. viewport[2]. viewport[3):

/* Определяет прямоугольник окна, открытого диспетчером, после чего

отображает в это окно готовое изобаржение. Если glViewport не

используется, окно просмотра по умолчанию считается совпадающим со всем

открытым окном. */ glOepthRange(depth range[0].depth range[l]):

/* Определяет кодирование z-координат при преобразовании просмотра.

Значения z-координаты масштабируются этой командой так. чтобы

они лежали в определенном диапазоне. */

3.4. Примитивы

Примитивы (primitives) - это элементы графики, которые могут отображаться графической библиотекой. В каждой библиотеке набор примитивов свой, поэтому в данном разделе мы рассмотрим только наиболее общие примитивы, поддерживаемые большинством графических библиотек.

1 Это окно означает область монитора, через которую пользователь взаимодействует с компьютером. Окно открывается и обрабатывается диспетчером операционной системы (например, клиентом X window или Microsoft Windows).



3.4.1. Отрезок

Для отображения отрезка прямой (линии - line) необходимо задание координат двух его концов. В большинстве графических библиотек координаты концов могут задаваться в трехмерном пространстве; проецирование на плоскость экрана осуществляется автоматически. Можно указывать атрибуты отрезка: тип, толщину, цвет и другие. Типы отрезков, поддерживаемых большинством графических библиотек, изображены на рис. 3.13. Для систем автоматизированной разработки чертежей поддержка этих типов линий совершенно необходима, поскольку они часто используются в машиностроительных и архитектурных чертежах и электрических схемах.

Рис. 3.13. Различные виды отрезков

В библиотеках GKS, PHIGS и OpenGL одной из базовых функций является ломаная (polyline), представляющая собой набор соединенных друг с другом отрезков. Координаты концов отрезков, составляющих ломаную, задаются в виде матрицы. В случае ломаной, состоящей всего из одного отрезка, в матрицу помещаются координаты двух его концов.

[Р] =

У, Z,

Y, Z2

Примеры использования функций построения ломаной из библиотек PHIGS и OpenGL приведены ниже.

PHIGS

Pint num of points = 10;

/* Количество точек в ломаной. */ Ppoint3 point3[] = {

{0.0. 0.0. 0.0}. {10.0. 20.0. 15.0}.... {1.0. 3.0. 6.5}}: /* Координаты концов отрезков ломаной. Ppolyline3(num of points. point3): /* Рисует заданную ломаную. */

OpenGL

GLdouble point[][3] = {

{0.0. 0.0. 0.0}.

{10.0. 20.0. 15.0}.....

{1.0. 3.0. 6.5}}:

/* Координаты концов отрезков ломаной. */ glBegin(GLLINELOOP):

glVertex3dv(&point[0][0]): glVertex3dv(&point[l][0]):

glVertex3dv(&point[9][0]); glEndO:

/* Построение ломаной по заданным точкам (10 шт.) */

3.4.2. Многоугольник

Многоугольник - это то же самое, что и ломаная, за небольшим исключением: первая и последняя строки матрицы вершин [Р] должны быть одинаковыми (соответствующие им точки совпадают). Того же результата можно было бы достичь и с использованием функции построения ломаной, однако многоугольник, построенный при помощи специальной функции, распознается системой как объект, имеющий внутреннюю и внешнюю части. Внутренняя площадь многоугольника может быть заполнена штриховкой различных видов (рис. 3.14).


Рис. 3.14. Примеры различных заливок

Атрибутами многоугольника могут быть цвет внутренней области (цвет заполнения), а также тип, ширина и цвет ломаной, ограничивающей эту область. Хотя функция построения многоугольников может использоваться и для построения кругов и прямоугольников, в большинстве графических библиотек существуют специальные функции, требующие гораздо меньше входных параметров (например, центр и радиус круга или два конца диагонали прямоугольника). Тем не менее внутри библиотек эти функции реализованы через функцию построения многоугольников.

3.4.3. Маркер

Маркеры обычно используются для выделения точек на графиках. Маркеры, доступные в большинстве графических библиотек, показаны на рис. 3.15. Тип маркера указывается в качестве атрибута. Полимаркер, как и отрезок, является стандартным объектом в GKS н PHIGS. OpenGL не поддерживает маркеры явно, однако предоставляет механизм сохранения маркеров в растровых файлах и выведения их на экран. Благодаря этому графическая программа, построенная на OpenGL, гораздо лучше переносится на различные платформы. Приведенный ниже образец кода демонстрирует выведение маркера * (звездочка) в PHIGS и OpenGL.



+ * О х

0<$> В □ И

Рис. 3.15. Примеры маркеров

PHIGS

pint num of point - 10:

/* Количество маркеров для отображения. */ Ppoint3 point3[] - {

{0.0. 0.0. 0.0}. {10.0. 20.0. 15.0}. {1.0. 3.0. 6.5}}: /* Координаты маркеров. */ pset marker type(PMK STAR):

/* Тип маркера - звездочка. */ ppolymarker3(num of point. point3):

/* Построение маркеров по имеющимся данным. */

OpenGL

GLubyte asterisk[13] - {0x00. 0x00. 0x30. 0x18. 0x0с. 0x0с. 0x0с. 0x0с 0x0с 0x0с 0x0с. 0x18. 0x30}:1

/* Задание растрового изображения звездочки. Первой рисуется нижняя

строка, затем следующая и т. д. */ GLsizei width = 8:

/* Ширина растра в пикселах. */ GLsizei height = 13:

/* Высота растра в пикселах. */ GLfloat ongin x = 0.0. origin y = 0.0:

/* Задание начала отсчета системы координат растра. Положительные

значения смещают начало отсчета вверх и вправо, отрицательные - вниз

и влево. */ GLfloat incre x = 10.0. incre = 0.0:

/* Поправки к положению растра после выведения */ GLfloat whnte[3] = {1.0. 1.0. 1.0};

/* Задание цвета маркера. */ GLfloat positional = {20.5. 20.5}:

/* Координаты маркеров. */ glPixelStorei(GLJJNPACKALIGNMENT. 1):

/* Установка режима хранения пикселов, влияющего

на работу glBitmap. */ glColor3fv(white):

/* Установка белого цвета маркера. */ glRasterPos2fv(position):

/* Установка текущего положения растра. */ glBitmap(width. height, origins. origin y. incre x. incre y. asterisk):

/* Выводит растровую картинку, заданную в последнем аргументе.

представляющем собой указатель на эту картинку. Положение и размер

растра указываются первыми четырьмя аргументами. */

3.4.4. Текст

Большинство графических библиотек поддерживают два вида текста: текст для пояснений (экранный или двумерный текст) и трехмерный текст. Текст для пояснений всегда располагается в плоскости экрана, поэтому его форма не искажа-

1 Метод задания растровых изображений излагается в книге [121].

ется вне зависимости от угла, на который он повернут. Трехмерный текст может быть расположен на любой плоскости в трехмерном пространстве. Его положение и ориентация задаются в мировых координатах. Для текста любого вида необходимо задание таких параметров, как шрифт, отношение высоты к ширине и угол наклона букв, а также положение и направление строки текста. Текст может быть представлен символами двух видов: аппаратными и программными. Программный шрифт строится соответствующими графическими программами, заранее сохраняемыми в памяти компьютера. Построение его занимает больше времени, чем построение символов аппаратного шрифта, но зато форма может быть гораздо более замысловатой. Символы аппаратного шрифта состоят из отдельных отрезков, формирующих буквы.

Приведенный ниже листинг демонстрирует построение текстовой строки ABC с помощью библиотек PHIGS и OpenGL. Символы необходимо сохранить в виде растровых картинок, прежде чем их можно будет использовать в OpenGL, точно так же, как и маркеры.

PHIGS

Pvector3 direction[2] = {

{0.0. 0.0. 0.0}. {10.0. 10.0. 10.0}}: /* Направление строки текста задается двумя радиус-векторами. */ Ppoint3 position = {5.5. 5.0. 5.0}:

/* Положение строки текста. */ ptext3(&posi tion.directi on, ABC ):

/* Построение строки текста с указанными параметрами. */

OpenGL

GLubyte а[13] = {0x00. 0x00. 0x3f. 0x60. Oxcf. Oxdb. 0xd3. Oxdd. ОхсЗ. 0x7e. 0x00. 0x00. 0x00}:

GLubyte b[13] = {0x00. 0x00. ОхсЗ. ОхсЗ. ОхсЗ. ОхсЗ. Oxff. ОхсЗ. ОхсЗ. ОхсЗ. 0x66. ОхЗс. 0x18}:

GLubyte с[13] = {0x00. 0x00. 0xf3. 0хс7. ОхсЗ. ОхсЗ. 0хс7. Oxfe. 0хс7. ОхсЗ. ОхсЗ. 0хс7. Oxfe}:

/* Растровые символы А. В и С. Растр задается снизу вверх

построчно. */ GLsizei width = 8:

/* Ширина растра в пикселах. */ GLsizei height = 13:

/* Высота растра в пикселах. */ GLfloat origin x =0.0. origin y=0.0:

/* Задание начала отсчета системы координат растра.

Положительные значения смещают начало отсчета вверх и вправо.

отрицательные - вниз и влево. */ GLfloat incre x = 10.0. incre y = 0.0:

/* Поправки к положению растра после выведения. */ GLfloat white[3] - {1.0. 1.0. 1.0}:

/* Задание цвета текста. */ GLfloat position[2] = {20.5. 20.5}:

/* Координаты символов. */ glPi xelStorei(GL UNPACK ALIGNMENT.1):

/* Установка режима хранения пикселов, влияющего

на работу glBitmap. */ glColor3fv(white):

/* Установка белого цвета символов. */ glRasterPos2fv(position):

/* Установка текущего положения растра. */



glBitmap(width. height. origin x. originy. increx. incre y. asterisk); /* Выводит растровую картинку, заданную в последнем аргументе, представляющем собой указатель на эту картинку. Положение и размер растра указываются первыми четырьмя аргументами. */

3.5. Ввод графики

Как уже отмечалось, графической программе может требоваться поддержка ввода графических элементов, таких как точки, отрезки и многоугольники, а не только чисел и текстовых строк. Например, если пользователь хочет вычислить площадь многоугольника на экране или увеличить его размеры, он должен сначала указать интересующий его многоугольник среди прочих объектов, видимых на экране. Для ввода графики используется два вида физических устройств: локатор (устройство ввода координат) и кнопка. Локатор (locator) передает графической программе информацию о своем положении, то есть о положении курсора. Кнопка (button) сообщает о действиях пользователя (включении и выключении) в месте текущего положения курсора. В наши дни наиболее популярным устройством графического ввода является мышь, которая выполняет обе функции. Шарик в нижней части корпуса мыши позволяет вводить координаты, а кнопки наверху корпуса передают программе действия пользователя.

Устройство графического ввода может работать в трех режимах: опрос, запрос и выбор. В режиме опроса (sampling) осуществляется постоянное считывание состояния устройства ввода, прежде всего положения локатора. Например, если вы свободно рисуете на экране, перемещая мышь, она работает в режиме опроса. Перемещение мыши приводит к непрерывному перемещению курсора по экрану. В режиме запроса (requesting) положение локатора считывается только при отправке запроса, которая обычно производится при нажатии на кнопку мыши. Чтобы прояснить различие между режимами опроса и запроса, рассмотрим процесс построения многоугольника путем графического задания координат его вершин при помощи мыши. В этом случае мы перемещаем мышь до тех пор, пока курсор не окажется в нужном месте, после чего нажимаем кнопку. Курсор перемещается по экрану согласно движениям мыши, которая находится при этом в режиме опроса. Координаты вершин передаются графической программе в режиме запроса. У этих режимов есть общее свойство: графической программе передаются координаты мыши или курсора. В режиме выбора (picking) устройство графического ввода идентифицирует элемент экрана, на который указывает курсор в момент нажатия кнопки. Графические элементы можно идентифицировать по именам, присвоенным им программистом во время составления программы. Режим выбора очень удобен при редактировании чертежа, уже имеющегося на экране (например, для удаления многоугольников или изменения координат их вершин).

3.6. Дисплейный файл

Дисплейный файл (display list) - это группа команд графической библиотеки, сохраненная для последующего выполнения. Большинство команд графических библиотек могут либо помещаться в дисплейный файл, либо выполняться немедленно. Дисплейный файл обеспечивает удобство и эффективность упорядочения и обработки команд библиотеки. Рассмотрим, например, перемещение

изображения дома по экрану. Предположим, что рисунок состоит из нескольких сотен отрезков. Если бы эти отрезки существовали по отдельности, нам пришлось бы написать команду перемещения несколько сотен раз - для каждого из них. Однако если команды построения отрезков, образующих рисунок, объединены в дисплейный файл, команду перемещения достаточно написать только один раз. Чтобы поместить графические элементы в дисплейный файл, нужно открыть этот файл перед первой командой, которая должна в него попасть, и закрыть его после последней команды (см. пример ниже).

OpenGL

glNewLiSt(AREAFILL. GL C0MPILE AND EXECUTE): /* Открытие дисплейного файла с именем AREA FILL. */ g1Beg i n(GL P0L YGON):

glVertex2fv(pointl):

glVertex2fv(point2):

glEndO:

/* Определение многоугольника. */ glEndListO:

/* Закрытие дисплейного файла. */

Дисплейный файл OpenGL ориентирован на оптимизацию производительности, в частности, при работе по сети, но не за счет производительности на отдельном компьютере. Оптимизация обеспечивается благодаря тому, что дисплейный файл хранится в виде списка команд, а не в виде динамической базы данных. Другими словами, созданный дисплейный файл изменить уже нельзя. Если бы его можно было изменять, производительность упала бы из-за накладных расходов на поиск внутри списка и управление памятью. Изменение отдельных частей дисплейного файла потребовало бы перераспределения памяти, что могло бы привести к ее фрагментации. Дисплейные файлы, как правило, работают так же быстро, как и обычные последовательности команд, не объединенные в группы. В случае OpenGL дисплейные файлы могут значительно повысить производительность, в особенности при передаче подпрограмм OpenGL по сети, поскольку файлы эти хранятся на сервере, благодаря чему сокращается сетевой трафик. К созданному дисплейному файлу могут быть применены следующие операции:

□ множественное выполнение (multiple execution) - один и тот же файл можно выполнять много раз;

□ иерархическое выполнение (hierarchical execution) - иерархическим называется дисплейный файл (родительский), вызывающий другие дисплейные файлы (дочерние). Иерархические дисплейные файлы удобны для объектов, состоящих из отдельных компонентов, особенно если некоторые компоненты входят в объект в нескольких экземплярах;

□ удаление (deletion) - дисплейный файл может быть удален.

3.7. Матрица преобразования

Как говорилось в разделе 3.2, проецирование точек на объект в трехмерном пространстве требует преобразования координат из одной системы в другую. Сначала нужно перевести координаты точек объекта из модельной системы в миро-





1 2 3 4 5 6 7 8 ... 29