ARCore и Sceneform - добавление карты нормалей к канонической текстуре сетки лица.

Я работаю над приложением AR с использованием ARCore Sceneform. Я пытался добавить карту нормалей к текстуре меша лица. Но по этому поводу нет документации или демонстрации.

Texture.builder()
   .setSource(this, R.drawable.cartoon)
   .setUsage(Texture.Usage.COLOR)
   .build()
   .thenAccept(texture -> faceMeshTexture = texture);

addOnUpdateListener:

for (AugmentedFace face: faceList) {

    if (!faceNodeMap.containsKey(face)) {

        AugmentedFaceNode faceNode = new AugmentedFaceNode(face);
        faceNode.setParent(scene);
        // faceNode.setFaceRegionsRenderable(faceRegionsRenderable);
        faceNode.setFaceMeshTexture(faceMeshTexture);
        faceNodeMap.put(face, faceNode);
    }
}

person Dheeraj Rijhwani    schedule 16.01.2020    source источник


Ответы (2)


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

person mulan    schedule 17.01.2020
comment
Я прочитал этот документ и понимаю его суть. Но я не добавляю туда никаких трехмерных объектов. Я работаю над Mesh3D и накладываю текстуру на лицо. Как я могу добавить материал к этой текстуре. - person Dheeraj Rijhwani; 18.01.2020

Фреймворк Sceneform предоставляет вам определения материалов по умолчанию, которые позволяют разработчикам получать материалы правдоподобного вида. Таким образом, вы можете добавить normal map для своей канонической сетки лица, используя код JSONish в файле .sfa или .mat.

Взгляните на этот пример на GitHub.

Вот фрагмент кода:

{
  materials: [
    {
      name: 'Planet_Mat',
      parameters: [
        { baseColorFactor: [ 1, 1, 1, 1, ], },
        { baseColor: 'Planet_Mat_baseColor', },
        { normal: 'Planet_Mat_normal', },
        { metallicFactor: 1, },
        { metallicRoughness: 'Planet_Mat_occlusionRoughnessMetallic', },
        { emissiveFactor: [ 0, 0, 0, 1, ], },
      ],
      source: 'build/sceneform_sdk/default_materials/gltf_material.sfm',
    },
  ],
  model: {
    attributes: [
      'Position',
      'TexCoord',
      'Orientation',
    ],
    collision: {},
    file: 'sampledata/models/Planet/Planet.gltf',
    name: 'Planet',
    recenter: true,
    scale: 0.5,
  },
  samplers: [
    {
      file: 'sampledata/models/Planet/Planet_Mat_baseColor.png',
      name: 'Planet_Mat_baseColor',
      pipeline_name: 'Planet_Mat_baseColor.png',
    },
    {
      file: 'sampledata/models/Planet/Planet_Mat_normal.png',
      name: 'Planet_Mat_normal',
      params: {
        usage_type: 'Normal',
      },
      pipeline_name: 'Planet_Mat_normal.png',
    },
  ],
}
person Andy Fedoroff    schedule 18.01.2020
comment
Я понимаю это, но как я буду прикреплять материал к сетке. Потому что ARCore генерирует сетку во время выполнения. Я не использую ModelRenderable. Я использую только текстуру. - person Dheeraj Rijhwani; 19.01.2020
comment
В вашем случае это невозможно сделать. Карта нормалей должна быть связана с вершинами UV модели. - person Andy Fedoroff; 19.01.2020
comment
В классе AugmentedFaceNode есть метод setFaceMeshMaterialOverride (), который принимает Материал в качестве параметра и обновляет его до сетки лица. Думаю, проблема в моем материале. - person Dheeraj Rijhwani; 19.01.2020
comment
Главный вопрос - работает ли этот метод с картами нормалей или нет? - person Andy Fedoroff; 19.01.2020
comment
Я пробую использовать MaterialFactory.makeTransparentWithTexture (), и это сработало. Сейчас я пытаюсь создать нестандартный материал. Надеюсь, это сработает. - person Dheeraj Rijhwani; 20.01.2020
comment
@DheerajRijhwani, поздравляю! - person Andy Fedoroff; 20.01.2020