С 2015 по 2017 год мне посчастливилось поучаствовать в достаточно интересном стартапе. Небольшая компания под названием ShareCloth сделала интересную CAD систему. Она позволяет оцифровывать лекала одежды, располагать их вокруг виртуального манекена, и одним нажатием кнопки сшивать виртуальное платье. Физический движок (собственная разработка компании) очень реалистично воспроизводит физику тканей различного типа позволяя пользователям оценить, как будет сидеть то или иное платье на конкретной фигуре. Идея данной системы - сделать переворот в индустрии быстрой моды. Изменить то, как мы покупаем одежду, вынести процесс выбора и примерки одежды в облако.
Проблема была в том, что виртуальный манекен, хотя и гибкий в настройках, плохо отражает особенности фигуры отдельно взятого человека. Было принято решение разработать сканер, позволяющий получать индивидуальную виртуальную модель человека, которая бы использовалась для примерки одежды. Меня взяли в эту компанию как раз для реализации этого проекта.
Я особенно горд этим проектом, потому что он был сделан мной буквально на коленке, программную часть делал я один, а в сборке кабинки мне помогал наш менеджер проекта. Небольшой стартап, сильно ограниченный в инвестициях, не мог себе позволить нанять большую команду разработчиков.
Что же представляет из себя система, разработанная в рамках проекта?
С технической точки зрения это небольшая кабинка, собранная из системы Joker, гипсокартонных плит и оргстекла. Да-да, мы с менеджером проекта сами её собирали. Одна стена обклеена светодиодными лентами (пайку и разводку мы тоже делали своими силами), это сделано для того чтобы источник света был рассеянным и не создавал теней. Остальные стены покрыты белой самоклеящейся плёнкой. По центру кабинки стоит вращающаяся платформа, а в углу располагается вертикальная стойка с тремя 3d камерами Intel RealSense. Светодиодная стена и платформа управляются микроконтроллером Arduino, подключенного к обычному компьютеру. В этой компании мне пришлось освоить азы программирования микроконтроллеров)))
Что касается процесса сканирования, то он выглядит следующим образом. Человек становится на платформу и стоит неподвижно во время всего процесса. Оператор нажатием одной кнопки запускает сканирование, автоматически включается освещение, платформа начинает вращаться. В это время идёт снятие данных с 3d камер. Процесс сканирования занимает порядка 30 секунд - время необходимое для того чтобы платформа сделала полный оборот. Как вы могли догадаться, полный оборот платформы нам нужен для того чтобы камеры могли сфотографировать человека со всех сторон.
После того как были получены сырые данные с камер, происходит их обработка, этот процесс занимает порядка 10 минут. Первым делом происходит предварительная обработка: на этом этапе генерируется высокополигональная модель, она очищается от мусора, вырожденных треугольников и прочего, зашиваются мелкие дыры в геометрии. Далее происходит модификация геометрии, понижается полигональность модели, полигональная сетка приводится к регулярному виду. Для низкополигональной модели человека автоматически генерируется развёртка текстурных координат. После чего выполняется анализ сделанных фотографий и генерация фотореалистичной текстуры. На завершающем этапе в низкополигональную текстурированную модель человека вписывается скелет.
Понижение полигональности требуется для того чтобы CAD система работала быстро. Зачем нужен вписанный скелет спросите вы - скелет используется CAD системой для автоматического позиционирования лекал вокруг модели человека. Ну или можно просто смешно анимировать модель при помощи скелетной анимации, как это показано на видео)))
С архитектурной точки зрения, система сканирования и постобработки реализована в виде отдельного сервиса. С этим сервисом взаимодействует управляющая программа для оператора с красивым интерфейсом. Управляющая программа выполнена в двух видах: обычное десктопное приложение на Qt и веб сервис, который можно запустить на планшете.