Не отобразилась форма расчета стоимости? Переходи по ссылке

Не отобразилась форма расчета стоимости? Переходи по ссылке

Дипломная работа на тему «Приложение для демонстрации интерактивных 3D презентаций»

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

Написание диплома за 10 дней

Оглавление

Введение

. Обзор существующих решений

1.1 3D тур по Санкт-Петербургскому горному университету

.2 Панорама Boeing-747. Оренбургские авиалинии

.3 Интерактивная 3D презентация гостиницы «Галакт»

.4 Сравнение аналогов

2. Анализ средств разработки

. Постановка задачи

. Разработка приложения

4.1 Проектирование

.2 Архитектура приложения

.3 Разработка кода

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Подробнее

4.3.1 Настройка подгружаемых ресурсов

4.3.2 Покадровый рендеринг графики и шаблон наблюдатель

.3.3 Создание сцены, камеры и порта просмотра

.3.4 Загрузка и установка заданных ресурсов

.3.5 Выделение моделей на сцене, управление камерой

.3.6 Сохранение состояния программы

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

.4.1 Интерфейс главного экрана

.4.2 Меню настроек

.5 Тестирование

5. Разработка руководства пользователя

Заключение

Список используемой литературы

Приложение
Введение

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Заказать диплом

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

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

Цель дипломной работы — разработка универсальной системы визуализации. Для достижения поставленной цели необходимо решить следующие задачи:

.        Исследовать существующие системы визуализации

.        Исследовать подходящие библиотеки для разработки 3D сцены

.        Реализовать возможность загрузки и отображения множества объектов на сцене

.        Реализовать и протестировать систему визуализации

В работе отражена разработка приложения, которая интерактивно предоставляет слушателю информацию о выбранных в ходе презентации объектах.

1. Обзор существующих решений

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

Существуют системы визуализации нескольких видов:

·        системы, использующие технологии панорамной сферической съёмки;

·        системы, использующие рендеринг трехмерной графики

Для сравнительного анализа были выбраны три системы-аналога. Далее рассмотрим их особенности.
1.1    3D тур по Санкт-Петербургскому горному университету

Данная система позволяет детально увидеть Петербургский университет изнутри при помощи технологии панорамной сферической съёмки [5]. Это камеры, снимающие видео на 360 градусов. Из полученных записей составляются виртуальные панорамы в соответствии с рисунком 1.

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Подробнее

Виртуальные панорамы предназначены для показа на компьютере с помощью специального программного обеспечения, позволяющего зрителю «крутить головой», глядя на разные части пространства, окружающего фотографа при съёмке. В основе сферической фотографии лежит собранное из множества отдельных кадров изображение в сферической проекции. Фрагменты таких фотографий склеиваются и далее, при помощи Flash-технологий, разрабатывается виртуальный 3D тур.

Рисунок 1 — Пример панорамной системы визуализации
1.2    Панорама Boeing-747. Оренбургские авиалинии

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

Рисунок 2 — Пример панорамной визуализации
1.3    Интерактивная 3D презентация гостиницы «Галакт»

Для представления информации презентация использует рендеринг трёхмерной графики в соответствии с рисунком 3. Интерактивная связь с пользователем осуществляется при помощи мыши. Пользователь свободно перемещается по виртуальному миру, взаимодействуя с различными объектами, которые предоставляют информацию о себе при взаимодействии [7].

Рисунок 3 — Пример системы визуализации с применением рендера
1.4    Сравнение аналогов

Схожесть рассмотренных систем заключается в детальном представлении сцены с различных состояний панорамной или виртуальной камеры.

Различаются системы:

·        наличием интерактивной связи с пользователем

·        видом представления информации

В отличие от 3D тура, интерактивная презентация способна выполнять следующие задачи:

·        подгрузка собственных ресурсов

·        реализация интерактивной связи

·        меньшая нагрузка на CPU

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Заказать диплом

Так как в проекте предусматривается интерактивная связь с пользователем и внедрение анимации, чтобы обратная связь выглядела ещё более информативно, интерактивная презентация рассматривается в качестве основного аналога.

2. Анализ средств разработки

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

Существует множество библиотек, которые отличаются своей сложностью, направленностью, архитектурой построения. Одними из самых распространённых являются Ogre 3D, UnrealEngine и OpenSceneGraph.(Object-Oriented Graphics Rendering Engine) — объектно-ориентированный графический движок с открытым исходным кодом, написанный на C++. Автором OGRE является Стив Стриитинг (англ. Steve Streeting). интерфейс рендеринг программный

Ogre 3D является графическим движком для рендеринга трехмерной графики. Большую популярность движок получил за счет своей гибкости, что позволяет интегрировать его со многими другими библиотеками (физика — ODE, Newton, PhysX, Bullet; звук, сеть, графический интерфейс и т. д.).

Для реализации графического интерфейса пользователя (англ. GUI — Graphical User Interface) могут применяться как стандартные функции графического интерфейса OGRE, так и импортироваться сторонние библиотеки (OpenGUI, MyGUI).

Ogre 3D обладает следующими возможностями: поддержка платформ Windows, Linux и Mac OS X, Android, iOS; скриптовая система управления материалами (мультитекстурирование, мультипроходное смешивание); экспортеры для основных коммерческих и свободных пакетов 3D моделирования; система управления ресурсами; поддержка Direct3D, OpenGL; сложная скелетная анимация (анимация тела), анимация гибких форм, морфинг (анимация лица), анимация пути (камера, перемещение) [1].- игровой движок, написанный на языке С++, разрабатываемый и поддерживаемый компанией EpicGames. Он позволяет создавать игры для большинства операционных систем и платформ, а также для различных портативных устройств. Например, для устройств Apple (iPad, iPhone), управляемых системой iOS. Впервые работа с iOS была представлена в 2009 году. В 2010 году продемонстрирована работа движка на устройстве с системой webOS.

Для упрощения портирования движок использует модульную систему зависимых компонентов, а также поддерживает различные системы рендеринга: Direct3D, OpenGL, S3, PowerVR; воспроизведения звука: EAX, OpenAL, DirectSound3D; средства голосового воспроизведения текста, распознавание речи, модули для работы с сетью и поддержки различных устройств ввода[3].

OpenSceneGraph — это открытое программное обеспечение для разработки высокопроизводительных 3D приложений, используемое разработчиками для компьютерных игр, программ виртуальной реальности, компьютерного моделирования.

Инструментарий написан на C++ с использованием библиотек OpenGL. OpenSceneGraph поддерживает большинство популярных операционных систем: Windows, Mac OS X, Linux, IRIX, Solaris и FreeBSD.

В особенности библиотеки входит: полнофункциональная поддержка промышленной графической сцены; поддержка большого количества 2D изображений и 3D форматов, благодаря 34 импортеров из таких индустриальных форматов как OpenFlight, TerraPage, OBJ, 3DS, JPEG, PNG и GeoTIFF; система частиц; поддержка кадрового буфера, пиксельного буфера и буфера рендеринга в текстуры; поддержка библиотек, позволяющих внешне воздействовать на приложение, выполнять запросы на получение и передачу данных и оперировать всеми классами в графической сцене[2].

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

·        Открытый исходный код — возможность использовать готовый исходный код движка для просмотра, редактирования, изучения.

·        Поддержка операционных систем — возможность запуска готового приложения под определённой платформой.

·        Поддержка различных 3D API — возможность интегрировать интерфейсы программирования приложений.

·        Распространённость — широкая область применения в разработке 3D приложений.

·        Коммерция — возможность коммерческой реализации готового продукта.

·        Community — доступность документации для изучения.

Соответствие рассматриваемых движков выбранным критериями представлено в таблице 1.

Таблица 1 — Критерии выбора 3D библиотеки для разработки

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Подробнее

 

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

Используется версия библиотеки Ogre SDK 1.81 — наиболее стабильная версия движка.

Исходя из того, что библиотека Ogre3D написана на языке С++, языком разработки приложения является С++. Наиболее удобной средой разработки под С++ является Visual Studio. Так как выбранная версия библиотеки успешно компилируется на компиляторе версии Visual Studio 2010, используется компилятор версии 100 под обёрткой Visual Studio 2012.

Далее необходимо выбрать стороннюю графическую библиотеку для удобства разработки graphical user interface (GUI). Наиболее распространённой и практичной библиотекой, которая работает с Ogre3D, является CEGUI (Crazy Eddie’s GUI). Используется версия CEGUI 0.79, так как она успешно интегрируется с выбранной версией движка.

Для разработки 3D моделей и их анимаций используется Blender 3D, так как Ogre имеет ресурс для экспорта (blender2ogre) 3D моделей с дальнейшей возможностью использования в движке. Исходя из совместимости экспортёра с версией Blender 0.79, используется данная версия.

В итоге, для разработки используются следующие средства:

·        Ogre SDK 1.81

·        Visual Studio 2012 (С++)

·        CEGUI 0.79

·        Blender 3D version 2.66

·        Blender2ogre 0.6 (export)

3. Постановка задачи

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

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

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Заказать диплом

Презентацию можно представить с элементами видео или картинок, но больше информации можно донести при помощи 3D сцены. Информация, донесенная 3D сценой, будет более полной и детальной, что позволит в трёхмерном представлении обратить внимание аудитории на ключевые моменты в презентации.

В целях реализации приложения используется движок для рендера трёхмерной графики Ogre3D, использующий 3D сцену в качестве интерактивной связи с пользователем.

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

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

Таким образом, при разработке приложения нужно учитывать производительность слабых процессоров. В этих целях после завершения разработки, необходимо провести тестирование приложения на предмет производительности на различных операционных системах и различных видах процессоров.

