ARKit - 点击屏幕后物体卡在相机上

ARKit - Object stuck to camera after tap on screen

我从选择 ARKit 项目时获得的模板项目开始。当您 运行 应用程序时,您可以看到这艘船并从任何角度查看它。

但是,一旦我允许相机控制并点击屏幕或通过平移放大飞船,飞船就会卡在相机上。现在无论我带着相机走到哪里,船都粘在屏幕上。

我经历了 Apple Guide 并且似乎并不真正认为这是意外行为,因为没有关于此行为的任何内容。

缩放或触摸屏幕后如何保持船的位置固定?

嗯,看来 allowsCameraControl 根本不是答案。它对 SceneKit 有好处,但对 ARKit 不好(也许它对 AR 中的某些东西有好处,但我还没有意识到)。

为了放大视图,需要 UIPinchGestureRecognizer。

    // 1. Find the touch location
    // 2. Perform a hit test
    // 3. From the results take the first result
    // 4. Take the node from that first result and change the scale
    @objc private func handlePan(recognizer: UIPinchGestureRecognizer) {
        if recognizer.state == .changed {
            // 1.
            let location = recognizer.location(in: sceneView)

            // 2.
            let hitTestResults = sceneView.hitTest(location, options: nil)

            // 3.
            if let hitTest = hitTestResults.first {
                let shipNode = hitTest.node

                let newScaleX = Float(recognizer.scale) * shipNode.scale.x
                let newScaleY = Float(recognizer.scale) * shipNode.scale.y
                let newScaleZ = Float(recognizer.scale) * shipNode.scale.z

               // 4.
                shipNode.scale = SCNVector3(newScaleX, newScaleY, newScaleZ)

                recognizer.scale = 1
            }
        }

关于 #2. 我对另一个名为 hitTest(_:types:)

hitTest 方法有点困惑

文档注释

This method searches for AR anchors and real-world objects detected by the AR session, not SceneKit content displayed in the view. To search for SceneKit objects, use the view's hitTest(_:options:) method instead.

所以如果你想缩放 nodeSceneKit 内容

,则不能使用该方法