Московский государственный институт электроники и математики
Кафедра «Информационно-коммуникационные технологии»
Отчёт о преддипломной практике
по теме:
«Разработка программного обеспечения для моделирования комплекса многокамерной автоматизированной съемки и видеотрансляции»
Исполнитель:
Шубин С. С.
Группа
С-105
Руководитель:
Куприянов Ю. В.
Дата:
26.03.2012
Москва 2012
Оглавление
Анализ задания 3
Обзорно-аналитическая часть 4
Анализ актуальности 4
Требования к программному продукту 4
Анализ аналогичных решений 4
Autodesk 3ds Max и Autodesk Maya 4
Graphisoft Archicad 4
The Sims 5
The Movies 5
Игровые 3D-движки 5
Анализ графических движков. Возможность передачи потокового видео. 6
Выбор средств разработки 6
Технологическая часть 7
Обзор OGRE 3D 7
Обзор дополнительных компонентов для графического движка 7
Обзор среды разработки MS Visual Studio Express 7
Разработка 8
Создание среды для визуализации 8
Рабочий цикл OGRE-приложения 8
Подготовительные процедуры 8
Создание сцены 9
Запуск цикла рендеринга 10
Реализация протокола передачи команд управления виртуальными камерами из внешней программы 12
Реализация протокола передачи изображения с виртуальных камер во внешнюю программу 14
Анализ задания
Центральной частью работы является проект по созданию комплекса автоматизированной многокамерной съемки. Цель – отойти от человеческого фактора и снизить трудозатраты за счет автоматизации рутинных процессов видеосъемки докладов, научных конференций, симпозиумов.
Данный комплекс перекладывает на себя операторскую и частично режиссёрскую работу: выбор планов, настройки камеры, их движение. Для реализации такой системы необходим программный продукт, позволяющий запоминать различные модели человеческого поведения и впоследствии использовать их для машинного обучения.
В качестве графической среды для обучения комплекса предложено спроектировать программное обеспечение со следующими функциями:
-
моделирование сцены съемки;
-
настройка виртуальной видеоаппаратуры;
-
составление сценария мероприятия;
-
визуализация процесса съемки.
Данная графическая среда должна достигать следующих целей:
-
Взаимодействие с системой обучения автоматизированного комплекса видеосъёмки с помощью следующих потоков информации:
Входные данные: управляющие сигналы на камеры (угол поворота и zoom);
Выходные данные: изображения с камер.
-
Демонстрация процесса съёмки мероприятия.
В дипломной работе, в рамках проекта комплекса автоматизированной многокамерной съёмки, будет спроектирован и реализован программный продукт с указанными параметрами.
Обзорно-аналитическая часть Анализ актуальности
Данное программное обеспечение является частью одного большого аппаратно-программного комплекса. Так как в результате исследования аналогичных решений (см. ниже) было выяснено, что не существует полностью подходящей среды, выполняющей поставленные задачи, то вопрос о необходимости разработки отпадает.
Требования к программному продукту
Этот программный продукт в первую очередь предназначен для создания виртуальной сцены съемки по типичному сценарию проведения мероприятий, таких, как научный семинар, конференция в актовом зале. Необходимо добиться возможности трансляции видеопотоков с виртуальных камер в программу обучения многокамерного автоматизированного комплекса видеосъемки.
Так как содержимое видеопотоков должно соответствовать таковому с реальных камер, то это накладывает следующие ограничения на виртуальное моделирование:
-
детализация помещений должна быть достаточна, чтобы на изображении с камеры явно различалась мебель в помещении;
-
детализация самой модели персонажа (человекоподобного манекена) должна быть достаточна, чтобы программа распознавания образов принимала его за реального человека;
-
его анимация приближена к реальному поведению людей.
Анализ аналогичных решений Autodesk 3ds Max и Autodesk Maya
Программные комплексы для создания и редактирования трёхмерной графики и анимации способны покрыть большую часть целей проекта. Но эти редакторы слишком избыточны, работа в них требует больших трудозатрат и предварительного обучения. Так у пользователя не должно быть необходимости создавать каждый объект интерьера вручную и добиваться фотографической точности сцены в ущерб времени.
Официальный сайт 3ds Max: http://www.autodesk.ru/3dsmax
Официальный сайт Maya: http://www.autodesk.ru/maya
Graphisoft Archicad
3D-редактор для моделирования архитектурных объектов, прежде всего, зданий и их интерьера. Оперирует такими объектами, как перекрытия, стены, окна, двери, мебель и другими готовыми трёхмерными элементами.
Данный редактор предоставляет богатые средства для моделирования сцены съёмки, но он не позволяет смоделировать персонажей на этой сцене и сам процесс съёмки.
Официальный сайт: http://www.graphisoft.com/products/archicad/
Пример работы: http://www.youtube.com/watch?v=SP9cqy9rvtA
The Sims
Игра-симулятор жизни виртуальных людей. Включает в себя простой редактор для моделирования строений и расстановки мебели и режим симуляции жизни персонажей.
Ключевая особенность симулятора персонажей – точность в контролировании хода действий персонажей: детализация действий на уровне «подошёл к столу», «включил телевизор», но детализация уровня «поднял руку», «сделал три шага вперёд» отсутствует.
Официальный сайт: http://thesims.com/ru_ru/home
Пример работы в редакторе:
http://www.youtube.com/watch?v=7QK8malxCSA
The Movies
Игра-симулятор видеостудии, имеет встроенный конструктор короткометражных фильмов. Позволяет создавать видеоролики в строго заданных декорациях по заданным шаблонам движений актёров. Вариабельными являются актёры, их внешность, одежда и движения губ, дополнительные предметы в декорациях, звуковые дорожки и некоторые настройки для конкретных шаблонов движений.
Официальный сайт: http://lionhead.com/Games/TheMovies/
Пример готовой работы: http://www.youtube.com/watch?v=vcLSrv6SH5Q
Игровые 3D-движки
Некоторые разработчики трёхмерных компьютерных игр выпускают графические движки этих игр, как отдельные продукты. Как правило, такие движки предоставляют необходимые средства для моделирования сцен, персонажей и их анимации, камер. Среди этих программных пакетов есть и те, которые можно получить бесплатно.
Примеры:
Движок
|
Пример работы
|
Unreal Engine 3
|
http://www.youtube.com/watch?v=uxjhvPj6FlA
|
CryEngine 3
|
http://www.youtube.com/watch?v=v0o_hLYLOrU
|
Source Engine
|
http://www.youtube.com/watch?v=MpeBR8iBilw
|
Unity 3D
|
http://www.youtube.com/watch?v=5wxe1IUu5QA
|
OGRE 3D
|
http://www.youtube.com/watch?v=woHZRUlOQqo
| Анализ графических движков. Возможность передачи потокового видео.
Ключевые характеристики при выборе движка:
-
бесплатность;
-
поддержка форматов данных популярных трёхмерных редакторов;
-
возможность вывода потокового видео во внешнюю программу;
-
наличие широкой аудитории разработчиков и готовых решений;
-
доступность средств реализации графического интерфейса пользователя.
Игровые 3D-движки можно условно подразделить на свободные и коммерческие. В свою очередь существуют бесплатные версии коммерческих движков – Unreal Engine 2 и 3, CryEngine 2 и 3, Unity 3D. Главным фактором, отбрасывающим большинство продуктов, является возможность вывода потокового видео. Это низкоуровневая и редко используемая функция, которая не включается в бесплатные версии коммерческих движков.
Таким образом, платформа для программного продукта выбирается из свободных решений. К свободно распространяемым движкам относится серия id Tech, на которых были сделаны серии игр Doom и Quake. Но у него узкая аудитория разработчиков и практическое отсутствие поддержки.
Из других известных движков имеется OGRE 3D. Он уже удовлетворяет всем указанным требованиям.
Выбор средств разработки
Приложение разрабатывается на движке OGRE 3D. Изначальный язык программирования для этого пакета – C++, на нём же написаны и необходимые для разработки дополнительные модули – CEGUI и OgreSocks. Приложение разрабатывается под среду Windows, все указанные пакеты имеют возможность сборки в среде разработки MS Visual Studio. Таким образом, в качестве среды разработки используется MS Visual Studio Express 2008.
Технологическая часть Обзор OGRE 3D
OGRE 3D – это свободно распространяемый графический движок. Он разрабатывается с 2005 года и имеет широкое коммьюнити, полную документацию и набор готовых примеров и дополнений для работы с ним.
Этот движок поддерживает низкоуровневые операции с графикой, в частности, он позволяет вывести изображение с внутриигровой камеры на текстуру, после чего с ней можно оперировать, как с набором данных – сохранять в файл и отправлять по сети.
Среди дополнительных материалов OGRE 3D есть средства для импорта моделей, материалов, текстур, частиц и анимации из редакторов трёхмерной графики – Blender и Autodesk Maya. Также присутствует дополнительный модуль для реализации графического интерфейса пользователя – CEGUI. Для создания сетевого взаимодействия в потоковой передаче видео может использоваться пакет сетевых библиотек OgreSocks.
Выбор данного графического движка является одним из условий для выбора редактора трёхмерной графики в смежной дипломной работе «Разработка технологии анимации виртуальных персонажей и сцен для моделирования процесса многокамерной автоматизированной съемки».
Обзор дополнительных компонентов для графического движка
Модуль OgreSocks для своей компиляции требует библиотек из пакета Microsoft Platform SDK – он доступен для свободного скачивания с сайта Microsoft.
Для экспорта моделей, материалов, текстур и анимации используется редактор Autodesk Maya 2011 с плагином Ogre-Maya Exporter.
Обзор среды разработки MS Visual Studio Express
Microsoft Visual Studio Express — линейка бесплатных интегрированных сред разработки, облегчённая версия Microsoft Visual Studio, разработанной компанией Microsoft. В данной работе используется версия MS Visual Studio Express для языка C++.
Разработка Создание среды для визуализации Рабочий цикл OGRE-приложения
Простейший рабочий цикл приложения на движке OGRE 3D состоит из следующих этапов:
-
Создание корневого объекта (Root).
-
Определение ресурсов, используемых приложением.
-
Выбор и настройка системы рендеринга (DirectX, OpenGL).
-
Создание окна для рендеринга (RenderWindow).
-
Инициализация ресурсов, которые будут использоваться.
-
Создание сцены с использованием этих ресурсов.
-
Настройка сторонних библиотек и плагинов.
-
Создание обработчиков кадров, одного или нескольких (Frame Listener).
-
Запуск цикла рендеринга.
Подготовительные процедуры
Корневой объект – это ядро библиотеки OGRE и должен быть создан до того, как что-либо делать в движке.
mRoot = new Ogre::Root(mPluginsCfg);
В рабочем каталоге с приложением должен лежать конфигурационный файл, содержащий пути к ресурсам, которые могут быть использованы в программе. Список ресурсов должен быть получен и обработан приложением перед использованием.
OgreApplication::OgreApplication(void)
: mRoot(0),
mResourcesCfg(Ogre::StringUtil::BLANK),
mPluginsCfg(Ogre::StringUtil::BLANK)
...
Ogre::ConfigFile cf;
cf.load(mResourcesCfg);
Базовая версия OGRE 3D поддерживает две системы рендеринга – OpenGL и DirectX. Так как приложение ориентировано на семейство операционных систем Windows, то предпочтительнее использование DirectX.
RenderSystem *rs = mRoot->getRenderSystemByName("Direct3D9 Rendering Subsystem");
mRoot->setRenderSystem(rs);
rs->setConfigOption("Full Screen", "No");
rs->setConfigOption("Video Mode", "800 x 600 @ 32-bit colour");
Окно для рендеринга RenderWindow содержит в себе выводимое изображение.
mWindow = mRoot->initialise(true, "Ogre Render Window");
Необходимо определить, какие ресурсы будут подгружены и использованы в программе:
// Set default mipmap level (note: some APIs ignore this)
Ogre::TextureManager::getSingleton().setDefaultNumMipmaps(5);
// initialise all resource groups
Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
Создание сцены
Создание сцены состоит из трёх подэтапов:
-
Создание менеджера сцены (SceneManager).
-
Создание камеры (Camera).
-
Создание порта просмотра (Viewport).
Менеджер сцены используется для размещения на сцене объектов, задания освещения, эффектов тумана и других операций с объектами на сцене.
mSceneMgr = mRoot->createSceneManager("DefaultSceneManager");
Камеры (одна или несколько) используются для вывода изображения, попадающего в их объектив, на порт просмотра Viewport, который необходимо ассоциировать с окном рендеринга RenderWindow.
mCamera = mSceneMgr->createCamera("PlayerCam");
mCamera->setPosition(Ogre::Vector3(0,0,80));
mCamera->lookAt(Ogre::Vector3(0,0,-300));
Ogre::Viewport* vp = mWindow->addViewport(mCamera);
vp->setBackgroundColour(Ogre::ColourValue(0,0,0));
mCamera->setAspectRatio(Ogre::Real(vp->getActualWidth()) / Ogre::Real(vp->getActualHeight()));
На сцену необходимо добавить предварительно созданную модель аудитории:
Ogre::Entity* scene = mSceneMgr->createEntity("Scene", "504.mesh");
Ogre::SceneNode* sceneNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
sceneNode->attachObject(scene);
Запуск цикла рендеринга
После завершения приготовительных операций запускается рендеринг:
void Root::startRendering(void)
{
assert(mActiveRenderer != 0);
mActiveRenderer->_initRenderTargets();
clearEventTimes();
mQueuedEnd = false;
while( !mQueuedEnd )
{
WindowEventUtilities::messagePump();
if (!renderOneFrame())
break;
}
}
При рендере каждого кадра обновляются состояния объектов и вызываются методы, требующие обработки на каждом кадре:
bool Root::renderOneFrame(void)
{
if(!_fireFrameStarted())
return false;
if (!_updateAllRenderTargets())
return false;
return _fireFrameEnded();
}
Данных действий достаточно, чтобы получить модель сцены в движке (см. рис. 1).
Рисунок 1: Сцена съёмки в движке OGRE 3D
Реализация протокола передачи команд управления виртуальными камерами из внешней программы
Сетевое взаимодействие осуществляется посредством библиотеки OgreSocks. В проект добавляется объект-сервер, которому передаётся указатель на виртуальную камеру:
mStrLsnr = new StreamListener(mCamera);
Перед использованием OgreSocks необходимо инициализировать:
OgreSocks::OgreSocksManager::GetSingleton()->Initialise();
mRemoteControl = NULL;
Описываются методы, которые будут вызваны в случае сетевых событий:
try
{
OgreSocks::OgreSocksManager::GetSingleton()->CreateSocket(mRemoteControl, LISTENING_PORT);
mRemoteControl->SetConnectListener(OgreSocks::MakeConnectCallback(StreamListener, RemoteConnect));
mRemoteControl->SetReceiveListener(OgreSocks::MakeReceiveCallback(StreamListener, RemoteReceive));
mRemoteControl->SetDisconnectListener(OgreSocks::MakeDisconnectCallback(StreamListener, RemoteDisconnect));
}
catch(OgreSocks::OgreSocksException& e)
{
MessageBox(NULL, "Caught OgreSocks Exception!", e.getFullDescription().c_str(), MB_OK);
}
Здесь LISTENING_PORT – порт, на котором работает данный сервер. Если на этот порт приходят данные, они разбиваются на символы и обрабатываются:
for(std::list::iterator iter=data.begin(); iter!=data.end(); iter++)
{
char c = (*iter);
switch(c)
{
case 'w':
m_pCam->pitch(Ogre::Degree(mRotate));
break;
case 's':
m_pCam->pitch(Ogre::Degree(-mRotate));
break;
case 'a':
m_pCam->yaw(Ogre::Degree(mRotate));
break;
case 'd':
m_pCam->yaw(Ogre::Degree(-mRotate));
break;
}
}
Виртуальная камера вращается нажатием на символы WASD при удалённом управлении.
Реализация протокола передачи изображения с виртуальных камер во внешнюю программу
Для организации передачи изображений добавляется транслирующий сервер:
OgreSocks::OgreSocksManager::GetSingleton()->CreateSocket(mStreamingServer, STREAMING_PORT);
mStreamingServer->SetConnectListener(OgreSocks::MakeConnectCallback(StreamListener, StreamConnect));
mStreamingServer->SetDisconnectListener(OgreSocks::MakeDisconnectCallback(StreamListener, StreamDisconnect));
Подготавливается текстура, на которую будет транслироваться изображение с камеры:
// Creating render-to-texture
m_spTex = Ogre::TextureManager::getSingleton().createManual("StreamTex" ,
Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
Ogre::TEX_TYPE_2D, CAMERA_WIDTH, CAMERA_HEIGHT,
0, Ogre::PF_R8G8B8, Ogre::TU_RENDERTARGET);
pRenderTex = m_spTex->getBuffer()->getRenderTarget();
pRenderTex->addViewport(m_pCam);
Ogre::Viewport* vp = pRenderTex->getViewport(0);
vp->setClearEveryFrame(true);
vp->setBackgroundColour(Ogre::ColourValue::Black);
vp->setOverlaysEnabled(true);
pBox = Ogre::PixelBox(CAMERA_WIDTH, CAMERA_HEIGHT, 1, m_spTex->getFormat());
pBox.data = new Ogre::uchar[m_spTex->getBuffer()->getSizeInBytes()];
pRenderTex->addListener(this);
pRenderTex->setAutoUpdated(true);
После каждого цикла рендера осуществляется отправка полученного кадра:
// Sending videostream
if (mStreamingServer->GetNumConnections())
{
pRenderTex->copyContentsToMemory(pBox, Ogre::RenderTexture::FB_FRONT);
img.loadDynamicImage((Ogre::uchar*)pBox.data, CAMERA_WIDTH, CAMERA_HEIGHT, m_spTex->getFormat());
img.encode("jpg");
const char* char_buffer = (const char*)img.getData();
m_buffer.assign(char_buffer, char_buffer + CAMERA_WIDTH * CAMERA_HEIGHT);
mStreamingServer->Send(m_buffer);
m_buffer.clear();
}
|