4. Разработка приложения

Процесс разработки является ключевым и включает в себя несколько взаимосвязанных этапов:

·        Проектирование — на данном этапе анализируются и подробно описываются задачи для дальнейшей разработки, удовлетворяющие целям проекта.

·        Разработка — написание кода, удовлетворяющего требованиям проектной документации, реализованной на этапе проектирования.

·        Тестирование — процесс исследования приложения на предмет обнаружения ошибок и их своевременное исправление.

После отладки в процессе тестирования приложение будет готово к эксплуатации и сопровождению.

Также требуется реализовать руководство пользователя для обеспечения возможности самостоятельного освоения и применения программы.
4.1 Проектирование

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

Разработка разделена на несколько этапов:

.        Разработка программной логики представления 3D моделей на сцене

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Подробнее

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

Рисунок 4 — Схема базового функционала приложения

После остановки камеры, запускается анимация 3D модели, одновременно с запуском анимации рядом выводится информация о 3D модели, где информационный текст зависит от проигрывающейся анимации.

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

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

Популярными библиотеками являются TinyXML и RapidXML — оба являются синтаксическими анализаторами файла. Первый минимален и легко интегрируется в различные программы, а второй наиболее быстрый и содержит большое количество функций. В итоге, для работы с xml файлом потребуется минимальное количество функций. Так как сохранять данные требуется только при выходе и при нажатии кнопки, то быстродействием можно пренебречь, поэтому выбрана библиотека TinyXML.

Разработка 3D моделей

При создании трехмерных моделей в целях использования в движке для рендера, требуются знания особенностей их моделирования. Движки используют различную топологию в 3D моделях: многоугольные полигоны, треугольные полигоны и другие. Ogre3D использует треугольные полигоны.

Важным аспектом при разработке 3D модели является количество полигонов, которые она содержит. Каждый полигон требует от графического процессора время на расчёты и на рендер этого полигона, поэтому стоит моделировать таким образом, чтобы количество полигонов было минимальным. Однако модель может получиться угловатой и потребуется дополнительное сглаживание. При использовании сглаживания увеличивается количество полигонов в топологии модели, поэтому рекомендуется использовать две или три группы сглаживания.

Для нашего проекта требуется реализовать интерьер в виде комнаты, в котором будут располагаться будущие 3D модели. Интерьер не требует большого количества полигонов, поэтому стоит реализовать его с цельной сеткой, так как цельный меш, имеющий большое количество полигонов, меньше нагружает сцену, чем раздельные меши.

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

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

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

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

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Подробнее

Чтобы была возможность расставить подгруженные модели в комнате, нужно реализовать меню манипулирования моделями в пространстве.

Так как выбранная графическая библиотека не поддерживает кириллическую кодировку по умолчанию, требуется реализовать декодер для русского алфавита.

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

Тестирование

В целях отладки программного кода и выявления ошибок требуется провести тестирование на двух этапах разработки:

·        Первый этап тестирования — после реализации базового функционала сцены

·        Второй этап тестирования состоит из нескольких тест-кейсов:

o   тестирование производительности

o   проверка эргономичности (юзабилити-тестирование)

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

Рисунок 5 — Диаграмма классов приложения

Из диаграммы видно, что реализовано несколько классов, ключевым из которых является менеджер сцены, в котором происходит настройка всех параметров сцены. Также в отдельные классы вынесен графический интерфейс, загрузка текстов и прочие настройки.   .2 Архитектура приложения

D сцена в библиотеке Ogre 3D имеет древовидную структуру, корневым элементом которой является главный узел сцены (RootSceneNode). Каждый узел сцены может иметь своих потомков (SceneNode). Таким образом, все сцены привязаны к главному узлу сцены.

К нескольким потомкам главного узла сцены необходимо привязать сцену в виде комнаты, в которой будут закреплены определённые 3D модели.

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Цена диплома

Приложение универсально в использовании, так как самостоятельно подгружает заданные пользователем параметры для каждой из комнат (3D модель и её описание) и отображает их на сцене. Таким образом, пользователь может менять параметры для различных комнат.

Архитектура приложения, в соответствии с рисунком 6, состоит из следующих классов:

Менеджер сцены — ключевой класс, отвечающий за рендер сцены, настройки расположения 3D моделей на сцене и анимации 3D моделей.

Входные данные — класс, который отвечает за считывание входных данных пользователя: обработка клика мышки для определения попадания луча (экземпляр класса Ray) на 3D модель, обработка клавиатуры.

Менеджер текстов — класс, в котором хранятся все тексты приложения. Также в нём реализована подгрузка текста с описанием 3D модели из файла.

Менеджер настроек — класс, отвечающий за конфигурацию приложения, подгрузку ресурсов приложения и за настройку сторонней графической библиотеки.

Графический интерфейс — отвечает за настройку графического интерфейса пользователя, а также за графические эффекты.

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

Рисунок 6 — Архитектура приложения

При разработке архитектуры приложения используются следующие шаблоны проектирования:

Faсade — применяется для абстрагирования классов графического интерфейса, менеджера настроек, менеджера сцены, входных данных.

Singleton — для обеспечения глобального доступа к экземплярам классов менеджера текстов, менеджера сцены, менеджера камеры.

Listener — для обеспечения взаимодействия классов. Реализуется интерфейс с помощью которого шаблон получает оповещения от классов входных данных и графического интерфейса [4].   .3 Разработка кода

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

Для корректного отображения элементов на 3D сцене необходимо настроить следующие компоненты:

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Подробнее

·        ресурсы

·        камера

·        сцена

·        покадровый рендеринг графики

·        конфигурация (подгрузка плагинов и ресурсов)

·        наблюдатели (Observed)   .3.1 Настройка подгружаемых ресурсов

Подгружаемые ресурсы передаются в Ogre из конфигурационного файла, в котором указаны пути к файлам, нужные в целях рендера. Как правило, это конфигурационный файл ресурсов, включающий в себя шрифты, 3D модели, файлы партиклов и так далее.

FileSystem=../../media/fonts=../../media/models=../../media/particle

А также конфигурационный файл плагинов, включающий в себя плагины графических библиотек DirectX, OpenGL, плагин партикловых эффектов и так далее.

Plugin=RenderSystem_Direct3D9_d=RenderSystem_GL_d=Plugin_ParticleFX_d

Таким образом, нужно указать приложению, какие файлы требуется подгружать на старте программы. Создаётся экземпляр класса Root, являющийся корневым классом и представляет собой отправную точку клиентского приложения, с помощью которого можно получить доступ к основам системы, а именно системам рендеринга, управлению конфигурациями, логированию и другим классам системы [10]. Также создаётся два экземпляра для работы с конфигурационными файлами плагинов и ресурсов, загружаемые при помощи функции load, которой передаются соответствующие названия файлов, загружает данные файлы.

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

В начале создаётся функция FrameListener, отвечающая за прослушивание каждого кадра на экране рендера. FrameListener основан на паттерне наблюдателя (Observed). В функции создаётся список параметров для OIS (объектно-ориентированная система ввода), затем нужно получить от OGRE хэндл окна (дескриптор в виде числа, с помощью которого идентифицируется ресурс), в котором в текущий момент происходит рендеринг графики. Далее в систему ввода передаётся хэндл окна рендера и описываются функции обратного вызова (callback) для настройки считывания действий пользователя с мыши и клавиатуры. В завершение этой функции добавляется наблюдатель на текущее окно, на случай, если нужно обработать, например, изменение размера экрана рендера, то есть разворачивание окна.

Параллельно для рендера создаётся функция-слушатель frameRenderingQueued, которая принимает единственный параметр FrameEvent (кадр — единичное изображение экрана), таким образом, функция способна обрабатывать каждый кадр окна, поэтому здесь фиксируются нажатия клавиатуры и мыши.

Пример обработки клавиши ESC.

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Цена диплома

if (Keyboard->isKeyDown(OIS::KC_ESCAPE))

return false; 4.3.3 Создание сцены, камеры и порта просмотра

Порт просмотра используется для отрисовки трёхмерного содержимого в 2D окне. Порт просмотра напрямую привязан к камере.

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

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

После настройки камеры для отображения объектов на сцене, необходимо настроить освещение сцены. В сцене используются два источника света: глобальное освещение и точечное освещение. Глобальное освещение используется для равномерного освещения сцены, а точечное в свою очередь для подсветки нужного места на сцене. Настройки освещения зависят от следующих параметров: цветовая гамма формата RGB, позиция источника света, направление освещения. Для настройки направления освещения в данном случае используется нормализация вектора.
4.3.4 Загрузка и установка заданных ресурсов

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

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

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

Поиск работает следующим образом: если в текущей строке есть подстрока «.zip», то с конца строки доходим до первого слеша (корневая директория файла) и далее считывается имя архива. Как правило имя архива должно совпадать с названием 3D модели. После завершения считывания имени оно заносится в созданный вектор.

result[100];

if ( std::strstr(stringToChar, «.zip») )

{len = strlen(stringToChar);i = 0;

(i = len; i > 0 ; i—)

{( stringToChar[i-1] == ‘/’)

{;

}

}res = 0;

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Подробнее

(int j = i; j < len ; j++)

{[res++] = stringToChar[j];

( stringToChar[j+1] == ‘.’)

{;

}

}.push_back( std::string(result) );

}

Далее требуется настроить параметры всех моделей, занесенных в вектор. Для того чтобы прикрепить 3D модель к сцене, Ogre3D использует узел сцены, являющийся дочерним элементов корневого узла сцены. Чтобы узел стал активным, нужно прикрепить к созданному узлу сцены сущность в виде 3D модели.

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

