我详细阅读了所有 ARKit 类的文档,但未发现任何地方描述如何获取用户面部的纹理。
ARFaceAnchor 包含 ARFaceGeometry(由顶点组成的拓扑和几何结构)和 BlendShapeLocation 数组(通过对用户面部顶点进行几何运算允许对个体面部特征进行操作的坐标)。
但我该从哪里获取用户面部的实际纹理呢?例如:真实肤色/颜色/质地、面部毛发以及其他独特特征,如疤痕或胎记?还是完全不可能呢?
geometry
` 着色器修改器中完成此操作。ARSCNFaceGeometry
,以创建用户面部的纹理三维模型。ARSCNFaceGeometry
来实现,但是与其通常的渲染方式不同,它在纹理空间中进行渲染,同时继续使用原始顶点位置来确定从捕获的像素数据中采样的位置。
以下链接是实现相关部分:
FaceTextureGenerator.swift
— 生成面部纹理的主要类。这设置了一个Metal渲染管道来生成纹理。
faceTexture.metal
— 用于生成面部纹理的顶点和片段着色器。这些在纹理空间中操作。
几乎所有的工作都在金属渲染通道中完成,因此它可以轻松实时运行。
我还整理了一些笔记,涵盖了演示的限制
将转换后的ARSCNFaceGeometry
渲染到1位缓冲区中,以创建image mask。基本上,您只需要找到面部模型为白色的位置,而其他所有位置都应为黑色。
将遮罩应用于捕获的帧图像。
这样可以给您一个仅包含脸部的图像(虽然您可能需要裁剪结果)。
FaceTextureGenerator.swift
以从跟踪用户面部的 ARMesh 中提取几何信息,而不是从 SceneKit 几何体中提取。 - Matt Biernerlet geometry = faceAnchor.geometry
let vertices = geometry.vertices
let size = arFrame.camera.imageResolution
let camera = arFrame.camera
modelMatrix = faceAnchor.transform
let textureCoordinates = vertices.map { vertex -> vector_float2 in
let vertex4 = vector_float4(vertex.x, vertex.y, vertex.z, 1)
let world_vertex4 = simd_mul(modelMatrix!, vertex4)
let world_vector3 = simd_float3(x: world_vertex4.x, y: world_vertex4.y, z: world_vertex4.z)
let pt = camera.projectPoint(world_vector3,
orientation: .portrait,
viewportSize: CGSize(
width: CGFloat(size.height),
height: CGFloat(size.width)))
let v = 1.0 - Float(pt.x) / Float(size.height)
let u = Float(pt.y) / Float(size.width)
return vector_float2(u, v)
}