Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 700358.doc
Скачиваний:
18
Добавлен:
01.05.2022
Размер:
3.53 Mб
Скачать

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

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

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

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

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

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

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

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

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

Чтобы обойти эту проблему, разработчики графических библиотек могли бы использовать одинаковые наборы подпрограмм с одинаковыми названиями, аргументами и возможностями. (На практике каждая подпрограмма реализуется разработчиками по-разному.) Тогда графические программы не требовали бы изменения на уровне исходного кода даже при изменении графических устройств. Поэтому организация ISO предложила стандарт, получивший название «Иерархическая система программирования интерактивной графики» (Programmer's Hierarchical Interactive Graphics System - PHIGS). Этот стандарт стал стандартом де факто для большинства графических рабочих станций. Затем он был расширен и получил название «расширение PHIGS для X» (PHIGS extension to X - РЕХ), потому что в него были включены функции работы с окнами системы X window. Графические программы, написанные на РЕХ, в сетевой среде могут использоваться независимо от типа рабочей станции.

Коммерческая графическая библиотека OpenGL развивалась независимо от организаций по стандартизации, однако с течением времени она набирает все большую популярность благодаря гибкости в управлении рабочими станциями и персональными компьютерами в сетевой среде. OpenGL - расширение графической библиотеки GL (фирменной графической библиотеки для компьютеров Silicon Graphics). Благодаря популярности компьютеров Silicon Graphics в областях, связанных с компьютерной графикой, библиотека OpenGL приобретает статус графического стандарта де факто.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Точки проекции, получаемые любым из описанных методов, легко могут быть рассчитаны, если координаты точек проецируемого объекта даны в системе координат xυyυzυ (рис. 2.3). Например, координаты точек параллельной проекции объекта попросту равняются соответствующим координатам xυ и yυ точек объекта. Система координат xυyυzυ называется наблюдательской, поскольку она облегчает расчет проекции наблюдения. Наблюдательская система координат строится таким образом, чтобы обладать перечисленными ниже характеристиками. Начало этой системы координат располагается в рассматриваемой точке, ось zυ направлена из начала координат в точку зрения, а ось yυ параллельна вертикальной оси экрана (рис. 2.3). Третья ось, xυ определяется как векторное произведение первых двух. У большинства людей вертикальное направление в пространстве естественным образом ассоциируется с вертикальным направлением на экране, поэтому ось yυ считается проекцией вертикального вектора из пространства на экран. В большинстве графических библиотек пользователю приходится задавать вектор вертикали в пространстве в мировых координатах. Положение точки зрения и точки наблюдения задается в мировых координатах (рис. 2.4).

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

После определения наблюдательской системы координат и вычисления координат точек всех интересующих нас объектов остается только вычислить положение их проекций на экране. Мы уже знаем, что для параллельной проекции это сделать очень легко. Поэтому мы займемся описанием процедуры вычисления координат в перспективной проекции. Рассмотрим виды сверху и сбоку (рис. 2.3, а; рис. 2.5). Интересующая нас точка на рисунке выделена, ее координаты мы обозначим как Xυ, Yυ, Zυ.

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

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

Xs = S Xυ /(L- Zυ), Ys = SYυ /(L- Zυ),

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

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

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

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

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

Сначала координаты проецируемой точки преобразуются из модельных в мировые при помощи матрицы преобразования, определяющей переход от модели, к которой относится точка, к мировой системе координат. Эта операция называется преобразованием модели. Затем координаты этой точки преобразуются из мировой системы координат в наблюдательскую. Эта операция называется преобразованием наблюдения. Наконец, координаты в наблюдательской системе координат преобразуются в значения Xs и Ys, а затем - в виртуальные координаты устройства. Эта операция называется преобразованием проекции. Наконец, виртуальные координаты устройства преобразуются в обычные подпрограммой драйвера.

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

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

Термин окно (window) в сетевой компьютерной среде обозначает область экрана монитора рабочей станции, посредством которого пользователь взаимодействует с вычислительными ресурсами, подключенными к той же сети. В компьютерной графике этот термин имеет иное значение. Окно - это область пространства, проецируемая на монитор. Объекты, находящиеся вне окна, на мониторе не появляются. В этом смысле оно подобно окну дома, через которое человеку, сидя­щему внутри дома, видна лишь часть внешнего мира. Вероятно, эта аналогия была основанием для выбора соответствующего термина. Окно обычно определяется как прямоугольник, лежащий на экране и заданный значениями Xυ и Yυ в системе координат просмотра (рис. 2.8 и рис. 2.9). Видимая область пространства, называемая просматриваемым, зависит от типа проекции. Для параллельной проекции эта область имеет форму параллелепипеда, а для перспективной - форму пирамиды.

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

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

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

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

Видовой экран - это область экрана, где будет отображаться проеци­руемое изображение. В эту область проецируется просматриваемый объем, определяемый «обычным» окном. Отображение состоит из трансляции и масштабирования, учитывающих расстояние между центром видового экрана и центром монитора, а также разницу размеров окна и видового экрана. Другими словами, значения Xs и Ys, должны быть увеличены или уменьшены таким образом, чтобы центр окна попадал в центр видового экрана, а не в центр монитора. Кроме того, они должны быть подверг­нуты масштабированию, чтобы четыре граничные точки окна стали четырьмя граничными точками видового экрана. Соотношение сторон у окна должно быть таким же, как и у видового экрана, в противном случае изображение будет иска­жено, и круг, например, превратится в эллипс.

2.4. Примитивы

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

2.4.1. Отрезок

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

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

.

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

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

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

2.4.3. Маркер

Маркеры обычно используются для выделения точек на графиках. Маркеры, доступные в большинстве графических библиотек, показаны на рис. 2.11.

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

Рис. 2.11. Типы маркеров

2.4.4. Текст

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

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

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

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

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

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

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

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

К созданному дисплейному файлу могут быть применены следующие операции:

  • множественное выполнение - один и тот же файл можно выполнять много раз;

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

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

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

Как говорилось в разделе 2.2, проецирование точек на объект в трехмерном про­странстве требует преобразования координат из одной системы в другую. Снача­ла нужно перевести координаты точек объекта из модельной системы в мировую. Текущее положение объекта обычно задается через повороты и смещения относительно исходного положения, в котором модельная система координат совпадала с мировой. Следовательно, мировые координаты точек объекта можно получить трансляцией и поворотом соответствующих точек из их исходного по­ложения, в котором их модельные координаты совпадали с мировыми. Большинство графических библиотек выполняют эти преобразования самостоятельно, а программисту остается задать только смещение и поворот для интересующего его объекта. Однако проектировщику все равно нужно знать законы преобразований, чтобы рисовать объекты в нужных местах без проб и ошибок, в особенности если эти объекты перемещаются достаточно сложным образом. В этом разде­ле мы рассмотрим матрицы преобразования, действующие на точки объекта при его перемещении и повороте.

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

2.7.1. Трансляция

При трансляции объекта на величины а, b и с в направлениях х, у и z соответственно по отношению в начальному положению, в котором модельная система координат совпадала с мировой (рис. 3.16), мировые координаты точек объекта в новом положении (Хw, Yw, Zw) вычисляются следующим образом:

Хw = Хm + а;

Yw = Ym + b; (2.1)

Zw = Zm + c.

В этой формуле числа Хm, Ym, Zm являются также модельными координатами точки.

Формула (2.1) может быть записана в матричной форме:

(2.2)

Trans(a, b, с)

Рис. 2.12. Трансляция объекта

Легко убедиться, что формулы (2.2) и (2.1) эквивалентны друг другу: для этого достаточно записать (2.2) в развернутом виде. Операцию сложения в (2.1) удалось записать через умножение в (2.2) благодаря использованию однородных координат, в которых трехмерный вектор записывается через четыре скаляра вместо трех. Матрица, которую мы получили, называется матрицей однородного преобразования. В данном случае преобразование является трансляцией. Если бы преобразование (в частности, трансляцию) нужно было применить к точке в двумерном пространстве, однородная матрица преобразования редуцировалась бы до матрицы размерностью 3×3 удалением третьей строки и третьего столбца из матрицы размерностью 4×4. Новая матрица действовала бы на вектор координат размерностью 3×1, полученный из вектора 4×1 удалением z-координаты.

2.7.2. Вращение

Пусть объект поворачивается на угол θ вокруг оси х мировой системы координат вместе со своей модельной системой, которая, как и в предыдущем случае, изначально совпадает с мировой (рис. 3.17). Мировые координаты точки объекта в новом положении (Хw, Yw, Zw) могут быть получены из исходных мировых координат этой точки (Хm, Ym, Zm), совпадающих с ее текущими координатами в мо­дельной системе.

Соотношение между (Хw, Yw, Zw) и (Хm, Ym, Zm) становится очевидным после про­ецирования рис. 2.13 на плоскость yz. Результат проецирования показан на рис. 2.14.

Рис. 2.13. вращение Рис. 2.14. Проекция на

вокруг оси х плоскость yz

Из рис. 2.14 можно получить следующие равенства:

Хw = Хm;

Yw=·cos(θ + α) =/(cosθ·cosα -sinθ·sinα) =

= ·cosα ·cosθ - ℓ·sinα·sinθ = Ymcosθ - Zmsinθ;

Zm =·sin(θ + α) =·(sinθ·cosα + cosθ·sinα)=

=·cosα·sinθ + ·sinα·cosθ = Ymsinθ + Zmcosθ.

Эти равенства могут быть записаны в матричной форме:

(2.3)

Матрица в правой части формулы (2.3) - это однородная матрица преобразова­ния вращения вокруг оси х, которая кратко обозначается Rot(x,θ). Подобно мат­рице трансляции, для двумерного объекта однородная матрица вращения реду­цируется до размера 3×3.

Однородные матрицы вращения вокруг осей у и z получаются аналогичным об­разом и записываются так:

(2.4)

(2.5)

Мы получили матрицы преобразования, описывающие поворот вокруг мировых осей координат. Можно показать, что поворот вокруг любой произвольной оси раскладывается на повороты вокруг осей х, у и z. Таким образом, матрица преоб­разования для произвольной оси получается перемножением матриц (2.3)-(2.5).

Как уже отмечалось, матрицы преобразования, описываемые в этом разделе, обычно вычисляются соответствующими подпрограммами графических библио­тек.

2.7.3. Отображение

Отображение состоит в вычислении координат точки в некоторой систе­ме координат по известным координатам той же точки в другой системе координат. Рассмотрим две системы координат (рис. 2.15). Предположим, что координаты (X2, Y2, Z2)точки Р в системе координат x2y2z2 должны быть вычислены по коор­динатам (X1, Y1, Z1) той же точки в системе x1y1z1. Далее, предположим, что вы­числение производится применением матрицы преобразования Т1-2 к известным координатам:

[Х2 Y2 Z2 1]Т = T1-2[Х1 Y1 Z1 1]T. (2.6)

Рис. 2.15. Отображение из одной системы координат в другую

Записав матрицу T1-2 в явном виде, мы получим из формулы (2.6) следующее выражение:

(2.7)

Чтобы найти неизвестные в уравнении (2.7), подставим в него конкретные зна­чения X1 = 0, Y1 = 0 и Z1 = 0, в результате чего получим:

Х2 = px, Y2 = py, Z2 = pz. (2.8)

Можно сказать, что px, py и pz определяют координаты начала отсчета системы x1y1z1 в системе координат x2y2z2.

Теперь подставим в уравнение (2.7) значения X1 = 1, Y1 = 0 и Z1 = 0 и получим:

Х2 = nx + px , Y2 = ny + py , Z2 = nz + pz. (2.9)

Вычитая формулы (2.8) из (2.9), можно заключить, что nx, ny, nz - компонен­ты x2 , y2 и z2 единичного вектора, направленного вдоль оси x1 системы коорди­нат x1y1z1. Следовательно, коэффициенты nx, ny, nz легко вычислить с учетом взаимной ориентации систем координат.

Аналогичным образом, ox, oy, oz представляют собой компоненты x2 , y2 и z2 еди­ничного вектора оси y1 а компоненты ax, ay, az - вектора оси z1.

2.7.4. Другие матрицы преобразования

Помимо матриц преобразования, рассмотренных в предыдущих разделах, часто используются матрицы масштабирования и зеркального отображения. Для масштабирования объекта с коэффициентом sx по оси х, sy по оси у, sz по оси z применяется следующая матрица преобразования:

(2.10)

Для двумерных объектов матрица масштабирования редуцируется до разме­ра 3×3, как это было с матрицами трансляции и поворота. Эффекта масштабиро­вания можно достичь, изменив размеры видового экрана или окна, не меняя зна­чений координат.

Матрица преобразования (2.10) используется при масштабировании объекта от­носительно начала координат. Часто бывает необходимо масштабировать объект относительно одной из его точек Р с координатами (Хр, Yp, Zp). В этом случае сначала к точке Р применяется преобразование трансляции Trans(-Xp, -Yp, -Zp), которое перемещает эту точку в начало координат, затем применяется матрица масштабирования из (2.10), после чего объект возвращается в исходное положе­ние действием Trans(Xp, Yp, Zp).

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

(2.11)

Матрицы преобразования для других отражений (относительно плоскостей хz и yz) выводятся аналогичным образом.

2.8. Удаление невидимых линий и поверхностей

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

Рис. 2.16. Изображение до и после удаления невидимых линий

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

Метод Z-буфера основан на том же принципе, что и алгоритм сортировки по глубине: на любом участке экрана оказывается проекция элемента, расположенного ближе всех прочих к наблюдателю. Здесь под элементами понимаются точки, кривые или поверхности. Данный метод требует использования области памяти, называемой Z-буфером. В этом буфере для каждого пиксела хранится значение координаты Zυ того элемента, проекция которого изображается данным пиксе­лом. Как уже говорилось, значение Zυ (то есть координата z в наблюдательской системе) есть мера удаленности объекта от наблюдателя. Объем Z-буфера определяется количеством пикселов, для каждого из которых требуется сохранить вещественное число.

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

Сначала проецируется произвольно выбранная поверхность, и в ячейки памяти Z-буфера, соответствующие пикселам проекции поверхности, записываются значения координат Zυ точек поверхности, являющихся прообразами данных пикселов. Пикселы окрашиваются в цвет первой поверхности. Затем проецируется следующая поверхность, и все неокрашенные пикселы, относящиеся к ее проек­ции, окрашиваются в цвет второй поверхности. Если пикселы уже были окраше­ны, соответствующие им значения Zυ сравниваются со значениями Zυ точек текущей поверхности. Если сохраненное значение Zυ какого-то пиксела оказывается больше текущего (то есть точка на предыдущей поверхности ближе к наблюдате­лю, чем точка на текущей поверхности), цвет пиксела не меняется. В противном случае пиксел окрашивается в цвет текущей поверхности. Изначально Z-буфер инициализируется координатами Zυ соответствующими дальней плоскости (рис. 2.10), поэтому пикселы проекции первой поверхности автоматически окрашиваются в ее цвет. Повторяя эту процедуру для всех имеющихся плоско­стей, мы окрасим все пикселы экрана в цвета ближайших поверхностей (рис. 2.17).

Рис. 2.17. Основы метода z-буфера

Как следует из предшествующего описания, метод Z-буфера предназначен главным образом для удаления скрытых поверхностей. Однако метод Z-буфера с небольшими изменениями позволяет реализовать и построение рисунков со скрытыми линиями. Сначала все поверхности проецируются на экран, причем пикселы окрашиваются в цвет фона (на экране ничего не появляется). При этом Z-буфер заполняется правильными значениями Zυ. Затем на экран проецируются ребра поверхностей. При этом значения Zυ ре­бер сравниваются со значениями Zυ ближайших к наблюдателю поверхностей, уже найденными на предыдущем этапе. Окрашиваются только те пикселы, для которых новые значения Zυ больше исходных. Таким образом, участки ребер, скрытые поверхностями, на экране не появляются. Эта процедура дает правиль­ный рисунок без скрытых линий, но некоторые граничные линии могут оказаться слишком тонкими, потому что некоторые пикселы этих линий будут относиться к поверхностям, ограниченным соответствующими ребрами. Эту проблему легко решить, пододвинув весь объект поближе в момент проецирования ребер.

2.9. Визуализация

Изображения без невидимых линий и поверхностей в большинстве случаев пе­редают форму объекта достаточно хорошо. Однако для некоторых приложений желательно иметь возможность строить более реалистичные изображения. Осо­бенно важную роль реалистичность играет в «виртуальной реальности» - отно­сительно новой технологии, позволяющей имитировать на компьютере реальные ситуации. Например, вы можете занести в компьютер сведения о внутреннем и внешнем виде проектируемого здания, а затем пройтись по нему и вокруг него, чтобы прочувствовать, как оно будет выглядеть на самом деле. Это средство мо­жет оказаться очень полезным для принятия решения о вложении денег в по­стройку здания.

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

2.9.1. Затушевывание

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

Поверхность объекта может быть освещена светом, исходящим непосредственно от источников, то есть прямым светом, а также светом, отра­женным от других поверхностей, дающим окружающее освещение. Свет, отраженный данной точкой объекта, получается сложением отра­женных лучей двух типов (рис. 2.18).

Рис. 2.18. Прямое и окружающее освещение

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

Ra = KdIa. (2.12)

Здесь Ia - интенсивность окружающего освещения, a. Kd - коэффициент отраже­ния поверхности. У белых поверхностей коэффициент отражения близок к еди­нице, а у черных - к нулю. Наблюдатель будет воспринимать одну и ту же ин­тенсивность отраженного окружающего освещения вне зависимости от своего положения, поскольку это освещение образуется благодаря отражению от всех поверхностей и распределяется равномерно по всем направлениям.

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

Диффузное отражение состоит в том, что поверхность погло­щает свет, а затем переизлучает его равномерно во всех направлениях (рис. 2.19, а). Интенсивность диффузного отражения (как и отражения окружающего освеще­ния) не зависит от положения наблюдателя. Особенности структуры поверхности, такие как текстура и цвет, становятся видимыми именно благодаря диффузному отражению. Для грубых поверхностей отражение является преимущественно диффузным, а не зеркальным.

Зеркальное отражение - это прямое отражение света поверхностью. Данный тип отражения характерен для блестящих поверхностей, таких как зеркала. Блестящие поверхности отражают почти весь падающий свет и потому обладают повышенной яркостью (рис. 2.19, б). Интенсивность зеркального отражения воспринимается по-разному в зависимости от положения наблюдате­ля относительно сцены.

а б

Рис. 2.19. Диффузное и зеркальное отражение

Опишем процедуру расчета интенсивностей диффузного и зеркального отраже­ния. Когда мы сделаем это, интенсивность отражения света от точечного источ­ника можно будет приближенно описать как сумму отражений указанных двух типов. Интенсивность диффузного отражения прямо пропорциональна косину­су угла падения. Углом падения в данной точке называется угол между вектором нормали к поверхности и вектором, направленным из точки к источнику света (рис. 2.20).

Рис. 2.20. Определение угла падения

Это соотношение называется законом косинусов Ламберта. Его легко проверить, представив падающий пучок в виде конечного числа параллельных линий, нахо­дящихся на одинаковом расстоянии друг от друга (рис. 2.21). Обратите внима­ние, что количество лучей, падающих на поверхность, уменьшается с ее наклоном. Отсюда следует, что интенсивность отраженного света с наклоном поверхности также будет падать.

Рис. 2.21. Иллюстрация к закону Ламберта

Математически закон косинусов Ламберта может быть выражен так. Интенсивность падающего света в интересующей нас точке Iр считается обратно пропорциональной квадрату расстояния до источника света DI поэтому для источника интенсивностью Ер она запишется так:

Iр = Ер /(DI)2. (2.13)

Обычно предполагается, что все источники света установлены достаточно дале­ко от поверхностей, так что DI может считаться одинаковым для всех точек. Тогда закон Ламберта запишется независимо от DI :

Rd =Kd·Ер·cos(N, L). (2.14)

где Rd - интенсивность диффузного отражения, Kd - коэффициент отраже­ния, N - единичный вектор нормали к поверхности в инте­ресующей нас точке, L - единичный вектор, направленный от точки к источни­ку света. Вектор L постоянен для всех точек, поскольку источник считается расположенным достаточно далеко.

Используя формулу (2.14), можно столкнуться со следующей проблемой: две параллельные плоскости, частично перекрывающиеся на экране, будут казаться наблюдателю неразличимыми. Лучше, если бы плоскость, расположенная бли­же, казалась более яркой, то есть имела большее значение Rd. Такого эффекта можно достичь, изменив формулу (2.14):

Rd =Kd·Ер·cos(N, L)/(D+D0). (2.15)

Здесь D - расстояние между интересующей нас точкой и точкой зрения наблю­дателя, а постоянная D0 позволяет избежать деления на нуль.

Теперь займемся расчетом интенсивности зеркального отражения. Было сделано множество попыток точно промоделировать зеркальное отражение. Мы рассмот­рим одну типичную модель, которая носит название модели Фонга. Большая часть отраженного света попадает в небольшой конический объем во­круг оси, угол которой совпадает с углом падения, но находится по другую сто­рону от нормали к поверхности (рис. 2.22). Эта ось на рисунке обозначена еди­ничным вектором R. Интенсивность воспринимаемого наблюдателем света будет спадать по мере удаления вектора зрения (единичный вектор V на рис. 2.22) от вектора R. Фонг предложил следующую формулу для описания этого эффекта:

Rd =Ks·Ер·cos(V, R)n /(D+D0). (2.16)

где Кs - константа, аналогичная Kd в формуле (2.15). Кs называется коэффициентом зеркального отражения. Формулу (2.16) можно интерпретировать так: интенсивность света, воспринимаемого наблюдателем, вектор зрения которого отклоняется от оси R на угол φ, пропорциональна (cosφ)n. Таким образом, интенсивность отражения быстро спадает с удалением от угла отражения, если n много больше единицы, то есть отраженный свет распространяется плотным пучком вдоль оси R. Поэто­му у блестящих поверхностей, например металлических, значение n должно быть большим. Например, для такой поверхности хорошо взять значение n порядка 150. Тусклая поверхность, например бумага или ткань, характеризуется значением n, близким к единице.

Рис. 2.22. Векторы, используемые в модели Фонга

Теперь мы можем получить интенсивность отражения в данной точке, сложив выражения (2.12), (2.15) и (2.16):

I=Kd·Id + Ер·[Kd·cos(N,L) + Ks·cos(V,R)n]/ (D+D0). (2.17)

Чтобы учесть цвет отраженного света, достаточно записать выражение (2.17) отдельно для каждого из основных цветов: красного, синего и зеленого. Таким образом, интенсивность отраженного света раскладывается на интенсивность красного (Ir), зеленого (Ig) и синего (Ib). Источники света также описываются в трех цветах: Iar, Iag, Iab для окружающего освещения и Ерr, Epg, Epb для прямого освеще­ния. Коэффициент отражения поверхности тоже записывается отдельно для ка­ждого цвета: Kdr, Kdg и Kdb. Например, поверхность красного цвета будет иметь значение Kdr=1, Kdg=0, Kdb=0. Тогда выражение (2.17) можно разложить на три равенства (приведено одно для красного цвета):

Ir=Kdr·Idr+Ерr·[Kdr·cos(N,L)+Ks·cos(V,R)n]/ (D+D0) (2.18)

Обратите внимание, что коэффициент зеркального отражения не раскладывается на отдельные цвета. Дело в том, что зеркальное отражение практически не влияет на цвет. Интенсивности, определяемые уравнениями (2.18), используются для задания интенсивностей электронных пушек на цветных мониторах стандарта RGB.

Мы выяснили, как рассчитывается цвет и интенсивность отраженного света для одной точки объекта. Однако если нам нужно затушеванное изображение объекта, выражения (2.18) необходимо вычислить для всех точек объекта. Очевидно, что эта задача требует огромных вычислительных затрат для своего решения. Одним из способов сократить вычисления является представление поверхностей в виде наборов треугольных граней. В этом случае вектор нормали для каждой грани приходится вычислять только один раз. Кроме того, векторы L, R и V в пределах каждой грани могут считаться постоянными, если предполагается, что источники света и наблюдатель находятся далеко от объекта. Это предположение широко используется для упрощения вычислений. В итоге выражение (2.18) приходится вычислять только один раз для каждой грани. Упрощая вычисления, мы, однако, теряем плавность перехода между соседними треуголь­ными гранями.

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

2.9.2. Трассировка лучей

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

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

Рис.2.23. Трассировка лучей

2.10. Графический интерфейс пользователя

Как отмечалось ранее, важной особенностью существующих программ CAD/ САМ/САЕ является взаимодействие с пользователем посредством графического ввода и графического вывода. Другими словами, программное обеспечение должно иметь возможность открывать окна (области взаимодействия) для отображения меню или значков, а также сопоставлять пунктам меню и значкам какие-либо функции. Программное обеспечение, предоставляющее такие возможности, называется графическим интерфейсом пользователя (graphical user interface - GUI). Программист может построить самодельный графический интерфейс на базе конкретной графической библиотеки. Этот интерфейс будет обладать недостатком, связанным с невозможностью перенести его на рабочие станции, не поддерживающие использованную графическую библиотеку. Поэтому интерфейс придется переписывать заново для каждой новой графической рабочей станции.

Чтобы избежать этой проблемы, программисты строят графический интерфейс на базе системы X-window, которая в настоящее время поддерживается большинством графических рабочих станций. Два типичных интерфейса пользователя, основанных на X-window, называются Open Look и OSF/Motif. Open Look поддерживался кор­порацией Sun Microsystems, a OSF/Motif - всеми прочими производителями, включая IBM, Hewlett-Packard, DEC и Tektronix.

Программист, пишущий приложение с использованием Open Look или OSF/ Motif, может обращаться к функциям диспетчера окон для выполнения таких операций, как открытие окон, построение меню и выполнение задач, вызы­ваемых пунктами меню. Open Look и Motif хороши для разработки приложений по той причине, что они основаны на системе X-window, достоинствами которой являются:

  • приложение, выполняемое на одной рабочей станции, может осуществлять ввод-вывод через окно, открытое на другой рабочей станции;

  • на одной рабочей станции может быть открыто несколько окон, через которые пользователь имеет возможность работать с вычислительными ресурсами разных машин;

  • приложение, написанное для системы X-window, не зависит от операционной системы и типа рабочей станции.

На персональных компьютерах, работающих под управлением Windows, аналогичные возможности предоставляются набором базовых классов Microsoft (Microsoft Foundation Classes - MFC).