for(int i = 0; i < myVector.size(); i++)

{::Entity* lEntity = mSceneMgr->createEntity( myVector[i] + «.mesh» );= mSceneMgr->getRootSceneNode()->createChildSceneNode(myVector[i]);>attachObject(lEntity);>setPosition(0, 0, 0);

}
4.3.5 Выделение моделей на сцене, управление камерой

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

В целях реализации обратной связи необходимо определить нажатие пользователем на 3D модель на сцене. Для этого используется экземпляр класса Ray (луч), выпущенный из позиции нажатия мыши на экран. Также создаётся экземпляр очереди, связанный с лучом, в который записываются все объекты, через которые прошёл луч. В итоге, в цикле проходим по всей очереди и проверяем, является ли какой-либо из объектов, на который упал луч, одной из наших подгруженных моделей. Если объект является нашей моделью, то выделяем его. При возвращении камеры на исходную позицию снимаем выделение с 3D модели.

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

Возвращение камеры на исходную позицию происходит аналогичным образом. Исходная позиция камеры предустановлена в коде.

Ogre::Vector3 needPosition = SceneMgr

>getSceneNode(myVector[i])->getPosition() +

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Подробнее

Ogre::Vector3(200,50,50);>move( (needPosition — Camera->getPosition() ) * fe.timeSinceLastFrame);>lookAt(SceneMgr->getSceneNode(myVector[i]) ->getPosition() );
4.3.6 Сохранение состояния программы

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

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

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

if (rewrite)

{_name_model->QueryDoubleAttribute(«xPosition», &xPos);_name_model->QueryDoubleAttribute(«yPosition», &yPos);_name_model->QueryDoubleAttribute(«zPosition», &zPos);.x = xPos;.y = yPos;.z = zPos;_name_model->QueryDoubleAttribute(«xScale», &xScale);_name_model->QueryDoubleAttribute(«yScale», &yScale);_name_model->QueryDoubleAttribute(«zScale», &zScale);.x = xScale;.y = yScale;.z = zScale;_name_model->QueryDoubleAttribute(«rotate», &rotateModel);= rotateModel;

}(addNew)

{_settings->LinkEndChild(xml_name_model);::srand( std::time(NULL) );.x = 0;.y = 0;.z = std::rand()%300;_name_model->SetDoubleAttribute(«xPosition», locationVector.x );_name_model->SetDoubleAttribute(«yPosition», ЯlocationVector.y );_name_model->SetDoubleAttribute(«zPosition», locationVector.z );.x = 1;.y = 1;.z = 1;_name_model->SetDoubleAttribute(«xScale», scaleVector.x);_name_model->SetDoubleAttribute(«yScale», scaleVector.y);_name_model->SetDoubleAttribute(«zScale», scaleVector.z);= 0.0;_name_model->SetDoubleAttribute(«rotate», rotate);

file_settings->SaveFile();

}

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

4.4 Разработка пользовательского интерфейса

GUI — graphical user interface (графический пользовательский интерфейс).

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

Каркасом графического интерфейса является менеджер виджетов к которому дочерними объектами прикрепляются все графические элементы. Исходные файлы всех графических элементов хранятся в полигональном атласе, который также подгружается при запуске программы. Параметры графических элементов в атласе описаны в xml файлах, поэтому при создании кнопки происходит обращение сначала к названию атласа, а затем к элементу этого атласа, например OgreTray/Button [8].

Для расположения GUI элементов на экране, используются UV-координаты — текстурные координаты, содержащие информацию для наложения текстуры.

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

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Цена диплома

CEGUI::WindowManager &wmgr = CEGUI::WindowManager::getSingleton();::Window *buttonQuit;= wmgr.createWindow(«OgreTray/Button», «CEGUI/QuitButton»);>setText(“Выход”);>setSize(CEGUI::UVector2(CEGUI::UDim(0.15, 0), CEGUI::UDim(0.05, 0)));>setPosition(CEGUI::UVector2(CEGUI::UDim(0, 0), CEGUI::UDim(0.05, 0)));>addChildWindow(buttonQuit);::System::getSingleton().setGUISheet(sheetMgr);>subscribeEvent(CEGUI::PushButton::EventClicked, CEGUI::Event::Subscriber(&BasicApp::quit, this));

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

CEGUI::String encodeRussian(wchar_t string[100])

{_t strw[100] = L»»;(strw, string);::String str;(int i=0; i < wcslen(strw); i++)

{+= strw[i];

}

str;

}

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

Для удобного манипулирования 3D моделями реализовано меню настроек, которое включает в себя манипуляцию объектов при помощи пользовательского интерфейса. Манипулирование включает в себя: перемещение модели в пространстве, изменение угла поворота модели и изменение масштаба модели.

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

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

for(int i = 0; i < myVector.size(); i++)

{( mSceneMgr->getSceneNode(myVector[i])

>getShowBoundingBox() && static_cast<CEGUI::TabButton*>(scalePlusButton)->isPushed() )

{::Vector3 needScale = mSceneMgr

>getSceneNode(myVector[i])->getScale() * 1.001f;>getSceneNode(myVector[i])->setScale(needScale);

}

}

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Заказать диплом

Учитывая то, что приложение не ограничено на количество подгружаемых пользователем 3D моделей, а также после реализации манипулирования с моделями логично добавить масштабирование комнаты в целях увеличение пространства на случай переизбытка моделей. Чтобы равномерно увеличить комнату, требуется масштабировать её только по двум осям.

if (static_cast<CEGUI::TabButton*>(scaleRoomPlusButton)->isPushed() )

{::Real needScaleX = mSceneMgr

>getSceneNode(“Room”)->getScale().x * 1.001f;::Real needScaleY = mSceneMgr

>getSceneNode(“Room”)->getScale().y;::Real needScaleZ = mSceneMgr

>getSceneNode(“Room”)->getScale().z * 1.001f;>getSceneNode(“Room”)->setScale(needScaleX, needScaleY, needScaleZ);

}
4.5 Тестирование

Тестирование и отладка является важным этапом разработки программного продукта. Чтобы оператор смог пользоваться приложением без возникновения исключений и ошибок, требуется отладить программный код. В целях выявления ошибок в приложении было проведено модульное тестирование, которое позволяет проверить на корректность все модули программного кода [9].

В ходе работы было проведено тестирование программного продукта в целях обнаружения и исправления ошибок в коде.

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

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

Чтобы убедиться, что программный продукт запускается и работает корректно на различных процессорах, был проведён запуск приложения на различных рабочих станциях в целях выявления результатов производительности приложения. Также после завершения разработки интерфейса проведена проверка эргономичности продукта, чтобы убедится в удобстве пользовательского интерфейса.
5. Разработка руководства пользователя

В целях предоставления пользователю информации по работе с программой разработано руководство пользователя, включающее в себя:

·        инструкцию по разработке 3D моделей и дальнейшему их экспортированию для использования в приложении

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Заказать диплом

·        инструкцию по использованию 3D моделей в программе и настройку их параметров через xml файл

·        инструкцию по общему использованию приложения

Руководство пользователя представлено в приложении А.
Заключение

В дипломной работе решены следующие задачи:

.        Исследованы существующие системы визуализации

.        Исследованы подходящие библиотеки для разработки 3D сцены

.        Возможность загрузки и отображения множества объектов на сцене

.        Реализована и протестирована система визуализации

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

1.      Ogre 3D [Электронный ресурс]: офиц. сайт. — Режим доступа: http://www.ogre3d.org

2.      OpenSceneGraph [Электронный ресурс]: офиц. сайт. — Режим доступа: http://www.openscenegraph.org

3.      UnrealEngine [Электронный ресурс]: офиц. сайт. — Режим доступа: https://www.unrealengine.com

.        Приемы объектно-ориентированного проектирования. Паттерны проектирования / Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссиде. — СПб: Питер, 2001. — 368 с.

.        3D тур по горному университету [Электронный ресурс]: офиц. сайт. — Режим доступа: http://3dtour.spmi.ru

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Цена диплома

6.      Boeing 777-200ER — 3D панорама (Виртуальный тур) [Электронный ресурс]: офиц. сайт. — Режим доступа: http://www.orenair.ru/userfiles/panorama/Boeing-777/rus/tour.html

.        3D путешествие по отелю Галакт [Электронный ресурс]: офиц. сайт. — Режим доступа: http://www.galakt.ru/3d-puteshestvie-po-otelyu-galakt/

8.      CEGUI [Электронный ресурс]: офиц. сайт. — Режим доступа: http://cegui.org

.        Бейзер, Б. Тестирование черного ящика. Технологии функционального тестирования программного обеспечения и систем / Б. Бейзер. — СПб: Питер, 2004. — 320 с.

10.    Kerger, F. Ogre 3D 1.7 Beginner’s Guide / F. Kerger — Birmingham: Packt Publishing Ltd, 2010. — 300 p.
  Приложения   Приложение А

Руководство пользователя

Программа для запуска приложения расположена в папке Demo и называется Present3D.exe. Для корректной работы программы, во время её старта из выпадающего списка нужно выбрать графическую библиотеку для рендера DirectX. В случае если на машине не установлена данная библиотека, в папке Demo приложен файл для установки dxwebsetup.exe.

Разработка и загрузка собственных 3D моделей.

Для разработки моделей потребуется Blender 2.66. После разработки анимации у 3D модели, обязательно нужно назвать анимацию Walk.

После разработки 3D моделей, требуется настроить экспортер для использования моделей в движке. В папке с приложением находится файл io_export_ogreDotScene.py, который нужно переместить в расположение C:Program FilesBlender2.66scriptsaddons. После перемещения нужно зайти в Blender и активировать данный скрипт, для этого выполнить действия:

