Скачать 0.62 Mb.
|
Заключение В данной работе был реализован алгоритм построения трехмерного объекта, представленного набором треугольников, на основе пересечения двух других объектов. Реализовано несколько вспомогательных алгоритмов, таких как: определение факта принадлежности точки полигону, попадание точки внутрь объекта, несколько функций для работы с нормалями, учитывая обход вершин по часовой стрелке, функции импорта и экспорта из 3ds-формата. Рассмотрена работа с библиотеками классов. Разработана библиотека классов на основе полученных ранее функций и классов. Разработан плагин для 3D Studio Max, позволяющий использовать алгоритм построения объекта, полученного в результате пересечения двух других объектов. Список литературы
Приложение А. Руководство пользователя 3D Studio Max Загрузка плагина. Работоспособность плагина в среде 3D Studio Max младше версии 5.0 не гарантируется. Для того, чтобы 3D Studio Max распознал плагин и загрузил в систему, необходимо:
![]() Рисунок А. Окно Plug-in Manager
Работа с плагином Форма плагина содержит 3 группы кнопок (см. Рисунок Б): группы Object1 и Object2 предназначены для выбора двух объектов. В группе Calculate result object содержится кнопка Calculate and output, при нажатии на которой выполнится функция построения третьего объекта на основе двух предыдущих и результат будет отображен в окнах 3D вида. Для каждого объекта предусмотрена функция, при помощи которой можно определить положение точки относительно объекта. Для данной задачи ее можно применять для определения направления нормалей (объекты должны быть замкнутыми и нормали должны смотреть не вовнутрь объекта, а наружу). Для того, чтобы использовать данную функцию, нужно выбрать точку, делается это с помощью кнопки Pick point (по умолчанию точка имеет координаты (0, 0, 0)) и проверить результат, нажав на кнопку Obj has point. Слева выведется результат операции: true или false ![]() Рисунок Б. Панель управления Если функция определения положения точки относительно объекта дала отрицательный результат (визуально видно, что точка находится внутри/снаружи объекта, а функция вернула false/true), то необходимо для дальнейших корректных вычислений развернуть нормали для треугольников объекта. Делается это нажатием на кнопке Invert normals для соответствующего объекта. Приложение Б. Руководство прикладного программиста Файл динамически подключаемой библиотеки имеет название graphics3d.dll. Экспортируемыми функциями библиотеки являются: bool WriteObject3ds(const char *path, object_3d *obj); Позволяет записать объект obj в файл формата *.3ds. path указывает путь к файлу, включая его название. Если такого файла не существует, то он будет создан object_3d* JoinObjects(object_3d* obj1, object_3d* obj2); На основе двух пересекающихся трехмерных объектов, которые передаются как параметры функции, строит результирующий объект и возвращает указатель на него. object_3d* ReadObject3ds(const char* path); Позволяет считать объект из *.3ds файла, путь к которому передается в переменной path Для использования этих функций во внешнем приложении необходимо прописать и заполнить при необходимости структуры (интерфейс библиотеки): typedef struct point_type { double x, y, z; }point_3d; typedef struct object_type { vector vertexes; //все вершины объекта vector } object_3d; Приложение В. Руководство разработчика В гарницах данной работы реализованы два продукта, позволяющих работать с операцией объединения двух трехмерных объектов: динамическая библиотека (файл graphics3d.dll) и плагин для 3D Studio Max 8.0 (файл JoinObkect.dlu). Динамическая библиотека разработана в среде Visual C++, для разработки плагина использовался 3D Studio Max SDK. В ходе работы разработаны следующие классы: POIN3D – позволяет работать с трехмерной точкой. LINE3D – позволяет работать с трехмерной прямой. Содержит такие функции как:
LUCH3D – позволяет работать с лучом в трехмерном пространстве. Луч представляет собой точку начала и направление. Специфичных функций не содержит, используется как вспомогательный класс OBJECT3D – позволяет работать с трехмерным объектом. Содержит такие функции как:
POLI3D – позволяет работать с полигоном в трехмерном пространстве. Содержит такие функции как:
TRIANGLE3D – позволяет работать с треугольником в трехмерном пространстве. Содержит такие функции как:
VECTOR3D – позволяет работать с вектором в трехмерном пространстве. Содержит такие функции как:
FORMAT3DS – позволяет работать с форматом *.3ds-файлов. Содержит такие функции как:
Приложение Г. Пример файла в формате 3ds в двоичном виде Пирамида с четырехугольным основанием в формате 3ds ![]() Приложение Д. Прототипы функций экспорта данных в dll и работа с интерфейсами object_3d* ModificationObject1(OBJECT3D &other); //эта функция не //экспортируется OBJECT3D ModificationObject2(object_3d *other); //эта функция не //экспортируется extern "C" //Тут экспортируемые функции { _declspec (dllexport) bool WriteObject3ds(const char *path, object_3d *obj); _declspec(dllexport) object_3d* JoinObjects(object_3d* obj1, object_3d* obj2); _declspec(dllexport) object_3d* ReadObject3ds(const char* part); } object_3d* ModificationObject1(OBJECT3D &other); OBJECT3D ModificationObject2(object_3d *other); Приложение Е. Пример импорта функций из dll внешним приложением HINSTANCE hinstLib = LoadLibrary("graphics3d.dll"); if (hinstLib == NULL) { printf("ERROR: unable to load DLL\n"); getchar(); } //получаем функцию JoinnObjects typedef object_3d* (*JoinObjects)(object_3d *, object_3d *); JoinObjects JoinObj; JoinObj = (JoinObjects)::GetProcAddress (hinstLib, "JoinObjects"); //получаем функцию ReadObject3ds typedef object_3d* (*ReadObject3ds)(const char*); ReadObject3ds ReadObj; ReadObj = (ReadObject3ds)::GetProcAddress(hinstLib, "ReadObject3ds"); object1 = new object_3d; object2 = new object_3d; object1 = ReadObj("object1.3ds"); object2 = ReadObj("object2.3ds"); object3 = new object_3d; object3 = JoinObj (object1, object2); //а теперь запишем в 3ds файл object3 bool res; //тут будет результат записи в файл typedef bool (*WriteObject3ds)(const char *, object_3d *); WriteObject3ds WriteObj; WriteObj = (WriteObject3ds)::GetProcAddress(hinstLib, "WriteObject3ds"); res = WriteObj("ResObj.3ds", object3); //в файле "ResObj.3ds" будет //лежать результирующий объект cout << "\nWriteObject3ds: " << res; |
![]() | Минобрнауки томский государственный университет факультет информатики утверждаю Цель курса – закрепление теоретических знаний по теоретическим и математическим основам информатики, навыков создания и анализа программных... | ![]() | Минобрнауки томский государственный университет факультет информатики утверждаю Цель курса – изучение математических основ и алгоритмов представления и обработки изображений |
![]() | Минобрнауки томский государственный университет факультет информатики утверждаю Цель курса – формирование основ знаний по теории информации, принципам кодирования, изучение важнейших алгоритмов в этой области | ![]() | «Российский экономический университет им. Г. В. Плеханова» Факультет информатики Кафедра информатики БД. Рассматриваются экономические и технологические характеристики процессов в информационных системах |
![]() | «Томский государственный университет систем управления и радиоэлектроники» Кафедра экономики А. Г. Буймов – Министерство образования и науки Российской Федерации, Федеральное государственное бюджетное образовательное учреждение... | ![]() | Российской Федерации Томский государственный университет Философский факультет Кафедра политологии Молодежные политические объединения как политтехнологии –22 |
![]() | Геофизический факультет кафедра информатики и гис Министерство образования и науки РФ российский государственный геологоразведочный университет имени серго орджоникидзе | ![]() | Российской Федерации Томский государственный университет Исторический факультет Кафедра истории и документоведения Специальность 032001 – Документоведение и документационное обеспечение управления |
![]() | Минобрнауки томский государственный университет факультет информатики утверждаю Требования к уровню освоения дисциплины – владение методами математического анализа | ![]() | Минобрнауки томский государственный университет факультет информатики утверждаю Цель курса – изучение методов объектно-ориентированного анализа и проектирования |