ARKit设置ARAnchor变换基于触摸位置

问题描述:

我上了XCode 9的AR应用程序启动器,其中锚在一个场景中创建水龙头上打转转:ARKit设置ARAnchor变换基于触摸位置

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    guard let sceneView = self.view as? ARSKView else { 
    return 
    } 

    // Create anchor using the camera’s current position 
    if let currentFrame = sceneView.session.currentFrame { 

    // Create a transform with a translation of 0.2 meters in front  
    // of the camera 
    var translation = matrix_identity_float4x4 
    translation.columns.3.z = -0.2 
    let transform = simd_mul(currentFrame.camera.transform, translation) 

    // Add a new anchor to the session 
    let anchor = ARAnchor(transform: transform) 
    sceneView.session.add(anchor: anchor) 
    } 
} 

这总是导致锚在创建屏幕中间,无论我在哪里点击,这是有道理的,因为我们正在获取当前的相机变换,并只在z轴上应用平移。

我想把锚放在我实际用手指敲击的地方。我可以使用touches.first?.location(in: sceneView)获取水龙头的位置,即,屏幕左上角的点距离,但我不确定如何将这些2D pt坐标应用于以米为单位的锚点变换,也不知道它们是哪个轴适用于。

我假设你指的是苹果的ARKitExample项目“将虚拟对象放在增强现实中”。

查看当您在屏幕上移动(已放置)模型时调用的方法VirtualObject.translateBasedOnScreenPos(_:instantly:infinitePlane:) - 基本上需要解决您描述的相同问题。

你会发现这又会调用ViewController.worldPositionFromScreenPosition(_:objectPos:infinitePlane:)

从该方法提取,他们的做法是:

  1. 永远做一个击中测试第一exisiting平面锚。 (如果任何此类锚点仅在其范围内存在&)。

  2. 通过针对特征点云进行命中测试来收集有关环境的更多信息,但不返回结果。

  3. 如果需要或必要(没有好的功能命中测试结果):对无限水平面(忽略真实世界)进行命中测试。

  4. 如果可用,如果对无限飞机的命中测试跳过了 或者没有命中无限飞机,则返回高质量特征的命中测试结果。

  5. 作为最后的手段,对特征执行第二次未过滤命中测试。如果场景中没有任何功能,则返回的结果 将为零。

正如你所看到的,他们认为可能有或可能,并不适用于你的用例的各个方面。考虑研究并重新使用(部分)他们的方法。

+0

谢谢!我实际上是指在开始一个新的增强现实应用程序时得到的XCode中的框架项目,但我会看看演示应用程序。 – Elise

+0

不客气。它在这里:https://developer.apple.com/sample-code/wwdc/2017/PlacingObjects.zip NB。从应用程序菜单中打开“调试可视化”将澄清很多。 – PDK