·        Перейти в User Preferences

·        Открыть вкладку Addons

·        Найти в списке OGRE Exporter и активировать галочку на этом скрипте

Экспорт модели проводится в меню File > Export > Ogre3D (.scene and .mesh), затем нужно выбрать директорию для сохранения файла.

Следующие файлы создаются при экспорте модели из Blender:

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Цена диплома

·        .mesh — основной файл модели

·        .material — файл материала (если материал применялся)

·        .skeleton — файл анимации (если модель имеет анимацию)

Все такие файлы после экспорта требуется упаковать в zip архив и переместить в папку с приложением по пути Demo/media/packs.

После перемещения архива с моделью требуется добавить в конфигурационный файл resources.cfg путь к созданной модели в таком виде  Zip=media/packs/NameModel.zip

На месте NameModel должно быть такое имя модели, которое содержит расширение .mesh в архиве.

Для добавления описания в виде текста к модели, нужно создать текстовый файл с названием, которое содержит расширение .mesh в архиве, и поместить в расположение Demomediatext.

Работа с программой.

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

Меню настроек.

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

Программный код

BasicApp.h

#ifndef BASICAPP_H

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Подробнее

#define BASICAPP_H

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include <TerrainOgreTerrain.h>

#include <TerrainOgreTerrainGroup.h>

#include

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Заказать диплом

#include

#include

#include

#include

#include

#include <RendererModules/Ogre/CEGUIOgreRenderer.h>

#include

#include

#include

#include

#include «textMgr.h»

#include

#include

#include

: public Ogre::WindowEventListener,Ogre::FrameListener,OIS::KeyListener,OIS::MouseListener

{:();

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Заказать диплом

~BasicApp();

go();

:mShutdown;

//Setup — Main::Root* mRoot;::Camera* mCamera;::SceneManager* mSceneMgr;::RenderWindow* mWindow;::String mResourcesCfg;::String mPluginsCfg;::SdkCameraMan* mCameraMan;

Ogre::SceneNode* lNode;//записываем подгружаемые меши

Ogre::Entity* room;::SceneNode* roomNode;::AnimationState* anim;

//Setup — Renderbool frameRenderingQueued(const Ogre::FrameEvent& fe);

//Setup — Keyboardbool keyPressed(const OIS::KeyEvent& ke);bool keyReleased(const OIS::KeyEvent& ke);

mRotSpd;mMovableFound;mLMouseDown, mRMouseDown;

::Vector3 prevPositionModel;

//Setup — Mousebool mouseMoved(const OIS::MouseEvent& me);bool mousePressed(const OIS::MouseEvent& me, OIS::MouseButtonID id);bool mouseReleased(const OIS::MouseEvent& me, OIS::MouseButtonID id);

//Setup — Windowvoid windowResized(Ogre::RenderWindow* rw);void windowClosed(Ogre::RenderWindow* rw);

//Setup — applicationsetup();configure();chooseSceneManager();createCamera();createScene();destroyScene();createFrameListener();createViewports();setupResources();createResourceListener();loadResources();

// CEGUI::OgreRenderer* mRenderer;setupCEGUI();

// OIS::Mouse* mMouse;::Keyboard* mKeyboard;::InputManager* mInputMgr;

//Terrain::TerrainGroup* mTerrainGroup;::TerrainGlobalOptions* mTerrainGlobals;

//Setup — Scene::RaySceneQuery* mRayScnQuery;//луч, опрашиваемый сцену

bool goDefaultPosition;//останавливает камеру при нажатии

void handleCameraCollision();

//GUI — Buttons::Window *buttonCameraSetPosition;//возвращения камеры на позицию::Window *buttonQuit;//выход::Window* textbox1;//текст для модели::Window* textShadow;::Window* menuButton; //меню настроек::Window* scalePlusButton; //увеличение скейла::Window* scaleMinusButton; //уменьшение скейла::Window* translateModelToLeftButton; //модельку влево::Window* translateModelToRightButton; //модельку вправо::Window* translateModelToTopButton; //модельку вперёд::Window* translateModelToBackButton; //модельку назад::Window* translateModelToUpButton; //модельку вверх::Window* translateModelToDownButton; //модельку вниз::Window* rotateRightModelButton; //поворачиваем модельку вправо::Window* rotateLeftModelButton; //поворачиваем модельку влево::Window* backMainWindowButton;//назад из меню настроек на главную::Window* checkShadow;::Window* releaseCamera;::Window* tipsText;::Window* tipsSettingText;::Window* tipsRoomText;::Window* tipsObjectText;

::Window* scaleRoomPlusButton; //увеличение скейла::Window* scaleRoomMinusButton; //уменьшение скейла

//GUI — Subscribes buttonseventRoomScalePlus();eventRoomScaleMinus();eventModelScalePlus();eventModelScaleMinus();eventModelTranslateLeft();eventModelTranslateRight();eventModelTranslateTop();eventModelTranslateBack();eventModelTranslateUp();eventModelTranslateDown();eventModelRotateRight();eventModelRotateLeft();eventMenuButton(const CEGUI::EventArgs &e);quit(const CEGUI::EventArgs &e);//обработчик кнопки выходаsetDefaultPosition(const CEGUI::EventArgs &e);//обработчик кнопки cameraDefaultPositioneventBackWindow(const CEGUI::EventArgs &e);//обработчик кнопки backMainWindow

checkShadows();

//Timers::Timer timer1;::Timer timer2;

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Подробнее

//Work with text model

std::vector myVector; //вектор названий мешей в конфигеresult[100]; //выходное название меша::String encodeRussian(wchar_t string[100]); //декодируем в русский текст

//Inside classes & SDK* textManager;*file_settings;*file_room_settings;

//GUI — AlphagoInAlpha(CEGUI::Window* win); //функция ухода в альфуgoFromAlpha(CEGUI::Window* win); //функция выхода из альфы

bool goFromAlphaButton;//если моделька выделена, вытаскиваем кнопку из альфы

//GUI — Widgets::Window* sheetMgr;//менеджер виджетов::Window *sheetMainWindow;//виджет главного окна::Window *sheetMainMenu;//виджет меню настроек

//Setup — XML settingconfigureXmlSettings();removeFromXmlElderData();configureXmlSettingsD(const char * nameModel, Ogre::Vector3 &locationVector, Ogre::Vector3 &scaleVector, double &rotate, Ogre::Vector3 &scaleRoomVector);

tipsEnabled;

};

#endif

.cpp

#include «BasicApp.h»

::BasicApp()

: mShutdown(false),(0),(0),(0),(0),(Ogre::StringUtil::BLANK),(Ogre::StringUtil::BLANK),(0),(0),(0),(0),(0),(0),(0),(0.1),(false),(false),(0),(false),(false),(0),(0),(0),(0)

{.clear();_settings = new TiXmlDocument(«modelSettings.xml»);_room_settings = new TiXmlDocument(«settings.xml»);

}

::~BasicApp()

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Цена диплома

{(mCameraMan) delete mCameraMan;

>destroyQuery(mRayScnQuery);

::WindowEventUtilities::removeWindowEventListener(mWindow, this);(mWindow);

mRoot;

}

BasicApp::go()

{

#ifdef _DEBUG= «resources_d.cfg»;= «plugins_d.cfg»;

#else= «resources.cfg»;= «plugins.cfg»;

#endif

(!setup());

>startRendering();

();

}

BasicApp::frameRenderingQueued(const Ogre::FrameEvent& fe)

{(mKeyboard->isKeyDown(OIS::KC_ESCAPE))= true;

(mShutdown)false;

(mWindow->isClosed())false;

>capture();>capture();

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Цена диплома

>frameRenderingQueued(fe);

();();();();();();();();();();();();

();

(int i = 0; i < myVector.size(); i++)

{

//если активно главное окно и выделена моделька

if ( mSceneMgr->getSceneNode(myVector[i])->getShowBoundingBox() && sheetMainWindow->isActive() )

{::Vector3 needPosition = mSceneMgr->getSceneNode(myVector[i])->getPosition() + Ogre::Vector3(200,50,50);>move( (needPosition — mCamera->getPosition() ) * fe.timeSinceLastFrame );>lookAt(mSceneMgr->getSceneNode(myVector[i])->getPosition() + Ogre::Vector3(0,50,50) );->setVisible(true);

= mSceneMgr->getSceneNode(myVector[i])->getPosition();

= false;

_t cameraText[100] = L»Вернуться»;>setText( encodeRussian(cameraText) );

(mSceneMgr->getEntity(myVector[i])->hasAnimationState(«Walk»))

{= mSceneMgr->getEntity(myVector[i])->getAnimationState(«Walk»);>setLoop(true);>setEnabled(true);>addTime(fe.timeSinceLastFrame);

}

}

}

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Цена диплома

(goDefaultPosition)

{::Vector3 needPosition(500, 350, 150);>move( (needPosition — mCamera->getPosition() ) * fe.timeSinceLastFrame );>lookAt(prevPositionModel);_t cameraText[100] = L»Остановить камеру»;>setText( encodeRussian(cameraText) );

(int i = 0; i < myVector.size(); i++)

{( mSceneMgr->getSceneNode(myVector[i])->getShowBoundingBox() && mSceneMgr->getEntity(myVector[i])->hasAnimationState(«Walk»))

{>setEnabled(false);

}

}

}

>setVisible(tipsEnabled);

::System::getSingleton().injectTimePulse(fe.timeSinceLastFrame);

 

true;

}

BasicApp::eventRoomScalePlus()

