【问题标题】:ARKit set ARAnchor transform based on touch locationARKit 根据触摸位置设置 ARAnchor 变换
【发布时间】:2018-01-11 08:01:41
【问题描述】:

我正在使用 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 坐标应用于以米为单位的锚点变换,也不知道哪个它们适用的轴。

【问题讨论】:

    标签: ios sprite-kit transform arkit


    【解决方案1】:

    我假设您指的是 Apple 的 ARKitExample 项目“在增强现实中放置虚拟对象”。

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

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

    从这个方法中提取出来,他们的做法是:

    1. 始终首先对现有平面锚点进行命中测试。 (如果存在任何此类锚点且仅在其范围内。)

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

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

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

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

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

    【讨论】:

    • 谢谢!我实际上指的是您在启动新的增强现实应用程序时获得的 XCode 中的骨架项目,但我将看看演示应用程序。
    • 不客气。在这里:developer.apple.com/sample-code/wwdc/2017/PlacingObjects.zip NB。从应用程序的菜单中打开“调试可视化”会澄清很多。
    • 我认为 Apple 的 worldPositionFromScreenPosition 方法专注于将 ARAnchors 放置在检测到的平面上,而不是将它们浮动在用户面前给定 z 的空间中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 2017-06-14
    相关资源
    最近更新 更多