ARKit-轻按屏幕后物体粘在相机上

时间:2018-08-01 06:35:51

标签: ios swift cocoa-touch scenekit arkit

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

但是,一旦我允许摄像机控制并点击屏幕或通过平移来放大船,船就会卡在摄像机上。现在,无论我用相机走到哪里,船都固定在屏幕上。

我经历了Apple Guide,似乎并没有真正将其视为意外行为,因为这种行为没有任何意义。

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

1 个答案:

答案 0 :(得分:0)

好吧,看来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的{​​{1}}方法感到困惑

文档注释

  

此方法搜索AR锚点和被检测到的真实对象   AR会话,而不是视图中显示的SceneKit内容。寻找   对于SceneKit对象,请使用视图的hitTest(_:options :)方法   代替。

因此,如果要缩放hitTest(_:types:)内容的node,则无法使用该方法