{

(static_cast<CEGUI::TabButton*>(scaleRoomPlusButton)->isPushed() )

{::Real needScaleX = roomNode->getScale().x * 1.001f;::Real needScaleY = roomNode->getScale().y;::Real needScaleZ = roomNode->getScale().z * 1.001f;

>setScale(needScaleX, needScaleY, needScaleZ);

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Цена диплома

}

}

BasicApp::eventRoomScaleMinus()

{

(static_cast<CEGUI::TabButton*>(scaleRoomMinusButton)->isPushed() )

{::Real needScaleX = roomNode->getScale().x * 0.999f;::Real needScaleY = roomNode->getScale().y;::Real needScaleZ = roomNode->getScale().z * 0.999f;

>setScale(needScaleX, needScaleY, needScaleZ);

}

}

BasicApp::eventModelScalePlus()

{(int i = 0; i < myVector.size(); i++)

{( mSceneMgr->getSceneNode(myVector[i])->getShowBoundingBox() && static_cast<CEGUI::TabButton*>(scalePlusButton)->isPushed() )

{::Vector3 needScale = mSceneMgr->getSceneNode(myVector[i])->getScale() * 1.001f; //костыль на скейл>getSceneNode(myVector[i])->setScale(needScale);

}

}

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Цена диплома

}

BasicApp::eventModelScaleMinus()

{(int i = 0; i < myVector.size(); i++)

{( mSceneMgr->getSceneNode(myVector[i])->getShowBoundingBox() && static_cast<CEGUI::TabButton*>(scaleMinusButton)->isPushed() )

{::Vector3 needScale = mSceneMgr->getSceneNode(myVector[i])->getScale() * 0.999f; //костыль на скейл>getSceneNode(myVector[i])->setScale(needScale);

}

}

}

BasicApp::eventModelTranslateLeft()

{(int i = 0; i < myVector.size(); i++)

{( mSceneMgr->getSceneNode(myVector[i])->getShowBoundingBox() && static_cast<CEGUI::TabButton*>(translateModelToLeftButton)->isPushed() )

{>getSceneNode(myVector[i])->translate(0.0f, 0.0f, 0.2f);

}

}

}

BasicApp::eventModelTranslateRight()

{(int i = 0; i < myVector.size(); i++)

{( mSceneMgr->getSceneNode(myVector[i])->getShowBoundingBox() && static_cast<CEGUI::TabButton*>(translateModelToRightButton)->isPushed() )

{>getSceneNode(myVector[i])->translate(0.0f, 0.0f, -0.2f);

}

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Заказать диплом

}

}

BasicApp::eventModelTranslateTop()

{(int i = 0; i < myVector.size(); i++)

{( mSceneMgr->getSceneNode(myVector[i])->getShowBoundingBox() && static_cast<CEGUI::TabButton*>(translateModelToTopButton)->isPushed() )

{>getSceneNode(myVector[i])->translate(-0.2f, 0.0f, 0.0f);

}

}

}

BasicApp::eventModelTranslateBack()

{(int i = 0; i < myVector.size(); i++)

{( mSceneMgr->getSceneNode(myVector[i])->getShowBoundingBox() && static_cast<CEGUI::TabButton*>(translateModelToBackButton)->isPushed() )

{>getSceneNode(myVector[i])->translate(0.2f, 0.0f, 0.0f);

}

}

}

BasicApp::eventModelTranslateUp()

{(int i = 0; i < myVector.size(); i++)

{( mSceneMgr->getSceneNode(myVector[i])->getShowBoundingBox() && static_cast<CEGUI::TabButton*>(translateModelToUpButton)->isPushed() )

{>getSceneNode(myVector[i])->translate(0.0f, 0.2f, 0.0f);

}

}

}

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Подробнее

BasicApp::eventModelTranslateDown()

{(int i = 0; i < myVector.size(); i++)

{( mSceneMgr->getSceneNode(myVector[i])->getShowBoundingBox() && static_cast<CEGUI::TabButton*>(translateModelToDownButton)->isPushed() )

{>getSceneNode(myVector[i])->translate(0.0f, -0.2f, 0.0f);

}

}

}

BasicApp::eventModelRotateRight()

{(int i = 0; i < myVector.size(); i++)

{( mSceneMgr->getSceneNode(myVector[i])->getShowBoundingBox() && static_cast<CEGUI::TabButton*>(rotateRightModelButton)->isPushed() )

{>getSceneNode(myVector[i])->yaw( Ogre::Degree(0.2f) );

}

}

}

BasicApp::eventModelRotateLeft()

{(int i = 0; i < myVector.size(); i++)

{( mSceneMgr->getSceneNode(myVector[i])->getShowBoundingBox() && static_cast<CEGUI::TabButton*>(rotateLeftModelButton)->isPushed() )

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Заказать диплом

{>getSceneNode(myVector[i])->yaw( Ogre::Degree(-0.2f) );

}

}

}

BasicApp::goInAlpha(CEGUI::Window* win)

{>setAlpha( 100.0f / (timer1.getMilliseconds() ) ); //уход в альфу

}

BasicApp::goFromAlpha(CEGUI::Window* win)

{>setAlpha( 0.001f * (timer1.getMilliseconds() ) ); //закинуть в функцию выход из альфы

}

BasicApp::keyPressed(const OIS::KeyEvent& ke)

{::System::getSingleton().injectKeyDown((CEGUI::Key::Scan)ke.key);::System::getSingleton().injectChar((CEGUI::Key::Scan)ke.text);

>injectKeyDown(ke);

true;

}

BasicApp::keyReleased(const OIS::KeyEvent& ke)

{::System::getSingleton().injectKeyUp((CEGUI::Key::Scan)ke.key);>injectKeyUp(ke);

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Заказать диплом

true;

}

BasicApp::mouseMoved(const OIS::MouseEvent& me)

{::System::getSingleton().injectMouseMove(me.state.X.rel, me.state.Y.rel);

(mLMouseDown)

{

}if (mRMouseDown)

{>yaw(Ogre::Degree(-me.state.X.rel * mRotSpd));>pitch(Ogre::Degree(-me.state.Y.rel * mRotSpd));

}

true;

}

// Helper function for mouse events::MouseButton convertButton(OIS::MouseButtonID id)

{(id)

{OIS::MB_Left:CEGUI::LeftButton;OIS::MB_Right:CEGUI::RightButton;OIS::MB_Middle:CEGUI::MiddleButton;:CEGUI::LeftButton;

}

}

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Заказать диплом

BasicApp::mousePressed(const OIS::MouseEvent& me, OIS::MouseButtonID id)

{::System::getSingleton().injectMouseButtonDown(convertButton(id));

(id == OIS::MB_Left)

{::Point mousePos = CEGUI::MouseCursor::getSingleton().getPosition();

::Ray mouseRay =>getCameraToViewportRay(.d_x / float(me.state.width),.d_y / float(me.state.height));

>setRay(mouseRay);>setSortByDistance(true);

::RaySceneQueryResult& result = mRayScnQuery->execute();::RaySceneQueryResult::iterator it = result.begin();

= false;

( ; it != result.end(); it++)

{

=>movable &&>movable->getName() != «» &&>movable->getName() != «PlayerCam»;

(int i = 0; i < myVector.size(); i++)

{(it->movable->getParentSceneNode()->getName() == myVector[i])

{>movable->getParentSceneNode()->showBoundingBox(true);= false;->setVisible(true);->setText( encodeRussian (textManager->getFromFile( myVector[i]) ) );

timer1.reset(); //сбрасываем таймер для нулевой альфы

goFromAlphaButton = true;;

}

}

}

= true;

}if (id == OIS::MB_Right)

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Цена диплома

{::MouseCursor::getSingleton().hide();

= true;

}

true;

}

BasicApp::mouseReleased(const OIS::MouseEvent& me, OIS::MouseButtonID id)

{::System::getSingleton().injectMouseButtonUp(convertButton(id));

(id == OIS::MB_Left)

{= false;

}if (id == OIS::MB_Right)

{::MouseCursor::getSingleton().show();= false;

}

true;

}

BasicApp::windowResized(Ogre::RenderWindow* rw) //not used

{int width, height, depth;left, top;>getMetrics(width, height, depth, left, top);

OIS::MouseState& ms = mMouse->getMouseState();.width = width;.height = height;

}

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Заказать диплом

BasicApp::windowClosed(Ogre::RenderWindow* rw)

{(rw == mWindow)

{(mInputMgr)

{>destroyInputObject(mMouse);>destroyInputObject(mKeyboard);

::InputManager::destroyInputSystem(mInputMgr);= 0;

}

}

}

BasicApp::setup()

{= new Ogre::Root(mPluginsCfg);

();

(!configure())false;

();();();

::TextureManager::getSingleton().setDefaultNumMipmaps(5);

();();

();

();

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Подробнее

();

= mSceneMgr->createRayQuery(Ogre::Ray());

true;

}

BasicApp::configure()

{(!(mRoot->restoreConfig() || mRoot->showConfigDialog()))

{false;

}

= mRoot->initialise(true, «Present3D»);

true;

}

BasicApp::chooseSceneManager()

{= mRoot->createSceneManager(Ogre::ST_EXTERIOR_CLOSE);

}

BasicApp::createCamera()

{= mSceneMgr->createCamera(«DefaultCam»);

>setPosition(Ogre::Vector3(500, 350, 150));>lookAt(Ogre::Vector3(0, 0, 150));>setNearClipDistance(0.1);>setFarClipDistance(50000);

= new OgreBites::SdkCameraMan(mCamera);

}

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Заказать диплом

BasicApp::createScene()

