可以创建一个带有原始顶点而不是blendShapes的ARFaceGeometry实例,就像使用ARFaceTrackingConfiguration运行ARSession一样吗?

时间:2018-01-26 04:09:19

标签: ios swift scenekit arkit

ARFaceGeometry有一个blendShapes数组的初始化方法,但是如何使用ARFaceGeometry顶点数组创建这个对象?

在Apple的Creating Face-Based AR Experiences中,ViewController传递了一个ARFaceTrackingConfiguration实例,因此ARSession似乎创建了一个ARFaceAnchor实例,并使用TrueDepth Camera跟踪的面部更新它。这可以在VirtualContentUpdater中的ARSession代理的渲染器方法renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor)中清楚地看到。

由于此ARAnchor的ARFaceGeometry成功更新以通过VirtualContentUpdater中的virtualFaceNode?.update(withFaceAnchor: faceAnchor)匹配面部的当前状态,并且在Mask作为几何体的情况下通过faceGeometry.update(from: anchor.geometry),它必须是确实,在幕后的某个地方,ARFaceGeometry实例是从高分辨率数据(TD Camera)创建或更新的,而不是blendShapes提供的。

你知道这是怎么发生的以及我自己如何做到这一点,如果没有,你知道我怎么能找到幕后的代码来挖掘并发现它是如何使用的?利用iOS库的非公开部分是否可行?

抱歉,我对swift和iOS开发生态系统都非常陌生,因此我不确定在何处/如何找到相关代码,或者它是否可用。非常感谢任何想法或帮助,非常感谢!

2 个答案:

答案 0 :(得分:1)

ARFaceGeometry具有vertices属性,并且符合documentation

  

只有顶点缓冲了AR提供的面网格之间的变化   会话,指示当ARKit适应时顶点位置的变化   网格到用户脸部的形状和表达。

在这种情况下,混合形状系数对您有用。调用委托方法时,ARFaceGeometry已根据ARFaceAnchor内部状态进行了变异。它的完成方式完全是ARKit内部的,而不是公开曝光。

ARFaceGeometry的顶点位置仅用于更新ARSCNFaceGeometry的顶点$input = Import-Csv "C:\Scripts\input.csv" ForEach ($line in $input) { $wst = $line.LogonWorkstations If ($wst -ne "") { If (Test-Connection $wst -Count 1 -Quiet -ErrorAction SilentlyContinue) { If (Test-Path "\\$wst\c$\Program Files\xyz" -ErrorAction SilentlyContinue) { Add-Member -InputObject $line -NotePropertyName "xyz" -NotePropertyValue "exists" } } } } $input | Export-Csv "C:\Scripts\output.csv" -NoTypeInformation -Encoding Unicode 的顶点位置。

答案 1 :(得分:1)

根据您对@mnuages的回答的评论,听起来您的问题并非真正关于操纵ARSCNFaceGeometry - 这是关于尝试将在一台设备上获得的面部几何数据发送到另一台设备的更深层次问题然后渲染它(使用SceneKit)。

有两个很好的方向可以解决这个问题:

尝试混合形状

您认为传输blendShapes不会为您提供您正在寻找的结果,但您尝试过吗?根据我的经验,从faceGeometry拉出ARFaceAnchor而不是拉锚blendShapes然后使用它们来创建新的ARFaceGeometry会产生几乎相同的结果。

BYO Geometry

ARSCNFaceGeometry没有办法从“原始”顶点数据初始化。但它的超类SCNGeometry确实:

  1. 事先,为文档备注为静态的SCNGeometrySource数据部分创建SCNGeometryElementARFaceGeometry个实例:textureCoordinates和{{1缓冲区,分别为。

  2. 当您从ARKit获得新的面部锚点时,请从其triangleIndices数据创建SCNGeometrySource。然后使用该顶点源以及您事先制作的纹理坐标源和几何元素创建vertices

  3. 在节点上设置新几何体,您就可以进行渲染了。

  4. (在SceneKit中可能有更有效的方法来建立这个顶点数据,但这应该足以让你获得第一个可见的结果,至少。对不起......没有代码,因为我正在写iPad目前 - 但请检查文档中提到的符号,其余部分应该清楚。)