FaceFilter API позволяет легко создавать фильтры, похожие на Snapchat, в вашем веб-приложении. Построенный на основе нашей нейронной сети распознавания лиц, он сочетает в себе мощь глубокого обучения с универсальностью WebGL / Three.js.

Предварительные требования: для этого урока вам потребуется только хорошее знание Javascript и хорошее понимание основ Three.js.

Хорошо, давайте создадим наш первый фильтр!

Создание папки нашего проекта

Первый шаг: клонируйте или загрузите репозиторий faceFilterAPI (https://github.com/jeeliz/jeelizFaceFilter). Демоверсии находятся по адресу ./demos/threejs. Для этого урока мы создадим очень простой фильтр, в который добавим шляпу Луффи из One Piece!

Демонстрация «куба» - очень хорошее место для начала нашего проекта: этот фильтр добавляет трехмерный куб к обнаруженному лицу, что довольно близко к тому, что мы хотим сделать.

Давайте продублируем папку cube и переименуем ее в luffys_hat.

Примечание: для запуска FaceFilter API наши ресурсы должны обслуживаться через локальный сервер. В командной строке из корня папки нашего проекта запустите сценарий httpServer.py и посетите localhost: 8455, чтобы просмотреть демонстрации.

Структура проекта

Давайте начнем с того, что посмотрим, как устроена наша недавно созданная папка:

Довольно просто, да? Код, который добавляет наш фильтр, находится в demo.js. Если вы посмотрите на него, вы увидите, что код разделен на две функции:

  • main (): обрабатывает инициализацию FaceFilter API.
  • init_threeScene (): обрабатывает создание сцены three.js вместе с тем, что мы помещаем в эту сцену. Здесь будет добавлена ​​наша шапка.

На данный момент куб расположен в центре лица пользователя. Заменим ее на нашу классную шапку!

Мы сделаем это, выполнив два шага:

  1. Используйте Blender, чтобы экспортировать нашу модель шляпы в JSON. ПРЕДУПРЕЖДЕНИЕ ОБ СПОЙЛЕРЕ: это будет более сложная часть
  2. Импортируйте файл JSON в наш проект и добавьте его в нашу сцену.

Экспорт нашей 3D-модели JSON из Blender

Придется использовать Blender, программу для трехмерной компьютерной графики с открытым исходным кодом. Это позволит нам преобразовать нашу 3D-модель в JSON, который является суперэффективным и малоразмерным форматом.

В Blender откройте вкладку File, щелкните файл импорта, а затем выберите соответствующий формат. Теперь вы должны увидеть шляпу в центре окна просмотра.

Теперь нам понадобится специальный экспортер Three.js, чтобы получить нашу шляпу в JSON. Для этого нам нужно загрузить или клонировать репозиторий Three.js на Github (https://github.com/mrdoob/three.js/) и изменить каталоги на three.js / utils / exporters / blender. / addons /. Оказавшись там, вы должны найти папку с именем io_three. Затем мы сжимаем эту папку в zip-файл, который будем использовать для установки экспортера.

Вернемся к Blender. Сначала щелкните вкладку «Файл», затем «Настройки». Щелкните вкладку «Надстройки», а затем внизу выберите «Установить надстройку из файла…».

Выберите вашу недавно заархивированную папку.

Последний шаг - использовать панель поиска в верхнем левом углу вкладки пользовательских настроек, чтобы найти надстройку «Три» в вашем списке, а затем активировать ее, установив флажок.

Примечание. Чтобы не повторять этот процесс каждый раз, когда вы хотите экспортировать модель в JSON, нажмите «Сохранить настройки пользователя».

Почти сделано!

Теперь мы экспортируем нашу модель, используя средство экспорта Three.js (Файл ›Экспорт› Three.js (JSON)). Убедитесь, что вы экспортируете все текстуры и материалы на соответствующих вкладках.

Все настроено! Выберите каталог нашего проекта, создайте папку «модели» и экспортируйте шляпу Луффи.

Хорошо, а теперь вернемся к кодированию!

Кодируем наш фильтр

Во-первых, нам нужно удалить куб из нашей сцены Three.js. Прокомментируйте строку, в которую добавлен куб:

// THREEFACEOBJ3DPIVOTED.add(threeCube);

Затем мы создадим BufferGeometryLoader и вызовем его метод .load (), передав источник и обратный вызов в качестве аргументов.

// Create the BufferGeometryLoader for our hat
var loader = new THREE.BufferGeometryLoader()
  // Load our cool hat
  loader.load(
    ‘models/luffys_hat.json’,
    function (geometry, materials) {
    }
)

Затем мы создаем материал и передаем его сетке вместе с геометрическим объектом:

loader.load(
  ‘models/luffys_hat.json’,
  function (geometry, materials) {
    // we create our Hat material
    var mat=new THREE.MeshBasicMaterial({
      // load the texture using a TextureLoader
      map: new THREE.TextureLoader().load( “models/Texture.jpg” )
    });
    // and finally create our mesh
    const hatMesh = new THREE.Mesh(geometry, mat)
  }
)

Вы можете изменить масштаб, поворот и положение нашей шляпы, используя:

loader.load(
  ‘models/luffys_hat.json’,
  function (geometry, materials) {
    // we create our Hat mesh
    var mat=new THREE.MeshBasicMaterial({
      map: new THREE.TextureLoader().load( “models/Texture.jpg” )
    });
    const hatMesh = new THREE.Mesh(geometry, mat)
    // USE THESE METHODS TO MODIFY
    // THE SCALE, ROTATION and POSITION
    hatMesh.scale.multiplyScalar(1.2);
    hatMesh.rotation.set(0, -40, 0);
    hatMesh.position.set(0.0, 0.6, 0.0);
  }
)

Наконец, мы можем добавить нашу модель шляпы к нашей сцене:

THREEFACEOBJ3DPIVOTED.add(hatMesh)

И тадаа! Теперь вы носите свою шляпу Луффи! Как это круто?? Хотя этот пример является базовым, теперь вы можете использовать полученные знания для отображения других типов объектов.

Упражнения:

  1. Попробуйте добавить в сцену еще один объект: серьги, очки (посетите: https://www.turbosquid.com/, чтобы найти бесплатные 3D-модели).
  2. Поиграйте с позицией и параметрами масштаба и придайте себе тупой стиль!

Подвести итог

Поздравляем с созданием вашего первого фильтра с API FaceFilter от Jeeliz!

В этом уроке мы увидели, как обрабатывать 3D-модель с помощью Blender. Мы также узнали, как добавить 3D-модель в нашу сцену Three.js. Довольно круто, да !? Тем не менее, наш фильтр не на 100% реалистичен: тени отключены, и когда пользователь поднимает голову, шляпа закрывает его лицо. Не беспокоиться! Мы будем улучшать фильтр шляпы нашего Луффи в следующем уроке.

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