{>setAmbientLight(Ogre::ColourValue(0.7, 0.7, 0.7));

::Vector3 lightDir(0.55, 0.3, 0.75);.normalise();

::Light* light = mSceneMgr->createLight(«SceneLight»);

// light->setType(Ogre::Light::LT_DIRECTIONAL);>setType(Ogre::Light::LT_POINT);>setDirection(lightDir);>setDiffuseColour(Ogre::ColourValue(0.4, 0.4, 0.4));>setSpecularColour(Ogre::ColourValue(0.2, 0.2, 0.2));>setPosition(500,350,250);

 

//———виджет главного окна + менеджер::WindowManager &wmgr = CEGUI::WindowManager::getSingleton();= wmgr.createWindow(«DefaultWindow», «sheetMgr»);= wmgr.createWindow(«DefaultWindow», «sheetMainWindow»);= wmgr.createWindow(«DefaultWindow», «sheetMainMenu»);

//———кнопка выхода= wmgr.createWindow(«OgreTray/Button», «CEGUIDemo/QuitButton»);_t quitText[100] = L»Выход»;>setText( encodeRussian(quitText) );>setSize(CEGUI::UVector2(CEGUI::UDim(0.15, 0), CEGUI::UDim(0.05, 0)));

//———кнопка возвращения камеры на исходную позицию

buttonCameraSetPosition = wmgr.createWindow(«OgreTray/Button», «CEGUIDemo/buttonCameraSetPosition»);_t cameraText[100] = L»Выберите модель»;>setText( encodeRussian(cameraText) );>setSize(CEGUI::UVector2(CEGUI::UDim(0.15, 0), CEGUI::UDim(0.05, 0)));>setPosition(CEGUI::UVector2(CEGUI::UDim(0, 0), CEGUI::UDim(0.05, 0)));

//———текст модели= wmgr.createWindow(«OgreTray/StaticText», «CEGUIDemo/TextBox1»);->setVisible(false);->setSize(CEGUI::UVector2(CEGUI::UDim(0.35, 0), CEGUI::UDim(0.3, 0)));->setPosition(CEGUI::UVector2(CEGUI::UDim(0.2, 0), CEGUI::UDim(0.3, 0)));

//———текст тени= wmgr.createWindow(«OgreTray/ListboxItem», «CEGUIDemo/shadowText»);_t shadowText[100] = L»Тени»;>setText( encodeRussian(shadowText) );>setSize(CEGUI::UVector2(CEGUI::UDim(0.1, 0), CEGUI::UDim(0.05, 0)));>setPosition(CEGUI::UVector2(CEGUI::UDim(0, 0), CEGUI::UDim(0, 0)));

= wmgr.createWindow(«Vanilla/Checkbox», «CEGUIDemo/check»);>setSize(CEGUI::UVector2(CEGUI::UDim(0.05, 0), CEGUI::UDim(0.05, 0)));>setPosition(CEGUI::UVector2(CEGUI::UDim(0.12, 0), CEGUI::UDim(0, 0)));

//главное меню

= wmgr.createWindow(«OgreTray/Button», «menuButton»);_t settingsText[100] = L»Настройки»;>setText( encodeRussian(settingsText) );>setSize(CEGUI::UVector2(CEGUI::UDim(0.15, 0), CEGUI::UDim(0.05, 0)));>setPosition(CEGUI::UVector2(CEGUI::UDim(0.85, 0), CEGUI::UDim(0, 0)));

//Кнопка увеличения скейла= wmgr.createWindow(«but/scalePlusButton», «CEGUIDemo/scalePlusButton»);>setSize(CEGUI::UVector2(CEGUI::UDim(0.07, 0), CEGUI::UDim(0.07, 0)));>setPosition(CEGUI::UVector2(CEGUI::UDim(0.8, 0), CEGUI::UDim(0.6, 0)));

//Кнопка уменьшения скейла= wmgr.createWindow(«but/scaleMinusButton», «CEGUIDemo/scaleMinusButton»);>setSize(CEGUI::UVector2(CEGUI::UDim(0.07, 0), CEGUI::UDim(0.07, 0)));>setPosition(CEGUI::UVector2(CEGUI::UDim(0.8, 0), CEGUI::UDim(0.7, 0)));

//Кнопка перемещения модели влево= wmgr.createWindow(«but/moveButton», «CEGUIDemo/translateModelToLeftButton»);>setRotation( CEGUI::Vector3(0,0,180) );>setSize(CEGUI::UVector2(CEGUI::UDim(0.07, 0), CEGUI::UDim(0.07, 0)));>setPosition(CEGUI::UVector2(CEGUI::UDim(0.58, 0), CEGUI::UDim(0.7, 0)));

//Кнопка перемещения модели вправо= wmgr.createWindow(«but/moveButton», «CEGUIDemo/translateModelToRightButton»);>setSize(CEGUI::UVector2(CEGUI::UDim(0.07, 0), CEGUI::UDim(0.07, 0)));>setPosition(CEGUI::UVector2(CEGUI::UDim(0.72, 0), CEGUI::UDim(0.7, 0)));

//Кнопка перемещения модели вперед= wmgr.createWindow(«but/moveButton», «CEGUIDemo/translateModelToTopButton»);>setRotation( CEGUI::Vector3(0,0,-90) );>setSize(CEGUI::UVector2(CEGUI::UDim(0.07, 0), CEGUI::UDim(0.07, 0)));>setPosition(CEGUI::UVector2(CEGUI::UDim(0.65, 0), CEGUI::UDim(0.6, 0)));

//Кнопка перемещения модели назад= wmgr.createWindow(«but/moveButton», «CEGUIDemo/translateModelToBackButton»);>setRotation( CEGUI::Vector3(0,0,90) );>setSize(CEGUI::UVector2(CEGUI::UDim(0.07, 0), CEGUI::UDim(0.07, 0)));>setPosition(CEGUI::UVector2(CEGUI::UDim(0.65, 0), CEGUI::UDim(0.71, 0)));

//Кнопка перемещения модели вверх= wmgr.createWindow(«but/topButton», «CEGUIDemo/translateModelToUpButton»);>setSize(CEGUI::UVector2(CEGUI::UDim(0.07, 0), CEGUI::UDim(0.07, 0)));>setPosition(CEGUI::UVector2(CEGUI::UDim(0.6, 0), CEGUI::UDim(0.64, 0)));

//Кнопка перемещения модели вверх= wmgr.createWindow(«but/topButton», «CEGUIDemo/translateModelToDownButton»);>setRotation( CEGUI::Vector3(0,0,180) );>setSize(CEGUI::UVector2(CEGUI::UDim(0.07, 0), CEGUI::UDim(0.07, 0)));>setPosition(CEGUI::UVector2(CEGUI::UDim(0.7, 0), CEGUI::UDim(0.62, 0)));

//Кнопка перемещения модели вверх= wmgr.createWindow(«but/rotateButton», «CEGUIDemo/rotateRightModelButton»);>setSize(CEGUI::UVector2(CEGUI::UDim(0.07, 0), CEGUI::UDim(0.07, 0)));>setPosition(CEGUI::UVector2(CEGUI::UDim(0.515, 0), CEGUI::UDim(0.6, 0)));

//Кнопка перемещения модели вверх= wmgr.createWindow(«but/rotateButton», «CEGUIDemo/rotateLeftModelButton»);>setRotation( CEGUI::Vector3(0,180,0) );>setSize(CEGUI::UVector2(CEGUI::UDim(0.07, 0), CEGUI::UDim(0.07, 0)));>setPosition(CEGUI::UVector2(CEGUI::UDim(0.5, 0), CEGUI::UDim(0.7, 0)));

//Кнопка возвращения на главное окно= wmgr.createWindow(«OgreTray/Button», «CEGUIDemo/backMainWindowButton»);_t saveText[100] = L»Сохранить»;>setText(encodeRussian(saveText) );>setSize(CEGUI::UVector2(CEGUI::UDim(0.15, 0), CEGUI::UDim(0.05, 0)));>setPosition(CEGUI::UVector2(CEGUI::UDim(0.85, 0), CEGUI::UDim(0, 0)));

//настройки комнаты

//Кнопка увеличения скейла= wmgr.createWindow(«but/scalePlusButton», «CEGUIDemo/scaleRoomPlusButton»);>setSize(CEGUI::UVector2(CEGUI::UDim(0.07, 0), CEGUI::UDim(0.07, 0)));>setPosition(CEGUI::UVector2(CEGUI::UDim(0.15, 0), CEGUI::UDim(0.6, 0)));

//Кнопка уменьшения скейла= wmgr.createWindow(«but/scaleMinusButton», «CEGUIDemo/scaleRoomMinusButton»);>setSize(CEGUI::UVector2(CEGUI::UDim(0.07, 0), CEGUI::UDim(0.07, 0)));>setPosition(CEGUI::UVector2(CEGUI::UDim(0.25, 0), CEGUI::UDim(0.6, 0)));

//типса настроек

= wmgr.createWindow(«OgreTray/StaticText», «CEGUIDemo/tipsTextSettings»);>setVisible(true);>setSize(CEGUI::UVector2(CEGUI::UDim(1, 0), CEGUI::UDim(0.07, 0)));>setPosition(CEGUI::UVector2(CEGUI::UDim(0, 0), CEGUI::UDim(0.93, 0)));

wchar_t tipSettingText[150] = L»Режим настроек: удерживайте ПКМ для поворота камеры. WASD — двигать камеру. ЛКМ — выбрать.»;>setText( encodeRussian(tipSettingText) );

//———текст типсы главного экрана настроек

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Заказать диплом

tipsText = wmgr.createWindow(«OgreTray/StaticText», «CEGUIDemo/tipsText»);>setVisible(true);>setSize(CEGUI::UVector2(CEGUI::UDim(1, 0), CEGUI::UDim(0.07, 0)));>setPosition(CEGUI::UVector2(CEGUI::UDim(0, 0), CEGUI::UDim(0.93, 0)));

wchar_t tipText[150] = L»Режим поворота камеры: удерживайте ПКМ для поворота камеры. WASD — двигать камеру. ЛКМ — выбрать.»;>setText( encodeRussian(tipText) );

//———текст типсы масштаба зала

tipsRoomText = wmgr.createWindow(«OgreTray/StaticText», «CEGUIDemo/tipsRoomText»);>setVisible(true);>setSize(CEGUI::UVector2(CEGUI::UDim(0.22, 0), CEGUI::UDim(0.07, 0)));>setPosition(CEGUI::UVector2(CEGUI::UDim(0.12, 0), CEGUI::UDim(0.5, 0)));_t tipRoomText[150] = L»Масштабировать зал»;>setText( encodeRussian(tipRoomText) );

//———текст типсы манипуляции объекта= wmgr.createWindow(«OgreTray/StaticText», «CEGUIDemo/tipsObjectText»);>setVisible(true);>setSize(CEGUI::UVector2(CEGUI::UDim(0.3, 0), CEGUI::UDim(0.07, 0)));>setPosition(CEGUI::UVector2(CEGUI::UDim(0.535, 0), CEGUI::UDim(0.5, 0)));

wchar_t tipObjectText[150] = L»Манипулирование объектом»;

tipsObjectText->setText( encodeRussian(tipObjectText) );

//———крепим кнопки к виджетам>addChildWindow(sheetMainWindow);>addChildWindow(sheetMainMenu);

>addChildWindow(buttonQuit);>addChildWindow(buttonCameraSetPosition);>addChildWindow(textbox1);>addChildWindow(menuButton);>addChildWindow(tipsText);

>addChildWindow(scaleRoomPlusButton);>addChildWindow(scaleRoomMinusButton);>addChildWindow(scalePlusButton);>addChildWindow(scaleMinusButton);>addChildWindow(translateModelToLeftButton);>addChildWindow(translateModelToRightButton);>addChildWindow(translateModelToTopButton);>addChildWindow(translateModelToBackButton);>addChildWindow(translateModelToUpButton);>addChildWindow(translateModelToDownButton);>addChildWindow(rotateRightModelButton);>addChildWindow(rotateLeftModelButton);>addChildWindow(backMainWindowButton);>addChildWindow(checkShadow);>addChildWindow(textShadow);>addChildWindow(tipsSettingText);>addChildWindow(tipsRoomText);>addChildWindow(tipsObjectText);

>hide();

//———обрабатываем нажатия кнопок>subscribeEvent(CEGUI::PushButton::EventClicked, CEGUI::Event::Subscriber(&BasicApp::quit, this));>subscribeEvent(CEGUI::PushButton::EventClicked, CEGUI::Event::Subscriber(&BasicApp::setDefaultPosition, this));>subscribeEvent(CEGUI::PushButton::EventClicked, CEGUI::Event::Subscriber(&BasicApp::eventMenuButton, this));>subscribeEvent(CEGUI::PushButton::EventClicked, CEGUI::Event::Subscriber(&BasicApp::eventBackWindow, this));

::Vector3 scaleRoomVector(0, 0, 0);

(int i = 0; i < myVector.size(); i++)

{::Entity* lEntity = mSceneMgr->createEntity(myVector[i], myVector[i] + «.mesh» );= mSceneMgr->getRootSceneNode()->createChildSceneNode(myVector[i]);>attachObject(lEntity);

char * nameModel = nullptr; //преобразования в const char для xmlstringToChar [100];::strcpy( stringToChar, myVector[i].c_str() );= stringToChar;

::Vector3 locationVector(0, 0, 0);//получаем координаты модельки::Vector3 scaleVector(0, 0, 0);//её скейлrotate = 0.0;//и поворот

(nameModel, locationVector, scaleVector, rotate, scaleRoomVector);

>setPosition(locationVector);>setScale(scaleVector);>yaw(Ogre::Degree(rotate));

();

}

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Цена диплома

= mSceneMgr->createEntity(«Cube.001.mesh»);= mSceneMgr->getRootSceneNode()->createChildSceneNode(«room»);>attachObject(room);>setPosition(500,450,200);>setScale(scaleRoomVector);

//roomNode->setScale(50,25,50);

_cast<CEGUI::Checkbox*>(checkShadow)->setSelected(true);>setShadowTechnique(Ogre::SHADOWTYPE_STENCIL_ADDITIVE);

= true;

::System::getSingleton().setGUISheet(sheetMgr);

}

