如何将固定的 SCNNode 附加到 ARKit 的 pointOfView?

How to attach SCNNode fixed to ARKit's pointOfView?

我正在尝试做一些简单的事情,但我 运行 遇到了一个破坏 ARKit 体验的问题。

我想将 3d 模型 (SCNNode) 固定到 phone 屏幕上的某个位置。我能够做到这一点,但目前的体验似乎很糟糕。当我将我的节点添加到场景中时,我的节点在它冻结到位之前有大约一秒钟左右的时间移动。这个初始移动非常糟糕,因为节点可能会冻结在相机的视野之外(因此您不会在屏幕上看到它)。

我使用的代码:

let scene = SCNScene(named: "resources.scnassets/model.scn")!
let node = scene.rootNode.childNode(withName: "model", recursively: true)!

// this puts the node in front & slightly below the camera
let orientation = SCNVector3(x: 0, y: -0.4, z: -1)

node.position = orientation

let physicsBody = SCNPhysicsBody(
    type: .static,
    shape: SCNPhysicsShape(geometry: SCNSphere(radius: 0.1))
)
node.physicsBody = physicsBody

sceneView.pointOfView?.addChildNode(node)

这段代码很简单,就是在场景的camera节点前面添加节点。但是我 运行 遇到了这样一个问题,当节点被添加到场景中时,它在冻结到位之前有一秒钟在屏幕上移动(当我移动 phone 时)。我需要做的是让节点出现在屏幕上的固定位置(固定在相机的视角)。

我不想将我的节点锚定到现实世界中的某个地点。我希望我的节点位置取决于相机的视角。

附加节点以使其停留在 phone 屏幕上的同一位置的正确方法是什么?

您应该使用 .kinematic 而不是 .static

Use kinematic bodies for scene elements that you want to control directly directly but whose movement manipulates other elements. For example, to allow the user to push objects around with a finger, you might create a kinematic body and attach it to an invisible node that you move to follow touch events.