ARKit根据触摸位置设置ARAnchor变换
我正在使用XCode 9上的AR入门应用程序,其中锚点是在场景中创建的:
override func touchesBegan(_ touches: Set, 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)
来获取水龙头的touches.first?.location(in: sceneView)
,也就是说,只是点到屏幕左上角的距离,但我不确定如何将这些2D pt坐标应用于锚以米为单位变换,也不适用于它们的轴。
我假设您指的是Apple的ARKitExample
项目“将虚拟对象置于增强现实中”。
看看在屏幕中移动(已经放置)模型时正在调用的方法VirtualObject.translateBasedOnScreenPos(_:instantly:infinitePlane:)
– 基本上需要解决您描述的相同问题。
你会发现这反过来调用ViewController.worldPositionFromScreenPosition(_:objectPos:infinitePlane:)
。
从这种方法中提取,他们的方法是:
总是先对现有的飞机锚进行打击测试。 (如果存在任何此类锚点且仅在其范围内。)
通过针对特征点云的命中测试收集有关环境的更多信息,但不要返回结果。
如果需要或必要(没有好的function命中测试结果):对无限水平面进行测试(忽略现实世界)。
如果可用,如果跳过对无限平面的命中测试或没有命中无限平面,则返回命中测试的结果与高质量特征。
作为最后的手段,对function执行第二次未经过滤的命中测试。 如果场景中没有任何特征,则此处返回的结果将为零。
如您所见,他们会考虑可能或可能不适用于您的用例的各个方面。 考虑研究和重复使用(部分)他们的方法。
- 在iOS图表pieChart中为每个切片添加图像
- UIImagePickerController出现但摄像头无法在iOS 5上启动
- 如何使用Sprite Kit减慢运行SKAction followPath的SKSpriteNode以获得慢动作效果?
- 从头重写iOS应用程序“无法更改应用程序上的可执行权限”。
- 如何通过Segue传递variables从一个子类到一个SecondViewController
- 如何从Alamofire错误得到底层错误?
- 我们可以locking应用程序,而iPhone进入睡眠模式?
- 多人游戏在Android,iPhone和networking
- 应用程序login问题使用SWRevealViewController