BasicApp::checkShadows()

{( static_cast<CEGUI::Checkbox*>(checkShadow)->isSelected() )

{>setShadowTechnique(Ogre::SHADOWTYPE_STENCIL_ADDITIVE);

}if ( !static_cast<CEGUI::Checkbox*>(checkShadow)->isSelected() )

{>setShadowTechnique(Ogre::SHADOWTYPE_NONE);

}

}

/*BasicApp::releaseCam()

{static_cast<CEGUI::Checkbox*>(releaseCamera)->isSelected();

}

*/::String BasicApp::encodeRussian(wchar_t string[100])

{_t strw[100] = L»»;(strw, string);

::String str;(int i=0; i < wcslen(strw); i++)

}

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Заказать диплом

str;

}

BasicApp::eventBackWindow(const CEGUI::EventArgs &e)

{();

>hide();>disable();>deactivate();>show();>activate();>enable();

(int i = 0; i < myVector.size(); i++)

{>getSceneNode(myVector[i])->showBoundingBox(false); //убираем выделение со всех моделек на сцене

}

->setVisible(false);

true;

}

BasicApp::configureXmlSettingsD(const char * nameModel, Ogre::Vector3 &locationVector, Ogre::Vector3 &scaleVector, double &rotate, Ogre::Vector3 &scaleRoomVector)

{_settings->LoadFile();rewrite = false;addNew = false;

* xml_name_model = new TiXmlElement(nameModel);

* findModel = file_settings->FirstChildElement(nameModel); //проверяем, есть ли моделька из вектора в xml(findModel == nullptr)

{= true;//если нет, добавляем новую

}(!addNew)//иначе обновляем атрибуты (потом можно переписать красивее)

{

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Цена диплома

( xml_name_model = file_settings->FirstChildElement(nameModel); xml_name_model != NULL; xml_name_model = xml_name_model->NextSiblingElement(nameModel) )

{

( xml_name_model != nullptr)

{= true;;

}

}

}

(rewrite)

{xPos = 0.0;yPos = 0.0;zPos = 0.0;xScale = 0.0;yScale = 0.0;zScale = 0.0;rotateModel = 0.0;

_name_model->QueryDoubleAttribute(«xPosition», &xPos);_name_model->QueryDoubleAttribute(«yPosition», &yPos);_name_model->QueryDoubleAttribute(«zPosition», &zPos);.x = xPos;.y = yPos;.z = zPos;_name_model->QueryDoubleAttribute(«xScale», &xScale);_name_model->QueryDoubleAttribute(«yScale», &yScale);_name_model->QueryDoubleAttribute(«zScale», &zScale);.x = xScale;.y = yScale;.z = zScale;_name_model->QueryDoubleAttribute(«rotate», &rotateModel);= rotateModel;

}

(addNew)

{_settings->LinkEndChild(xml_name_model);::srand( std::time(NULL) );.x = 0;.y = 0;.z = std::rand()%300;_name_model->SetDoubleAttribute(«xPosition», locationVector.x );_name_model->SetDoubleAttribute(«yPosition», locationVector.y );_name_model->SetDoubleAttribute(«zPosition», locationVector.z );.x = 1;.y = 1;.z = 1;_name_model->SetDoubleAttribute(«xScale», scaleVector.x);_name_model->SetDoubleAttribute(«yScale», scaleVector.y);_name_model->SetDoubleAttribute(«zScale», scaleVector.z);= 0.0;_name_model->SetDoubleAttribute(«rotate», rotate);_settings->SaveFile();

}

_room_settings->LoadFile();* xml_name_room = new TiXmlElement(«room»);_name_room = file_room_settings->FirstChildElement(«room»);xScale = 0.0;yScale = 0.0;zScale = 0.0;_name_room->QueryDoubleAttribute(«xScale», &xScale);_name_room->QueryDoubleAttribute(«yScale», &yScale);_name_room->QueryDoubleAttribute(«zScale», &zScale);.x = xScale;.y = yScale;.z = zScale;

}

BasicApp::configureXmlSettings()

{_settings->LoadFile();

(int i = 0; i < myVector.size(); i++)

{char * nameModel = nullptr;//преобразования в const char для xmlstringToChar [100];::strcpy( stringToChar, myVector[i].c_str() );= stringToChar;

* xml_name_model = nullptr;_name_model = file_settings->FirstChildElement(nameModel);

_name_model->SetDoubleAttribute(«xPosition», mSceneMgr->getSceneNode(nameModel)->getPosition().x);_name_model->SetDoubleAttribute(«yPosition», mSceneMgr->getSceneNode(nameModel)->getPosition().y);_name_model->SetDoubleAttribute(«zPosition», mSceneMgr->getSceneNode(nameModel)->getPosition().z);_name_model->SetDoubleAttribute(«xScale», mSceneMgr->getSceneNode(nameModel)->getScale().x);_name_model->SetDoubleAttribute(«yScale», mSceneMgr->getSceneNode(nameModel)->getScale().y);_name_model->SetDoubleAttribute(«zScale», mSceneMgr->getSceneNode(nameModel)->getScale().z);

_name_model->SetDoubleAttribute(«rotate», mSceneMgr->getSceneNode(nameModel)->getOrientation().getYaw().valueDegrees() );

_settings->SaveFile();

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Заказать диплом

}

_room_settings->LoadFile();

* xml_name_model = nullptr;_name_model = file_room_settings->FirstChildElement(«room»);_name_model->SetDoubleAttribute(«xScale», mSceneMgr->getSceneNode(«room»)->getScale().x);_name_model->SetDoubleAttribute(«yScale», mSceneMgr->getSceneNode(«room»)->getScale().y);_name_model->SetDoubleAttribute(«zScale», mSceneMgr->getSceneNode(«room»)->getScale().z);_room_settings->SaveFile();

}

