首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于触摸定位的ARKit集ARAnchor变换

基于触摸定位的ARKit集ARAnchor变换
EN

Stack Overflow用户
提问于 2017-08-03 15:42:12
回答 1查看 4K关注 0票数 4

我正在使用XCode 9上的AR初学者应用程序,其中的锚是在点击场景中创建的:

代码语言:javascript
复制
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坐标应用于以米为单位的锚变换,也不确定它们适用于哪个轴。

EN

回答 1

Stack Overflow用户

发布于 2017-08-04 15:05:19

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

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

你会发现这反过来又叫ViewController.worldPositionFromScreenPosition(_:objectPos:infinitePlane:)

从这种方法中提取出来的方法是:

  1. 一定要先做一个针对现有平面锚的命中测试。(如果存在这样的锚&仅在其范围内)。
  2. 通过对特征点云进行点击测试来收集更多有关环境的信息,但尚未返回结果。
  3. 如果需要或必要(没有好的特性命中测试结果):针对无限的水平平面(忽略现实世界)进行命中测试。
  4. 如果可用,如果对无限平面的命中测试被跳过或没有无限平面被击中,则返回针对高质量特性的命中测试结果。
  5. 作为最后手段,对特性执行第二次未经过滤的命中测试。如果现场没有任何特征,这里返回的结果将为零。

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45488881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档