Я использую iPhone X и ARFaceKit
для захвата лица пользователя. Цель состоит в том, чтобы текстурировать лицевую сетку с изображением пользователя.
Я рассматриваю только один кадр (ARFrame
) из сеанса AR
.
Из ARFaceGeometry
у меня есть набор вершин, которые описывают грань.
Я создаю jpeg-представление текущего кадра capturedImage
.
Затем я хочу найти координаты текстуры, которые отображают созданный jpeg на вершины сетки. Я хочу: 1. отобразить вершины из пространства модели в мировое пространство; 2. отобразить вершины из мирового пространства в пространство камеры; 3. Разделите по размеру изображения, чтобы получить координаты пикселей для текстуры.
let geometry: ARFaceGeometry = contentUpdater.faceGeometry!
let theCamera = session.currentFrame?.camera
let theFaceAnchor:SCNNode = contentUpdater.faceNode
let anchorTransform = float4x4((theFaceAnchor?.transform)!)
for index in 0..<totalVertices {
let vertex = geometry.vertices[index]
// Step 1: Model space to world space, using the anchor transform
let vertex4 = float4(vertex.x, vertex.y, vertex.z, 1.0)
let worldSpace = anchorTransform * vertex4
// Step 2: World space to camera space
let world3 = float3(worldSpace.x, worldSpace.y, worldSpace.z)
let projectedPt = theCamera?.projectPoint(world3, orientation: .landscapeRight, viewportSize: (theCamera?.imageResolution)!)
// Step 3: Divide by image width/height to get pixel coordinates
if (projectedPt != nil) {
let vtx = projectedPt!.x / (theCamera?.imageResolution.width)!
let vty = projectedPt!.y / (theCamera?.imageResolution.height)!
textureVs += "vt \(vtx) \(vty)\n"
}
}
Это не работает, но вместо этого я получаю очень фанковое лицо! Где я ошибаюсь?