首页 > 解决方案 > ARCore 和 Sceneform - 将法线贴图添加到规范的面部网格纹理

问题描述

我正在使用 ARCore Sceneform 开发 AR 应用程序。我试图将法线贴图添加到面部网格纹理。但是没有可用的文档或演示。

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);
    }
}

标签: androidaugmented-realityarcoresceneform

解决方案


Sceneform 框架为您提供了一个默认材质定义,允许开发人员获得看似合理的材质。因此,您可以使用文件中的 ish 代码normal map为您的规范面部网格添加一个。JSON.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',
    },
  ],
}

推荐阅读