Разработка программы восстановления каркасных 3D объектов по 2D проекциям Никаноров А.А.
Никаноров Александр Андреевич / Nikanorov Aleksandr Andreevich - факультет бизнес-информатики, отделение программной инженерии, студент Национальный исследовательский университет «Высшая школа экономики», г. Москва
Аннотация: объектом разработки является программа восстановления каркасных 3D объектов по 2D проекциям. Цель работы - разработка приложения, которое получает на вход три ортогональные 2D проекции объекта и создает трехмерную каркасную модель на выходе. В ходе работы проводились анализы существующих подходов к восстановлению 3D объектов: метода отображения границ и конструктивной сплошной геометрии. Также были проанализированы некоторые алгоритмы восстановления трехмерных моделей. В результате работы была разработана программа, позволяющая загрузить три файла ортогональных проекций в одном из основных форматов хранения изображений САПР DXF и восстанавливающая трехмерную псевдокаркасную модель объекта. Пользователь может взаимодействовать с полученной моделью (вращать, масштабировать). Кроме того, пользователь может интерактивно удалять ребра для того чтобы получить необходимую ему каркасную модель. От своих аналогов программа отличается простотой в использовании и поддержкой операционной системой OS X. Программа может применяться при изучении инженерной и компьютерной графики. В дальнейшем планируется добавить в программу возможность восстановления solid объектов из 2D проекций.
Ключевые слова: каркасная модель, псевдокаркасная модель, восстановление псевдокаркасной модели, восстановление каркасной модели, восстановление каркасных 3d объектов по 2d проекциям.
Keywords: wireframe model, model wireframe recovery, restoration of 3d frame objects to 2d projections.
Определения, обозначения и сокращения:
САПР - система автоматизированного проектирования;
Псевдокаркасная модель - модель, включающая в себя дополнительные ребра, которые принадлежат проекции, но могут не принадлежать итоговому объекту;
CSG - constructive solid geometry, конструктивная сплошная геометрия - один из подходов к восстановлению 3D объектов по проекциям;
Face - лицевая поверхность - грань, относящаяся к некоторому ребру;
Ребро - сторона грани.
Восстановление 3D моделей по их 2D проекциям является важным объектом исследования уже долгое время. В основном свое применение эта область исследования нашла в инжгнерном деле. До того, как построить некоторую деталь, создаются ее различные чертежи и проекции. Для того чтобы получить более широкое представление о том, что получится в итоге, создается 3D модель, даже если этот процесс занимает значительное количество времени.
Наибольший прорыв в области восстановления 3D моделей совершили Wesley и Markowsky в своих работах [8, 11], предложив использовать каркасную модель как промежуточный шаг процесса восстановления. На сегодняшний день они являются одними из самых известных исследователей в этой области, а их подход используется при разработке практически любого нового алгоритма восстановления 3D моделей.
Процесс восстановления, который включает в себя взаимодействие пользователя с системой, чаще всего занимает значительное количество времени, вследствие чего разрабатываются различные алгоритмы для автоматического восстановления 3D моделей. Эти алгоритмы могут быть разделены на два типа в зависимости от существующих подходов. На данных момент существует два основных похода к восстановлению 3D моделей: метод отображения границ и метод конструктивной сплошной геометрии. Метод отображения границ состоит в работе с линиями (ребрами) и вершинами, в свою очередь метод конструктивной сплошной геометрии основан на работе с геометрическими примитивами, такими как куб или шар.
Можно выделить две основные стадии восстановления 3D объектов по проекциям: создание псевдокаркасной модели объекта (pseudo-wireframe) и создание объекта (solid). Псевдокаркасная модель состоит из набора вершин и ребер, соединяющих эти вершины. Она может содержать лишнюю, но в то же время более полную информацию об описываемом объекте. В отличие от каркасной модели, она может включать в себя «лишние» ребра, которые принадлежат описывающим ее проекциям (рис. 1) Одна псевдокаркасная модель может описывать большое количество 3D объектов (рис .2).
Рис. 1. Три проекции октаэдра
Рис.2. (a) -Псевдокаркасная модель октаэдра, (b, c, d) - возможные solid объекты, этой модели
При анализе существующих приложений, предоставляющих возможность работы с 3D моделями, было выделено несколько самых популярных решений: Autodesk 3DS Max, Autodesk Autocad, Kompas-3D, Matlab, Blender (табл. 1).
Сравнительная таблица существующих решений
Windows OS X Необходимость специальных знаний Восстановление каркасной модели Автоматическое выполнение функции Лицензия
Приложения
3DS Max + - + + + +
Autocad + + + + - +
Kompas-3D + - + - - +
Blender + - + - - -
Matlab + + + + - +
Основным недостатком всех перечисленных систем за исключением последней является их платное распространение. Кроме этого Kompas-3D и Blender не имеют функционала восстановления 3D моделей из 2D проекций.
Autocad широко используется в сфере инженерного проектирования, однако реализованная в этой программе система восстановления 3 D моделей из проекций основана на взаимодействии пользователя с системой.
3DS Max является практически самой распространенной и широко используемой системой для работы с трехмерной графикой. Программа предоставляет возможность восстанавливать 3D модель по проекциям, однако имеет довольно сложный интерфейс, а также работает только в операционной системе Windows.
Matlab - кроссплатформенный пакет программ, который, как и Autocad широко используется в сфере инженерного проектирования. Кроме этого Matlab является высокоуровневым интерпретируемым языком программирования, поэтому для работы необходимы соответствующие знания языка.
Таким образом, очевидна актуальность разработки свободно распространяемой программы восстановления каркасных 3D объектов по трем 2D проекциям для операционной системы OS X, которая была бы доступна для работы пользователю без специальной подготовки. Выбор операционной системы обуславливается тем, что из перечисленных приложений ее поддерживают только Autocad, Blender и Matlab. А эти приложения либо не предоставляют необходимой функциональности, либо требуют дополнительных знаний для работы с ними, либо не распространяются свободно.
Целью данной работы является разработка программы восстановления каркасных 3D объектов, состоящих из многогранников, по 2D ортогональным проекциям для операционной системы OS X.
Для достижения цели работы необходимо решить следующие задачи:
1.Изучить существующие форматы представления инженерных чертежей;
2.Рассмотреть основные подходы в восстановлении 3D объектов по 2D проекциям;
3.Изучить существующие алгоритмы восстановления трехмерной модели по трем двухмерным ортогональным проекциям;
4.Разработать программу, принимающую на вход три 2D проекции (вид сверху, вид спереди, вид сбоку) в одном из базовых CAD форматов (DXF) и восстанавливающую корректную каркасную 3D модель заданного объекта на выходе.
5.Протестировать работу приложения при помощи известных примеров.
Обзор существующих подходов и программных решений. Существующие подходы, метод отображения границ
Одни из первых исследований в области восстановления 3D моделей по проекциям были проведены профессором Masanori Idesawa в 1973 году и были представлены в его работе «A system to generate a solid figure from three views» [6,7]. Idesawa предложил способы восстановления трехмерных вершин, ребер и лицевых поверхностей для многогранных объектов. Кроме того, так как некоторый набор вершин и ребер (каркасная модель) может описывать несколько объектов, он предложи способ, как удалять «призрачные» ребра для того чтобы в итоге получать уникальный объект.
Это был один из первых подходов к восстановлению 3D объектов. Впоследствии алгоритмы, в которых происходит работа с ребрами, получили общее название Boundary representation (Метод отображения границ). Модели в методе отображения границ создаются при помощи топологии и геометрических объектов. Основными топологическими единицами являются: faces (лицевые грани, или поверхности), edges (ребра) и vertices(вершины). Face - это ограниченная часть поверхности, относящаяся в некоторому ребру, ребро - сторона грани. В 1980 году George Markowky, профессор университета Мэна, и Michael A. Wesley из исследовательского института IBM Томаса Уотсона в своей работе "Fleshing out Wireframes" [8,11] предложили использовать псевдокаркасную модель как промежуточную стадию процесса восстановления 3D объекта. Эта работа до сих пор является основополагающей для разработки новых алгоритмов в рамках метода отображения границ.
Конструктивная сплошная геометрия
Первые исследования в рамках второго подхода к восстановлению 3D объектов по 2D проекциям были произведены Aldefel в 1983 году [1]. Его алгоритм работает только для объектов равномерной толщины. Подход носит название Конструктивная сплошная геометрия (Constructive solid geometry | CSG), и его основной концепцией является возможность математического описания любых сложных объектов при помощи более простых. Простейшими телами в CSG являются примитивы - тела простой формы, такие как куб, сфера, цилиндр, призма. Более сложные объекты создаются при помощи применения булевых операций (объединение, пересечение, разность) к некоторому набору примитивов.
Как конструктивная сплошная геометрия, так и метод отображения границ используются для создания итоговых 3D объектов. Как правило, восстановление псевдокаркасной модели является этапом работы алгоритмов обоих подходов. Однако задачей работы является восстановления каркасных моделей из 2D проекций. Основной вклад в разработку алгоритма восстановления каркасной модели внесли Markowsky и Wesley. При разработке последующих алгоритмов именно их подход всегда используется при восстановлении каркасных моделей объектов. Поэтому именно этот алгоритм был выбран для разработки приложения.
Описание используемых алгоритмов.
Извлечение 2D ортографической информации
Каркасная модель W (О) объекта О строится по фронтальной проекции (FV - front
view), боковой проекции - виду справа (SV - side view) и верхней проекции - вид сверху (TV - top view), которые подаются на вход программе в формате систем автоматизированного проектирования (САПР) DXF. Файл каждой проекции необходимо проанализировать и
загрузить информацию о хранящихся в нем геометрических компонентах - вершинах и
где X 1,Уг \,2и - координаты вершины - начала ребра, X 2,У 2,ги - координаты вершины - конца ребра, где / = 1,2... п,
п - количество ребер в проекции.
Каждое ребро задается координатами двух вершин, координаты одной вершины могут встречаться в описании несколько раз по количеству сходящих в ней ребер.
Для того чтобы уменьшить количество параметров, определяющих ребра, каждая вершина отмечается порядковым номером. Номера вершин будут описывать ребра вместо координат этих вершин. Кроме того, сами ребра также отмечаются порядковыми номерами.
ребрах - в матрицы Е1 (О), Т1 (О) и 81 (О):
х1,1 у1,1 Х1,2 У1,2
Уц *1,1 У1,2 ^1,2
И (о) =
Разметка 2Б граней и вершин
Таким образом для каждой проекции создаются матрицы
ЕЕ ( О), ТЕ ( О), 8Е ( О) для хранения информации о вершинах и ребрах соответственно:
т1 х У1 X ЕУ(0)= : : : :
X Ук ч
где ПУ{ - порядковый номер /-ой вершины,
X,У,,X - координаты /-ой вершины, / =1,2,.. ,,к к - количество вершин проекции.
ее.
ЕЕ (О ) =
ее.
п
где ее - объект типа «ребро», / = 1,2,.. ,,п п - количество ребер проекции.
Каждый объект типа «ребро» содержит4 следующую информацию:
ее =[ пе та т1Л егг ]
где пе - порядковый номер ребра,
пу 1 - порядковый номер вершины, определяющей начало ребра, ПУ. 2 - порядковый номер вершины, определяющей конец ребра,
е^ - тип ребра,
i = 1,2,...,п,
п - количество ребер проекции.
Таким образом матрица вершин содержит порядковые номера вершин проекции и их координаты, а матрица ребер - порядковые номера ребер и порядковые номера вершин, определяющих эти ребра. Тип ребер предлагается запоминать для обработки пунктирных линий1 на проекции, которые обычно используются для обозначения ребер, находящихся не на лицевых гранях проекции.
Координаты вершин проекций могут значительно отличаться, поэтому для упрощения работы с ними предлагается сдвинуть каждую проекцию таким образом, чтобы она находилась в первом квадранте и хотя бы одна точка лежала на оси X и хотя бы одна точка лежала на оси У. Для этого необходимо найти минимальную координату ХтЫ и
минимальную координату у . вершин в каждой проекции. После этого необходимо выполнить следующую операцию для матриц каждой проекции:
У^[1,2]еFV(0)| {у[/,2]= {у[/,2]-^ ,
[/,3]еFV(0)| {у[/,3]= {у[/,3]-ут1П ,
где ^[/,2] - элемент ьой строки и второго столбца матрицы FV (О),
IV[/",3] - элемент /'-ой строки и третьего столбца матрицы FV (О).
Впоследствии ребра проекции будут сравниваться с ребрами каркасной модели. Так как одно ребро проекции может описывать большое количество ребер в каркасной модели, ребра проекции должны быть максимальной длины, а не множеством коротких отрезков, лежащих на одной прямой.
Рис. 3. Вид сбоку
Например, на рисунке 3 представлена проекция некоторого объекта. В конечной матрице проекции не должно существовать несколько ребер, лежащих на одной прямой и
1 В системе Autocad линии, которые в своем названии имеют подстроку "DASHED".
пересекающихся в вершинах, таких как Ьс, cd и fg, gc. Если они были обнаружены, то оба ребра, лежащие на одной прямой, удаляются из 8У (О), и добавляются ребра bd и £с соответственно.
Объединение граней и вершин
Для последующей работы с данными о проекциях необходимо создать две новых матрицы ЯТУ (О ) = ЯУ ( О) и Я8У ( О ) = 8У (О ) для верхней и боковой проекции соответственно. После этого нужно выполнить следующие операции над новыми матрицами:
УПу [/,3]е ЯТУ (О)[/,4] е ЯТУ (О) | «V[/,4] = rtv[/,3], «V[/,3] = 0, Угбу[1,2] е Я8У (О) ,rsv[/, 4] е Я8У (О) | rsv[/, 4] = ^[/, 2], rsv [/, 2] = 0,
где йу[/,3] - элемент /-ой строки и третьего столбца матрицы КТУ (О) (координата у), йу[/,4] - элемент /-ой строки и четвертого столбца матрицы КТУ (О) (координата ъ), г8у[/',2] - элемент /-ой строки и второго столбца матрицы Н8У (О) (координата х),
г8у[/',4] - элемент /-ой 4строки и четвертого столбца матрицы ЯТУ (О) (координата ъ).
Предполагается, что проекции, полученные в начале работы программы из файлов, созданы в едином масштабе. Для упрощения работы с каркасной моделью необходимо
перенести данные о проекциях из матриц вершин ЕУ ( О), ЯТУ ( О), Я8У (О) в общую матрицу вершин У (О) и из матриц ребер ЕЕ (О), ТЕ (О), 8Е (О) в матрицу ребер
Е ( О ) .
Данные о проекциях расположены в У (О) и Е (О) последовательно, поэтому теперь
легко можно провести перпендикуляры из всех вершин: по ъ для фронтальной проекции, по у вверх для верхней проекции и по х вправо для боковой проекции, - и добавить новые
вершины в У (О), а новые ребра в Е (О) .
На этом этапе работы алгоритма часть ребер никак не связана между собой, а также существуют повторяющиеся ребра, поэтому нужно удалить повторяющиеся вершины из
У (О) и заменить порядковые номера этих вершин в Е (О) на соответствующие не удаленные. Кроме того, нужно удалить повторяющиеся ребра из Е (О) .
Нахождение точек пересечения ребер
Перпендикуляры, проведенные на предыдущем шаге все еще никак между собой не связны, поэтому необходимо найти точки их пересечения. Заранее не известно, какие именно ребра пересекаются; для каждого ребра проверяются все остальные, еще не проверенные ребра, на предмет их пересечения. В этой проверке можно выделить четыре случая: ребра параллельны / находятся на одной прямой / скрещиваются (лежат в параллельных плоскостях) / пересекаются. Проверку нужно провести только на нахождение ребер на одной прямой и на пересечение.
Определение нахождения ребер на одной прямой
Уравнение прямой, проходящей через две точки, в трехмерном пространстве выглядит следующим образом:
х - X = У - У1 _ г - г! Х2 - Х1 У2 - У1 г2 - г1 где X, У\, г - координаты первой точки, Х2, У2, г2 - координаты второй точки.
Так как проверяемые ребра (восстановленные перпендикуляры) параллельны хотя бы одной оси координат, в этой формуле будет происходить деление на ноль, во избежание этого нужно воспользоваться правилом пропорции:
(Х - Х1 ) * (У 2 - У1 ) * (г2 - г1 ) = (У - У1 ) *( Х2 - Х1 ) *( г2 - г1 ) = (г - г1 ) * (У 2 - У1 ) *( Х2 - Х1 ) (2)
Допустим, сравнивается ребро АВ и ребро СБ, если подставить в (2) вместо X, У\, г
координаты вершины А, вместо Х2, У2, г2 координаты вершины В, а вместо X, У, г
поочередно координаты вершин С и Б, и оба выражения будут выполняться, то ребра лежат на одной прямой.
В этом случае ребра могут не пересекаются. Если же ребра аЬ и cd пересекаются могут возникнуть пять ситуаций:
- ребра пересекаются в одной из существующих вершин (рис. 4);
Рис. 4
- ребра совпадают, в этом случае второе ребро удаляется из Е (О) ;
- одна из вершин одного ребра находится на другом ребре, к примеру вершины ребер аЬ и cd расположены в следующем порядке: а с Ь d, в этом случае ребра аЬ и cd удаляются из Е (О)
, а новые ребра ас, сЬ и bd добавляются в матрицу (рис. 5);
Рис. 5
- одно ребро находится внутри другого, но вершины не совпадают, в этом случае меньшее ребро удаляется из Е (О) . Например на рис. 6 нужно удалить ребро аЬ;
с а Ь й
о-е-е-о
Рис. 6
- одно ребро находится внутри другого, и одна из вершин ребра аЬ совпадает с одной из вершин ребра с4 к примеру если а = с и вершины расположены в порядке: а=с, 4 Ь (рис. 7),
ребро аЬ удаляется из Е (О), а новое ребро ^ добавляется в матрицу.
Рис. 7
Определение пересечения ребер
Две прямые АВ и СБ:
х~х _ У~ У _ х-х3 _ у-у3 _ 2-2.
м -
х3 -х1 У3 -У1 23 -21
х2 -х1 У2 -У1 22 -21
х4 -х3 У4 -у3 24 -23
Х2 Х1 У 2 У1 22 21 Х4 Х3 У 4 Уз 24 23
проходящие через точки х1з у1з 21 , х2, у2, 22 и х3, у3, 23 , х4, у4, 24 соответственно, пересекаются, если выполняется условие:
= 0,
и если ранг этой матрицы равен двум. Иными словами, для прямых АВ и СБ нужно найти такие коэффициенты и и V, что система из трех уравнений (3) имеет решение:
х + и * (х2 -хг) = хз + V * (х4 -х3)
у1 + и * ( У2- У1 ) = у3 + v * ( У4- У3 ) (3)
21 + и * (22 -21 ) = 23 + V * (2 4 -23 )
Определитель матрицы 3х3 считается по формуле (4):
= а, *
*23 * «32 «12 * «21 * «32 Т «12 * «23 * «31 Т «13 * «21 * «32 -а13* «22* «31 (4).
Ранг матрицы равен количеству ненулевых строк в матрице ступенчатого вида. Для того чтобы привести матрицу к ступенчатому виду можно воспользоваться методом Гаусса, для этого введем элементарные преобразования матрицы:
1.Перестановка двух столбцов или строк матрицы;
2.Умножение элементов одной строки или столбца на одно и то же число, отличное от нуля;
а11 «12 «13
Д = «21 «22 «23
«31 «32 «33
«11 * «22 * «33 - «11 *
«22 «23 -« * «12 «21 «23 Т« * Т «13 «21 «22
«32 «33 «31 «33 «31 «32
3.Прибавление к элементами одной строки или столбца соответствующих элементов другой строки или столбца, умноженных на одно и то же число.
Для того чтобы привести матрицу к ступенчатому виду методом Гаусса необходимо выполнить следующие шаги:
1.Выбрать в первом столбце элемент, отличный от нуля (ведущий элемент). Если строка с ведущим элементов (ведущая строка) не первая, переставить ее на место первой строки (преобразование I типа). Если в первом столбце нет ведущего элемента, то продолжить поиск в оставшейся части матрицы. Нужно закончить преобразования если исключены все столбцы.
2.Разделить все элементы ведущей строки на ведущий элемент. Если строка последняя, то преобразования заканчиваются.
3.К каждой строке ниже ведущей строки прибавить ведущую строку, умноженное на такое число, что все элементы ниже ведущего элемента становятся равны нулю.
4.Исключив ведущую строку и ведущий столбец, перейти к пункту 1 для оставшейся части матрицы.
Если определитель равен нулю и ранг матрицы равен двум, систему уравнений (2) можно решить при помощи формул Крамера [12]. Для решения системы из трех уравнений с двумя неизвестными достаточно двух уравнений, поэтому решение, использующее первое и второе уравнение будет иметь вид:
и =
V =
Хз Х1 хз - Х4 /Б
Уз - У1 Уз - У 4
Х2 - Х1 хз Х1 /Б
У2 - У1 Уз - У1
Х2 - Х1 хз - Х4
У2 - У1 Уз - У4
В =
Если плоскость, в которой находятся пересекающиеся ребра, перпендикулярна плоскости ХУ, то Б будет равен нулю. Аналогично плоскость пересечения может быть перпендикулярна плоскостям Х2 и У2. Поэтому для нахождения точки пересечения выбираем пару уравнений, где Б не равен нулю. Таким образом, решение для первого и третьего уравнений:
и =
V =
В =
хз - Х1 хз - Х4
2з - 21 2з - 2 4
Х2 - Х1 хз Х1
22 - 21 2з - 21
Х2 - Х1 хз - Х4
22 - 21 2з - 2 4
ш
/Б
Решение для второго и третьего уравнений:
•Уз - У1 Уз - У 4
и =
/Б
2 - 21
V =
В =
У2 - У1 Уз - У1
22 - 21 2з - 21
У2 - У1 Уз - У4
22 - 21 2з 24
/Б
В случае пересечения ребер возможны четыре случая:
- Прямые, определенные вершинами ребер пересекаются, но сами ребра не пересекаются;
- Ребра пересекаются в одной из их вершин. Если ребро аЬ пересекает cd в точке а (рис. 8), то cd удаляется из Е (О), а новые ребра са и ad добавляются в список;
Рис. 8
- Ребра пересекаются в новой вершине. Если ребро аЬ пересекает cd в некоторой точке т (рис. 9), аЬ и cd удаляются из Е (О), а новые ребра ат, тЬ, ст, md добавляются в список;
Рис. 9
Ребра пересекаются двумя вершинами (рис. 10).
Рис. 10
Таким образом в каркасную модель добавлены все ребра, ортогональные ко всем трем проекциям. Следующим шагом является добавление ребер, не ортогональных ни к одной проекции.
Создание не ортогональных ребер
Для того чтобы создать все возможные ребра не ортогональные ни к одной плоскости
проекции, необходимо спроецировать вершины V (О) на каждую из плоскостей ХУ, Х2 и
У2. Под проецированием понимается приравнивание к нулю одной из координат трехмерной вершины, Таким образом при проецировании на плоскость ХУ координата ъ приравнивается к нулю, при проецировании на Х2 координата у приравнивается к нулю, при проецировании на У2 координата х приравнивается к нулю.
После этого для каждой вершины каркасной модели перебираются вершины
соответствующей проекции (FV(О) для ХУ, XV (О) для Х2, SV(О) для У2). Для
каждой /-ой вершины проекции выделяются координаты вершин, соответствующие плоскости, на которую модель спроецирована, которые соединяются ребрами с /-ой вершиной (соседних вершин). В каркасной модели создаются ребра, соединяющие /-ую вершину и все вершины с выделенными двухмерными координатами.
На рисунке 11 приведен пример проекций некоторого объекта (а,Ь,с) и результат, который был достигнут на момент выполнения шага 2.4.2.
(Л
Рис.11. (а) - фронтальная проекция, (Ь) - вид сверху, (с) - вид сбоку, (ф - текущая каркасная модель
На текущем этапе алгоритма необходимо восстановить ребра БЬ и СО. Из модели видно, что для этого необходимо спроецировать модель на плоскость У2 (боковая проекция). В этом случае координаты у и ъ каждой вершины сравниваются с соответствующими
координатами матрицы RSV (О). К примеру вершина С по этим координатам равна
вершине Б проекции. Для вершины Б находятся все вершины, которые соединяются ребрами с Б. На проекции это вершины Е, N М. После этого в каркасной модели находятся все вершины, чьи координаты у и ъ (в данном случае) равны координатам у и ъ вершин Е, N или
M. Из проверяемой вершины C проводятся все возможные ребра к найденным вершинам, если таких ребер еще не существует. Таким образом в каркасную модель добавятся ребра CA, CE, Ж, CM, Ш, га, CN (рис. 12).
BCD
А
1 / / \\ 1 \
V \
HQN
Рис. 12
Таким образом, необходимое ребро CO, которое не ортогональной ни одной проекции, было добавлено в список ребер. Все остальные ребра, скорее всего, не принадлежат всем проекциям и будут удалены на следующем шаге алгоритма. Такие операции производятся для каждой вершины модели, а также для каждой проекции.
Удаление лишних ребер
На данном этапе выполнения алгоритма в псевдокаркасной модели существует большое количество ребер, не принадлежащих проекциям. Для того чтобы их удалить, необходимо
спроецировать вершины V (О) на каждую из плоскостей XY, XZ и YZ и сравнить ребра
Е(О ) с FE (О), TE (О) и SE (О) соответственно. Если спроецированное ребро модели
совпадает с одним из ребер соответствующей проекции, но не выходит за его пределы, оно остается в списке, в противном случае - удаляется.
В дополнение к алгоритму построения псевдокаркасной модели объекта по трем 2D проекциям, предложенному Markowsky и Wesley [11], в работе предлагается алгоритм обработки пунктирных линий, который можно использовать для несимметричных относительно центра проекций.
Изначально предполагается что объект, чья псевдокаркасная модель создается в ходе алгоритма, симметричен относительно центра, поскольку известны только три его проекции. На предыдущем шаге могли быть созданы ребра, которые принадлежат проекциям, но в итоговую каркасную модель не входят.
Рассмотрим возможность восстановления каркасных моделей несимметричных объектов. Предположим, что фигура симметрична только относительно двух плоскостей XY и YZ. Для
каждого пунктирного ребра проекции создается список ребер из Е (О), которые совпадают
с пунктирным ребром. Если удалять ребра на ближайшей и дальней гранях каждой плоскости, то может возникнуть ситуация, при которой на дальней грани удалятся нужные ребра. Поэтому предлагается для фронтальной проекции из получившихся списков удалять ребро с наименьшей координатой z. Для боковой проекции удалять ребро с наибольшей координатой x. Для верхней проекции удалять ребро с наибольшей координатой y.
Таким образом, из трех двумерных проекций в результате работы алгоритма получается псевдокаркасная модель с допущением, что на дальних гранях объекта могут сформироваться ребра, принадлежащие проекциям, но, возможно, не принадлежащие объекту. Пользователю предоставляется возможность интерактивного удаления лишних ребер.
Разработка программы.
Формат DXF
DXFTM - открытый формат файлов для обмена данными между приложениями систем автоматизированного проектирования (САПР). Был создан для Autocad фирмой Autodesk и поддерживается практически всеми системами САПР на платформе PC. Наряду с форматом DWG является одним из самых распространенных форматов файлов для обмена графической информацией, однако DWG является закрытым форматом, тогда как для DXF Autodesk предоставляется бесплатную спецификацию [3]. DXF формат содержит все информацию об изображении в виде маркированных данных. Это означает что различные данные обозначаются целыми числами.
Формат DXF состоит из семи следующих разделов:
HEADER - содержит основную информацию о чертеже. К примеру, здесь может храниться название программы, в которой был создал файл, версия программы, максимальные и минимальные координаты в чертеже.
CLASSES - содержит информацию об объявленных в приложении экземплярах классов, которые используются в разделах BLOCKS, ENTITIES и OBJECTS.
TABLES - хранит массивы данных, такие как таблица слоев, таблица стилей, таблица типов линий.
BLOCKS - хранит данные о примитивах2, объединенных в блоки. Блок имеет уникальный идентификатор и название и может использоваться в разделе ENTITIES.
ENTITIES - хранит данные о примитивах.
OBJECTS - содержит данные о не графических объектах, которые используются в приложениях, написанных на AutoLISP и ObjectARX.
THUMBNAILIMAGE - хранит изображение того, что находится на чертеже.
Формат входных данных
Входные данные представлены в виде файлов трех проекций: вид спереди, вид сверху, вид сбоку - в формате DXF. Программе необходимо знать, какой проекцией является каждый из файлов, поэтому проекции должны иметь название «FV.dxf» или «fv.dxf», «TV.dxf» или «tv.dxf", «SV.dxf» или «sv.dxf» соответственно. Проекции должны быть описаны линиями. Важно отметить, что линии, находящиеся за пределами грани проекции должны быть обязательно описаны при помощи линии типа пунктир (рис. 13).
2 Геометрческие фигуры такие как точка, линия, окружность, дуга и т. д.
Рис. 13. Проекции буквы «Т». (a) -вид сверху, (b) -вид спереди, (с) -вид сбоку
Программа распознает пунктирные линии, которые имеют подстроку «DASHED» в своем названии. Все остальные типы линий распознаются как обычные.
Выходные данные
В результате работы программы формируется каркасная 3D модель объекта, описанного тремя проекциями, полученными на входе в программу (рис. 14).
Рис 14. Результат работы программы. (а) - вид сверху, (Ь) - вид спереди, (с) - вид сбоку, (¡) -получившаяся псевдокаркасная модель
Так как итогом работы описанного алгоритма является псевдокаркасная модель, пользователь может сам выбрать и удалить лишние по его мнению ребра. В связи с этим реализованы функции «Отменить» и «Повторить» при помощи класса «NSШdoManager».
Выбор средств разработки
В работе предлагается разработать приложение, работающее под операционной системой OS X. Ввиду этого в качестве языка разработки выбран объектно-ориентированный язык Objective C и среда разработки Xcode. Для работы с файлами формата DXF выбран фреймворк DXFReader [10]. При анализе файла он возвращает массив примитивов, содержащихся в файле, и их данных. Для вывода проекций и каркасной модели на экран используются методы фреймворка «^ш^^ге».
Диаграмма классов
Views
' FrontView 4 , <NSVisw> r SideView 1 L <NSView> , ' TopView 1 , <NSView> ^
' ShowView t <NSView> ,
Eiitltlies
' AA2DEdge jcNSCbjecb^
' Model ' ,<NSGbjecl>,
' AA3DPoim ' .cNSObjecfe,
' Dashed Line1 <NSObjecb>
Operations
Vertices
L <NSObjecl> j
' Edges ' b<NSOb)ect> J
Г AAMaih
L <NSObjecl> .
' Document 4
' Wireframe ' ^ <NSDbjeor> J
Рис. 15. Диаграмма классов разрабатываемого приложения восстановления каркасных объектов по 2Б проекциям
Основным классом программы является «Document», в нем создается объект класса «Wireframe» и вызывается метод «wire», в котором происходит создание каркасной модели. Кроме того, в «Document» происходит обработка работы пользовательского интерфейса. Все данные о проекциях и каркасной модели хранятся в экземпляре класса «Model». Классы группы «Views» являются классами, обрабатывающими вывод на экран проекций и самой каркасной модели. «Viewl» выводит фронтальную проекцию, «View2» выводит верхнюю проекцию, «View3» выводит боковую проекцию, «ShowView» обрабатывает, выводит на экран каркасной модели при помощи методов, которые будут описаны в следующем разделе. Класса группы «Operations» содержат классовые методы для работы с вершинами (класс «Vertices») и ребрами (класс «Edges»), а также некоторые математические операции (класс «AAMath»).
Вывод на экран каркасной модели
При описании фигуры для вывода ее на экран используется матрица вершин А размером [п, 4].
У\ -1 1
А ='
г 1
n s n n
x y
_ n J n
где xi, y., z. - координаты x, y, z /-ой вершины.
n - количество вершин.
Четвертый элемент строки является однородной координатой ^ и для однозначности принимается k=1. В ходе преобразований этот элемент изменяется и корректируется. Таким
образом в однородных координатах каждая вершина X, У,, представляется в виде
(кх1, ку,, к,, к,),
где кх1 =Хг * ^ ,
куг =Уг * к1 , к, * к,.
Для того чтобы в ходе преобразований получить реальные координаты, необходимо делить каждую строку матрицы А на четвертый элемент этой строки.
В программе реализованы такие преобразования трехмерной машинной графики как:
- Повороты вокруг осей координат;
- Масштабирование по осям;
- Сдвиг вдоль осей координат.
Для выполнения соответствующего преобразования необходимо умножить матрицу А матрицу соответствующего преобразования.
Поворот вокруг оси Ox на угол и представлен матрицей :
Я,
0
008(и)
0 0 8Ш (и) 0
-8Ш (и) 008(и) 0
0 0 0 1 Поворот вокруг оси Oy на угол и представлен матрицей Я
008 (и) 0 -8т (и) 0
0 1 0 0
8Ш (и) 0 008 (и) 0
0 0 0 1
к, =
Масштабирование по осям представлено матрицей К :
а 0 0 0
к. = 0 а 0 0 0 0 а 0
^0 0 0 1 где d - коэффициент масштабирования. Сдвиг вдоль осей координат представлен матрицей
1 0 0 0
0 1 0 0
0 0 1 0
ах ау а2 1
Я
где dx - коэффициент сдвига по оси Ox, dy - коэффициент сдвига по оси Oy, dz - коэффициент сдвига по оси Oz.
Стоит отметить, что после процесса восстановления фигура находится полностью в первом квадранте плоскости XZ (рис. 16).
Рис.16. Пример результата работы программы до вывода на экран
Для удобства работы с фигуры необходимо сдвинуть ее центр в начало координат, для этого нужно умножить матрицу А на матрицу Я ,
где ^ = (Хтах¥у(о) - ХшШУ(0) ) / 2 ,
^ = (Утах¥У(0) - УтШУ(0) ) ^ 2 ,
dz = (ХтахЩо) - Хт1пЩ0) ) ^ 2 .
На экран выводят только координаты x и у матрицы А. Так как в NSView центр координат находится в левой нижней точке окна, при выводе на экран для нормального отображения фигуры к каждой координате x прибавляется переменннная drawX„ а к каждой координате у прибавляется переменная drawY. Изначально drawX равен половине ширины окна "ShowView", а drawY равен половине высоты окна "ShowView". Эти значения изменяются при изменении положения центра координат.
Заключение
В работе были решены следующие задачи:
- Изучены существующие форматы представления инженерных чертежей;
- Изучены существующие алгоритмы восстановления трехмерной каркасной модели по трем двухмерным ортогональным проекциям;
- Предложен алгоритм удаления лишних ребер на описанных проекциями лицевых поверхностях, обозначенных на проекциях пунктирными линиями;
- Разработано приложение, принимающее на вход три 2D проекции (вид сверху, вид спереди, вид сбоку) формата DXF и восстанавливающее корректную каркасную 3D модель заданного объекта на выходе.
Результатом работы является программа восстановления каркасных 3D объектов из 2D проекций для операционной системы OS X. В программе реализовано автоматическое создание псевдокаркасной модели, необходимую каркасную модель пользователь может получить при помощи удаления ненужных по его мнению ребер в полученной псевдокаркасной модели.
В дальнейшем планируется изучить алгоритмы восстановления solid объектов из 2D проекций и добавить этот функционал в программу. Также возможно изучение процесса восстановления трехмерных объектов по набору фотографий.
Литература
1. Aldefeld B. (1983). On automatic recognition of 3D structures from 2D representations. Computer Aided Design, 15(2), 59-72.
2. Q igek, A. & Gulesin, M. (2004). Reconstruction of 3D models from 2D orthographic views using solid extrusion and revolution. Journal of Materials Processing technology, 152, 291-298.
3. DXF Format [DXF - DXF Reference]. (n.d.). Retrieved February 10, 2014, from http://www.autodesk.com/techpubs/autocad/acad2000/dxf/dxf_format.htm
4. FurferiR., Governi L., Palai, M., & Volpe, Y. (2011). 3D Model Retrieval from mechanical drawings analysis. International Journal of mechanics, 5(2), 91-99.
5. Governi, L. & Furferi, R. & Palai, M. & Volpe, Y. (2013). 3D geometry reconstruction from orthographic views: A method based on 3D image processing and data flitting. Computers in industry, 64, 1290-1300.
6. IdesawaM. (1973). A system to generate a solid figure from three views. Bull JSME, 16, 216-225.
7. Lee H., Han S. (2005). Reconstruction of 3D interacting solids of revolution from 2D orthographic views. Computer-Aided Design, 37, 1388-1398.
8. Markowsky G., Wesley, M. (1980). Fleshing out wireframes. IBM Journal of Research and Development, 24 (5), 582-597.
9. Shum, S. S. P., Lau, W. S., Yuen, M. M. F., & Yu, K. M. (1997). Solid reconstruction from orthographic opaque views using incremental extrusion. Computer Graphics, 26(6), 787-800.
10. SourceForge.net: DXFReader - Project Web Hosting - Open Source Software. (2009, February 22). Retrieved January 10, 2014, from http://dxfreader.sourceforge.net
11. Wesley, M.A., Markowsky G. (1981). Fleshing out projections, IBM Journal of Research and Development, 25 (6), 934-954.
12. Мальцев А. И. Основы линейной алгебры. Изд. 3-е, перераб., М.: «Наука», 1970. 400 c.