BasicApp::removeFromXmlElderData()

{_settings->LoadFile();

::vector notExistsModels; //вектор для дальнейшего удаления неиспользованных моделек из xml

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

TiXmlNode* xml_name = nullptr;

( xml_name = file_settings->FirstChildElement(); xml_name != NULL; xml_name = xml_name->NextSiblingElement() )

{::string name = xml_name->Value();.push_back(name);

}

( notExistsModels.size() >= myVector.size() ) //костыль (падало при запуске при добавлении сразу 3 новых моделек в конфиг

//поэтому ждём пока подгрузит всё из конфига)

{

//удаляем лишние элементы из вектора, которые не используются в приложении

for(int i = 0; i < myVector.size(); i++ )

{

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Цена диплома

//ищем элемент подгрузочного вектора в векторе из xml

std::vector::iterator it = std::find(notExistsModels.begin(), notExistsModels.end(), myVector[i]);.erase( it );::vector(notExistsModels).swap(notExistsModels); //для освобождения памяти

}

//теперь удаляем из xml всё, что осталось в векторе notExists

for(int i = 0; i < notExistsModels.size(); i++ )

{char * nameModel = nullptr; //преобразования в const char для xmlstringToChar [100];::strcpy( stringToChar, notExistsModels[i].c_str() );= stringToChar;

* xml_delete = file_settings->FirstChildElement(nameModel);_settings->RemoveChild(xml_delete);_settings->SaveFile();

}

}

}

BasicApp::eventMenuButton(const CEGUI::EventArgs &e)

{>hide();>disable();>deactivate();>show();>activate();>enable();

true;

}

BasicApp::quit(const CEGUI::EventArgs &e)

{= true;true;

}

BasicApp::setDefaultPosition(const CEGUI::EventArgs &e)

{

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Подробнее

= !goDefaultPosition;->setVisible(false);

(int i = 0; i < myVector.size(); i++)

{>getSceneNode(myVector[i])->showBoundingBox(false); //убираем выделение со всех моделек на сцене

}

.reset();

_t cameraText[100] = L»Остановить камеру»;

(buttonCameraSetPosition->getText() == encodeRussian(cameraText) )

{= !tipsEnabled;

}

true;

}

BasicApp::destroyScene()

{

}

BasicApp::createFrameListener()

{::LogManager::getSingletonPtr()->logMessage(«*** Initializing OIS ***»);

::ParamList pl;_t windowHnd = 0;::ostringstream windowHndStr;

>getCustomAttribute(«WINDOW», &windowHnd);<< windowHnd;.insert(std::make_pair(std::string(«WINDOW»), windowHndStr.str()));

= OIS::InputManager::createInputSystem(pl);

= static_cast<OIS::Keyboard*>(>createInputObject(OIS::OISKeyboard, true));= static_cast<OIS::Mouse*>(>createInputObject(OIS::OISMouse, true));

>setEventCallback(this);>setEventCallback(this);

(mWindow);

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Цена диплома

::WindowEventUtilities::addWindowEventListener(mWindow, this);

>addFrameListener(this);

::LogManager::getSingletonPtr()->logMessage(«Finished»);

}

BasicApp::createViewports()

{::Viewport* vp = mWindow->addViewport(mCamera);>setBackgroundColour(Ogre::ColourValue(0, 0, 0));

>setAspectRatio(::Real(vp->getActualWidth()) /::Real(vp->getActualHeight()));

}

BasicApp::setupResources()

{::ConfigFile cf;.load(mResourcesCfg);

::String secName, typeName, archName;::ConfigFile::SectionIterator secIt = cf.getSectionIterator();

(secIt.hasMoreElements())

{= secIt.peekNextKey();::ConfigFile::SettingsMultiMap* settings = secIt.getNext();::ConfigFile::SettingsMultiMap::iterator setIt;

(setIt = settings->begin(); setIt != settings->end(); ++setIt)

{= setIt->first;= setIt->second;::ResourceGroupManager::getSingleton().addResourceLocation(, typeName, secName);

//преобразуем строку огре в char::string ogreToString = static_cast(archName);stringToChar [100];::strcpy( stringToChar, ogreToString.c_str() );

( std::strstr(stringToChar, «.zip») )

{::memset(result, 0, sizeof(result)); //очистим result

int len = strlen(stringToChar); //длина считанной строки из конфига

i = 0;

//добираемся до первого слеша с конца

for(i = len; i > 0 ;i—)

{( stringToChar[i-1] == ‘/’)

{;

}

}

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Цена диплома

res = 0;

//вырезаем имя меша(int j = i; j < len ;j++)

{[res++] = stringToChar[j]; //записываем название меша без .mesh

if ( stringToChar[j+1] == ‘.’)

{;

}

}

.push_back( std::string(result) ); //заносим название в вектор

}

}

}

}

BasicApp::createResourceListener()

{

}

BasicApp::loadResources()

{::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();

}

BasicApp::setupCEGUI()

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Цена диплома

{::LogManager::getSingletonPtr()->logMessage(«*** Initializing CEGUI ***»);

= &CEGUI::OgreRenderer::bootstrapSystem();

::Imageset::setDefaultResourceGroup(«Imagesets»);::Font::setDefaultResourceGroup(«Fonts»);::Scheme::setDefaultResourceGroup(«Schemes»);::WidgetLookManager::setDefaultResourceGroup(«LookNFeel»);::WindowManager::setDefaultResourceGroup(«Layouts»);

::SchemeManager::getSingleton().create(«OgreTray.scheme»);::SchemeManager::getSingleton().create(«WindowsLook.scheme»);::SchemeManager::getSingleton().create(«TaharezLook.scheme»);::SchemeManager::getSingleton().create(«VanillaSkin.scheme»);::SchemeManager::getSingleton().create(«Novy_Kholst.scheme»);::SchemeManager::getSingleton().create(«but.scheme»);

::FontManager::getSingleton().create(«DejaVuSans-10.font»);

::System::getSingleton().setDefaultFont(«DejaVuSans-10»);

::System::getSingleton().setDefaultMouseCursor(«WindowsLook», «MouseArrow»);::MouseCursor::getSingleton().setImage( CEGUI::System::getSingleton().getDefaultMouseCursor());

::LogManager::getSingletonPtr()->logMessage(«Finished»);

true;

}

BasicApp::handleCameraCollision() //метод ограничения камеры (не летаем за текстуры)

{::Vector3 camPos = mCamera->getPosition();::Ray camRay(::Vector3(camPos.x, 5000.0, camPos.z),::Vector3::NEGATIVE_UNIT_Y);

::TerrainGroup::RayResult result = mTerrainGroup->rayIntersects(camRay);

(result.terrain)

{::Real terrainHeight = result.position.y;

(camPos.y < (terrainHeight + 10.0))>setPosition(camPos.x, terrainHeight + 10.0, camPos.z);

}

}

#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32

#define WIN32_LEAN_AND_MEAN

#include «windows.h»

#endif

#ifdef __cplusplus»C» {

#endif

#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT)

#elsemain(int argc, char *argv[])

#endif

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Цена диплома

{app;

{.go();

}(Ogre::Exception& e)

{

#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32(,.getFullDescription().c_str(),

«An exception has occured!»,_OK | MB_ICONERROR | MB_TASKMODAL);

#else::cerr << «An exception has occured: » <<.getFullDescription().c_str() << std::endl;

#endif

}

0;

}

#ifdef __cplusplus

}

#endif

.h

#include

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Подробнее

#include

#include

#include

textMgr

{:();

~textMgr();

::vector idTextVector; //идентификатор текста модельки, сравниваем по имени::vector dataTextVector; //описание модели

::string getText(std::string id);setText(std::string id, std::string data);_t* getFromFile(std::string id);

:

};

.cpp

#include «textMgr.h»

::textMgr()

{

}

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Цена диплома

::~textMgr()

{

}

::string textMgr::getText(std::string id)

{(int i = 0; i < idTextVector.size(); i++)

{( idTextVector[i].length() == id.length() )

{(int j = 0; j < id.length(); j++)

{(id[j] != idTextVector[i][j])

{«Add text for model!»;

}

{dataTextVector[0];

}

}

}

{«Add text for model!»;

Нужна помощь в написании диплома?

Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Подробнее

}

}

}

_t* textMgr::getFromFile(std::string id)

{(LC_ALL, «Russian»);

+= «.txt»; //добавляем .txt к переданному мешу

//CEGUI::String data; //возвращаемая строка_t data[2000] = L»»;

::string path = «media\text\;

Средняя оценка 0 / 5. Количество оценок: 0

Поставьте оценку первым.

Сожалеем, что вы поставили низкую оценку!

Позвольте нам стать лучше!

Расскажите, как нам стать лучше?

381

Закажите такую же работу

Не отобразилась форма расчета стоимости? Переходи по ссылке

Не отобразилась форма расчета стоимости? Переходи по ссылке