Vision オブジェクトを使用して ARSCNView で SCNNode の位置を計算する方法がわかりません。ARSCNView で検出された顔 (VNFaceObservation) があり、.scn ファイルからノードをロードします。そして、そのノードが顔の位置で動いていたらいいのにと思います。
メソッドを使用して、面バウンディング ボックスの 2D 位置を計算します。
private func faceFrameFrom(_ box: CGRect) -> CGRect {
let origin = CGPoint(x: box.minX * sceneView.bounds.width, y: (1 - box.maxY) * sceneView.bounds.height)
let size = CGSize(width: box.width * sceneView.bounds.width, height: box.height * sceneView.bounds.height)
return CGRect(origin: origin, size: size)
}
UIViewをsceneViewサブビューとして表示し、rectを返します。顔の位置に合わせたフレームです。
ファイルからノードをロードした後、ノードをシーンに追加します。
シーン セッション デリゲートのメソッドでノードの新しい位置を計算してみます。
func session(_ session: ARSession, didUpdate frame: ARFrame)
しかし、SCNNode の位置を変更して新しい SCNVector3 を作成する方法がわかりません。デバイスが動いているとき、または顔が検出された人間が動いているときに、オフセットを計算するために SceneView.pointOfView?.simdWorld* プロパティを使用する必要があると思います。しかし、それが本当の方法であるかどうかはわかりません
この計算のためのアイデアやアルゴリズムはありますか?