ARKit根据触摸位置设置ARAnchor变换

2024-02-14

我正在 XCode 9 上使用 AR 入门应用程序,其中在点击场景中创建锚点:

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. 始终首先对现有平面锚进行撞击测试。 (如果存在任何此类锚点并且仅在其范围内。)

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

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

  4. 如果可用,如果针对无限平面的命中测试是,则返回针对高质量特征的命中测试的结果 跳过或没有击中无限平面。

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

正如您所看到的,他们考虑了可能适用或可能不适用于您的用例的各个方面。考虑研究和重用他们的(部分)方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ARKit根据触摸位置设置ARAnchor变换 的相关文章

随机推荐