首页 > 解决方案 > 如何将混合形状 SCNNode 居中以查看

问题描述

所以我对 ARKit 和 SceneKit 还很陌生,我正在关注 Apple 的教程。https://developer.apple.com/documentation/arkit/tracking_and_visualizing_faces

我要做的是创建一个类似于 Animoji 屏幕的视图,其中包含 BlendShape 的 SCNNode 在视图中居中,并且 Blendshape 的 z 值不会根据面部与相机的距离/距离而改变. 我还想让相机不可见,这样你就只能看到 BlendShape。

解决此问题的最佳方法是什么以及如何做?

我尝试将枢轴设置为 0 并将 position.z 设置为 0,但我认为这不是正确的方法。

func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
        guard let faceAnchor = anchor as? ARFaceAnchor
            else { return }

        let blendShapes = faceAnchor.blendShapes
        guard let eyeBlinkLeft = blendShapes[.eyeBlinkLeft] as? Float,
            let eyeBlinkRight = blendShapes[.eyeBlinkRight] as? Float,
            let jawOpen = blendShapes[.jawOpen] as? Float
            else { return }
        eyeLeftNode.scale.z = 1 - eyeBlinkLeft
        eyeRightNode.scale.z = 1 - eyeBlinkRight
        jawNode.position.y = originalJawY - jawHeight * jawOpen
        node.pivot = SCNMatrix4MakeTranslation(0,0,0)
        node.position.z = 0

    }

下面的视图类似于我想要实现的,没有其他混合形状的列表。

动话表情图片

标签: iosswiftxcodescenekitarkit

解决方案


如果您对 ARKit 自动移动场景中的节点不感兴趣,您可以避免将 an 绑定SCNNodeARAnchor(即不实现-renderer:nodeForAnchor:)。相反,您会查询ARAnchorin -session:didUpdateAnchors:

事实上,由于您实际上并没有 AR 体验,而只是面部跟踪,因此您甚至不需要一个,ARSCNView而只需要一个SCNView.


推荐阅读