1. Введение
Компьютер, использующий естественные для человека способы взаимодействия, станет настоящим технологическим прорывом. Работа по созданию таких устройств ведется уже давно. В качестве примеров успешных разработок в этом направлении, появившихся в последнее время, можно назвать сенсорные экраны, распознавание жестов и речи, отслеживание лиц и сканирование отпечатков пальцев. Все это — средства преобразования привычных нам действий в данные, которые может обработать компьютер. Подобные разработки будут особенно интересны создателям компьютерных игр.
Рисунок 1.Перенеситесь в виртуальную реальность с помощью Intel® RealSense™ SDK: наложите оцифрованное изображение самого себя на персонажа игры
Следующим большим шагом может стать полное сканирование окружающего пространства средствами perceptual computing. Таким образом, компьютер сможет создать 3D-модель окружающего пространства и всего, что в нем находится. Только представьте компьютер, который будет не хуже пользователя понимать, что расположено вокруг него. К тому же, в отличие от пользователя, который в каждый момент времени может концентрироваться только на небольшой части окружающего пространства, такое устройство будет воспринимать все одновременно.
Конечно, пройдет еще много времени, прежде чем человечество сможет воплотить подобные идеи в жизнь, но мы уже находимся на верном пути и обладаем всеми возможностями, чтобы реализовать задуманное. В пакете Intel® RealSense™ SDKреализованы различные функции, которые могут помочь в решении данной задачи, например сканирование 3D-объектов и распознавание сегментов. Сканирование и обработка новых типов данных — это первый шаг на пути к созданию компьютера, способного воспринимать окружающий мир и свое место в нем.
Рисунок 2. Пример отсканированного 3D-изображения из Intel RealSense SDK
Прочитав данную статью, вы узнаете, как на основе данных, полученных от инфракрасной камеры, создать 3D-модель человека и поместить ее в виртуальный мир.
Для понимания представленных материалов полезно знать основы преобразования данных глубины в 3D-облако точек, подробно описанные в моей предыдущей статье Технология Intel® RealSense™ и облако точек (Intel® RealSense™ Technology and the Point Cloud), а также базовые понятия 3D-графики (обработка вершин, наложение текстур и использование других элементов при создании 3D-игр и моделей).
2. Почему это важно
Чтобы принимать решения об окружающем мире, нужно понимать, что в нем происходит, и изображений в формате 2D не всегда бывает достаточно. Компьютеру необходимы данные о масштабе и пространстве, а для их передачи лучше всего подходит трехмерная модель.
Мы будем ссылаться на стандартные методы работы с 3D-графикой, а также поговорим о задачах, с которыми разработчикам придется столкнуться при появлении нового оборудования. В ближайшем будущем появятся задние ИК-камеры, работающие в режиме реального времени, и кто знает, что ждет нас после этого? Можно не сомневаться, что скоро появится множество интересных разработок, в основе которых будет лежать сканирование человека и интеграция его модели в виртуальный мир.
С практической точки зрения эта статья пригодится тем, кто собирается использовать данную технологию для внедрения отсканированных 3D-объектов в собственные программы. Мы поговорим о возможностях Intel RealSense SDK и о том, как можно дополнить их собственными программами. Кроме того, здесь будет кратко описано сшивание 3D-геометрии, которое можно использовать для решения различных задач, выходящих за рамки данной статьи.
Даже если вы не планировали создавать собственный игровой движок, понимание основных принципов его работы поможет вам справиться со сложностями, возникающими при разработке игр, и станет хорошей базой для решения более сложных задач в будущем.
3. Создание своего 3D-персонажа
Располагая одной ИК-камерой, сложно придумать удобный способ получить изображение сидящего у монитора пользователя во весь рост. Скорее всего, в кадр попадут только плечи, лицо, верхняя часть тела и руки. Поэтому кажется разумным создавать остальную часть модели стандартным способом. В качестве примера мы взяли за основу модель тела человека, голова которой является отдельным отсоединяемым элементом.
Рисунок 3. 3D-персонаж, голова которого моделируется отдельно
Преимущество такого подхода в том, что мы легко можем заменить стандартную голову персонажа головой, смоделированной на основе данных ИК-камеры. В статье про облако точекя подробно описал, как в реальном времени получить точное изображение предмета, исходя из набора сырых данных глубины. В нашем случае этот метод не даст желаемых результатов: границы лица будут размыты, волосы плохо распознаны, а задней части головы не будет вообще. Вряд ли нам бы хотелось так выглядеть в виртуальном мире. Нужен другой подход, который позволил бы исправить эти ошибки.
Можно поступить следующим образом. Возьмем за основу стандартную модель головы с предсказуемыми областями, соответствующими разным частям лица, и затем будем менять положение вершин по данным, поступающим с ИК-камеры. Данные о цвете, полученные в формате RGB с камеры, можно преобразовать в текстуру и наложить на модель головы с помощью UV-преобразований и сглаживания текстур. Чтобы добиться более точных результатов, лучше использовать отдельные снимки, а не поток данных. За счет небольших сдвигов и изменений можно найти более точное соответствие между моделью головы и разрозненными 3D-данными. На выходе получится новая голова с наложенной текстурой. Она станет частью нашего гибридного персонажа и заменит голову стандартной 3D-модели.
Рисунок 4.На текстуре персонажа предусмотрены специальные области для лица, глаз и ушей
Конечно, это только первый шаг на пути к созданию вашей копии в виртуальном мире. Но здесь нам снова понадобится ИК-камера. По данным RGB-камеры можно определить цвета кожи и одежды человека. Полученная информация о цвете повлияет на всю модель целиком, а именно на цвет рук и одежды. Поскольку нижняя часть тела не сканируется, цвет и фасон брюк, ботинок и других предметов гардероба можно изменить вручную. Такая возможность предусмотрена в большинстве RPG-игр и во многих играх от третьего лица. Ее мы в данной статье рассматривать не будем.
Вместо этого обсудим автоматическое распознавание цвета кожи и одежды. Есть много способов реализовать эту функцию. Самый простой — выбрать точку на изображении и определить значение по цвету пикселя в этой точке. Например, цвет лица можно определить по точке, расположенной в середине между левым ухом и левым глазом. А точка под подбородком, отличающаяся от только что определенного цвета кожи, будет соответствовать цвету одежды. Можно смело утверждать, что у людей цвет лица обычно совпадает с цветом рук, ног и других открытых частей тела.
Итак, мы скорректировали модель головы, ее текстуру и текстуру тела. Теперь пришло время собрать все вместе и поместить модель в виртуальный мир. За основу мы взяли 3D-персонажа, различные движения которого уже реализованы в виде стандартного набора анимаций. Он может стоять на месте, идти, бежать и выполнять другие действия. Теперь настало время выбрать, станет ли он главным героем или займет место второстепенного персонажа, с которым игрок встретится в одном из эпизодов.
4. Постепенное формирование 3D-модели головы в режиме реального времени
Мы рассмотрели основные принципы данного метода. Теперь настало время подробно поговорить о том, как накладывать лицо на модель головы. Здесь нам понадобится знание основных принципов 3D-программирования. Не будем останавливаться на процессе получения данных ИК-камеры для построения 3D-модели в режиме реального времени и информации о цвете для создания текстуры. Все это подробно описано в статье об облаке точек. Здесь мы поговорим о том, как наложить эти данные на модель головы фиксированного размера.
Рисунок 5. Каркас головы, смоделированный вручную
При создании 3D-модели необходимо следить за общим количеством ее вершин, от которого зависит число многоугольников для рендеринга. Чем их меньше, тем выше будет производительность игры. С помощью 3D-камеры можно создавать модели с сотнями вершин. При сокращении их количества теряется точность. В современных игровых движках модель головы персонажа состоит менее чем из 50 вершин, из-за чего теряется много мелких деталей и уникальных черт лица.
К счастью, этой проблемы можно избежать с помощью рельефного текстурирования. Идея заключается в том, чтобы вместо плотной сетки точек 3D-модели хранить в текстуре вектор с информацией о форме поверхности. Подробную информацию о данном методе, проиллюстрированную примерами, см. на странице http://www.mat.ucsb.edu/594cm/2010/adams_rp1/index.html. Проводя параллели с окружающим миром, текстуру можно представить как закрывающую голову ткань, изгибы которой повторяют черты лица. При этом углы искривления поверхности определяются нормалями и хранятся в пикселях текстуры. Современное игровое аппаратное обеспечение оптимизируют для быстрого рендеринга результатов, поэтому данные высокого разрешения удобнее хранить в текстурах, а не в геометрии сцены. Таким образом, получая с ИК-камеры в режиме реального времени 3D-данные высокого разрешения, можно построить карту нормалей, связанную с текстурой модели. Благодаря этой технике мелкие детали не будут теряться даже для неточных геометрических моделей с небольшим количеством вершин.
Наложить текстуру гораздо проще. Достаточно получить RGB-данные с камеры, применить их к определенной точке модели головы и смешать с уже существующей текстурой. Однако и здесь есть определенные нюансы. Обычно текстуру для модели рисует художник. Он включает в нее детали, которые не удается охватить в одном кадре, например боковые части головы и затылок. Возможное решение проблемы — совмещать RGB-текстуру, полученную по данным камеры, с текстурой головы и сглаживать ее по краям, сверху и снизу. Недостаток такого подхода в том, что вашим у 3D-модели будет только лицо. Остальные части головы — прическа, уши, боковые части и затылок — останутся нарисованными художником, что может привести к довольно печальным результатам.
Рисунок 6. Создание текстуры головы на основе одного снимка анфас
Гораздо лучше отсканировать голову с разных ракурсов, сделать несколько фотографий (прямо как в полицейском участке) и использовать их для построения модели с помощью программных средств. В Intel RealSense SDK есть соответствующий пример. Его можно запустить напрямую из папки скомпилированных исполняемых файлов.
Рисунок 7. Пример 3D-модели, построенной по результатам сканирования головы программиста
Таким образом, чтобы отображать голову 3D-персонажа с разных ракурсов, а не только в фас, потребуются не только все эти снимки, но и специальная текстура, заранее наложенная на модель. Методы, используемые с 3D-сканерами, лучше подстраивать под нужды каждого отдельного проекта. Далее мы поговорим о том, как это сделать.
Рисунок 8. 3D-сканирование головы, созданное пользователем. Методы сшивания
Есть несколько способов построения 3D-модели головы, которая бы выглядела адекватно с разных ракурсов. Например, можно взять за основу сферу и постепенно вылеплять из нее голову, словно из глины. На первом шаге нужно определить направление поворота головы. Затем поэтапно копировать черты лица на сферу, используя данные, полученные с камеры. Чтобы сформировать модель головы, потребуется несколько итераций. Поскольку сфера является связным объектом, полученная 3D-модель тоже будет связной и ее сразу можно будет использовать в играх и приложениях. Однако методы отслеживания поворота лица, реализованные в SDK, не обеспечивают должной точности. Поэтому глаза, нос и рот могут смазаться при сканировании, а сам процесс может занять довольно много времени в зависимости от выбранного метода. Это существенный недостаток данного подхода.
Более удобный способ, о котором уже упоминалось выше, — сделать несколько снимков головы под разными ракурсами и объединить их в одной модели. Можно сделать снимки по отдельности, а затем пытаться объединить их вручную с помощью специальных инструментов для работы с графикой. Однако чем дальше голова находится от камеры, тем сильнее она будет смещаться в процессе сканирования, что может помешать при объединении снимков. Если данные сканирования окажутся достаточно точными, их можно будет использовать для корректировки исходной модели, изменяя положение существующих вершин и добавляя новые. Чем больше снимков будет сделано, тем точнее получится модель. С помощью данного метода можно воссоздать голову целиком, если, сидя за столом, пользователь сможет поворачиваться на 360 градусов. Однако удерживать голову в центре в процессе сканирования очень сложно, как и преобразовывать полученные 3D-данные. В этом недостаток данного подхода.
Рисунок 9. Небольшая неточность в положении головы — и вот уже у персонажа выросло два носа
Основная сложность в том, что человек не может замереть и не двигаться. Он будет ерзать на стуле, наклоняться всем телом вперед или назад, не говоря уже о поворотах и наклонах головы.
Поэтому при построении модели выделяют набор маркеров или фиксированных вершин, которые помогают ориентироваться в полученных данных. С их помощью можно определить как положение, так и относительную ориентацию объекта. Данный метод очень удобно применять при итеративном создании модели. Тот же алгоритм обнаружения маркеров позволяет находить исходный набор вершин на каждой следующей модели и определять ее поворот, позицию и изменение масштаба относительно предыдущей. После этого исходная модель подвергается изменениям, основанным на расчетах с использованием полученных данных. При необходимости к ней также добавляют новые вершины. Этот процесс продолжается, пока есть модели для обработки. Когда они заканчиваются, наступает финальный этап.
Если в процессе создания модели накладывать новые и новые слои вершин на исходный объект, в результате получится очень много вершин, перекрывающих друг друга. Все эти лишние вершины нужно удалить. После этого следует создать новый список вершин модели и сохранить его в любом удобном формате.
5. Сохранение 3D-модели головы и использование ее в игре
Итак, мы создали виртуальную модель головы — объекта реального мира. Можно сказать, что самая сложная часть задачи уже позади. Осталось только выбрать формат файла для хранения полученной 3D-модели. К счастью, нам не придется использовать формат с поддержкой мимики, черт лица или даже координат на текстуре. Достаточно хранить информацию о цвете в виде векторов. Один из самых популярных 3D-форматов такого типа — открытый формат Wavefront OBJ. В таких файлах можно сохранить данные о геометрической фигуре в понятной для человека форме.
Чем проще они будут, тем лучше. Все сложные данные и расчеты, например информацию о выражении лица, удобнее обрабатывать с помощью специальных инструментов. Возможно, когда-нибудь появятся 3D-сканеры, которые смогут автоматически распознавать мельчайшие движения губ и глаз, а черты лица и выражения эмоций персонажа не придется прорисовывать отдельно. На самом деле достаточно всего 10 выражений, чтобы реалистично передать движение губ при разговоре. Мы не будем останавливаться на этом вопросе, однако данная статья послужит хорошей базой для тех, кто решит заняться его исследованием самостоятельно.
Чтобы сохранить 3D-модель, нужно создать файл и добавить туда несколько строк кода с описанием вершин и всего лица. Вот что получилось при использовании формата OBJ.
# Комментарии к OBJ-файлу данных о модели # Объект o mesh1 # Модель g mesh # Список вершин v 3999.993408 999.998352 -0.000000 v 3999.993408 999.998352 -0.000000 v 3999.993408 899.998352 -0.000000 vt 0.000000 -0.000000 0.000000 -0.000000 vt 1.000000 -0.000000 0.000000 -0.000000 vt 1.000000 -1.000000 0.000000 -0.000000 vn 0.000000 0.000000 1.000000 vn 0.000000 0.000000 1.000000 vn 0.000000 0.000000 1.000000 vn 0.000000 0.000000 1.000000 # Лицо f 1/1/1 3/3/3 2/2/2 f 4/4/4 6/6/6 5/5/5 f 7/7/7 9/9/9 8/8/8
Большинство инструментов разработки и средств просмотра 3D-моделей поддерживает формат OBJ, так что можно сразу проверить, что получилось. Чтобы сохранить дополнительные данные, например диффузную компоненту, потребуется создать новый формат 3D-файлов для экспорта и импорта или реализовать экспорт в один из более сложных существующих форматов. Для этой цели подойдет формат DirectX. Иногда его используют для экспорта текста, однако он поддерживает гораздо более широкий набор атрибутов, в том числе пользовательские форматы хранения вершин.
В процессе обработки 3D-модели головы ее необходимо прикрепить к модели тела, загруженного в игровой движок. Для этого вы (или ваш дизайнер) должны отметить на модели специальную точку, соответствующую шее. Именно на ней будет крепиться голова. Итак, модель головы установлена на туловище, однако мы видим, что на этом работа пока не закончена.
Рисунок 10. Первая попытка совместить нашу 3D-модель головы с телом стандартной модели
Итоговая модель изображена на рисунке 10. И хотя голова уже объединена с туловищем, персонажа пока сложно назвать убедительным. В процессе сканирования все внимание уделялось передней и боковым сторонам головы, так что верхняя и задняя части просто пропали.
6. Парик или шляпа?
Одной камеры недостаточно, чтобы отсканировать голову со всех сторон; конечно, пока мы не изобретем ИК-камеры, способные заглядывать за углы, или не придумаем, как аккуратно поворачивать пользователя на месте. Мы не рассматриваем возможность создания новых систем, например с использованием планшета, сканирующего голову со всех сторон и передающего в ПО дополнительные данные. Будем считать, что у нас есть только одна фронтальная камера и пользователь, неподвижно сидящий напротив нее.
Воспользуемся классическим решением из арсенала разработчиков игр, «нечестным», но весьма практичным. Идея проста: раз форма верхней и задней частей головы модели оставляет желать лучшего, давайте их чем-нибудь закроем. Для этого подойдет любой предмет, который впишется в атмосферу игры, например шлем космонавта, если действие разворачивается в космосе. Можно оставить выбор самому пользователю, предложив для персонажа набор стандартных причесок, удобно закрывающих несуществующие уши.
Рисунок 11. Персонаж отлично вписался в сцену, и 3D-модель головы выглядит убедительно
Такое решение может показаться не совсем честным, однако любой художник скажет вам, что для создания реалистичного персонажа недостаточно просто поставить 3D-модель головы на туловище. Они должны сочетаться друг с другом. Если задуматься, окажется, что почти в любой ситуации можно найти для головы персонажа подходящий головной убор или парик.
7. Подсказки и советы
Рекомендации
- Храните данные о цвете лица в диффузной компоненте вершины. Это избавит вас от необходимости использовать текстуру, а также послужит дополнительным преимуществом при оптимизации итоговой модели.
- Если вы хотите отсканировать голову целиком, не добавляя к модели персонажа шляпы и парики, уберите волосы назад или уложите их гелем, прежде чем приступать к сканированию. Чем ровнее они будут лежать, тем лучше получится результат. Растрепанные волосы — помеха для ИК-камеры. Они создают рассеянное изображение и мешают процессу сканирования.
Обратите внимание
- Не пытайтесь реализовать методы, описанные в данной статье, если вы плохо знакомы с программированием 3D-геометрии. Обработка направленных вершин может оказаться очень непростой.
- Не забудьте обработать данные ИК-камеры и удалить все значения, которые не согласуются с другими. Без этого вся работа окажется проделанной впустую.
8. Заключение
Мы проделали столько работы, а научились сканировать только лицо человека. Но не стоит отчаиваться! Технику, рассмотренную в данной статье, можно использовать для сканирования любых предметов и отображения их в виртуальном мире. После оцифровки своего тела главный герой фильма «Трон: наследие» сам переносится в кибер-вселенную. Возможно, в будущем это станет реальностью, и когда-нибудь люди смогут перемещаться в виртуальный мир целиком. Научившись сканировать лицо человека, мы уже сделали первый шаг в этом направлении. Нельзя сравнивать сканирование лица со сканированием чашки или игрушки, ведь в первом случае неотъемлемая часть вас самих переносится в виртуальную реальность.
Возможно, скоро в каждой компьютерной игре появится возможность создавать персонажей, которые будут полностью соответствовать внешнему виду и характеру игрока. Цифровые двойники смогут оставаться с нами на протяжении нескольких лет, переходя из игры в игру и не теряя при этом свои характерные особенности. Только представьте, что все персонажи компьютерной игры выглядят и ведут себя как их реальные двойники, да еще и разговаривают их голосами. Как бы вы стали воспринимать компьютерные игры, если бы их герои напоминали людей из реального мира? Добавляя персонажу лицо, вы его оживляете. Интересно, что получится в результате?
Об авторе
В свободное от написания статей время Ли Бэмбер (Lee Bamber) руководит британской компанией The Game Creators, которая специализируется на разработке и распространении средств создания компьютерных игр. Эта компания ведет свою историю с 1999 года. Сотрудничая с другими разработчиками игр, она создала множество популярных программ: Dark Basic, The 3D Game Maker, FPS Creator, App Game Kit (AGK). Новейшей разработкой The Game Creators стал пакет Game Guru.