Eli*_*ise 3 transform ios sprite-kit arkit
我正在玩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)
}
}
Run Code Online (Sandbox Code Playgroud)
这总是导致在屏幕中间创建锚点而不管我在哪里点击,这是有道理的,因为我们正在获得当前的相机变换并且仅在z轴上应用平移.
我想把锚放在我用手指轻拍的地方.我可以使用点击获取点击的位置touches.first?.location(in: sceneView),即距离屏幕左上角的距离,但是我不确定如何将这些2D点坐标应用于以米为单位的锚点变换,以及它们应用于哪个轴至.
我假设你指的是Apple的ARKitExample项目"将虚拟对象置于增强现实中".
看一下在VirtualObject.translateBasedOnScreenPos(_:instantly:infinitePlane:)屏幕中移动(已经放置)模型时调用的方法 - 基本上需要解决您描述的相同问题.
你会发现这反过来调用ViewController.worldPositionFromScreenPosition(_:objectPos:infinitePlane:).
从这种方法中提取,他们的方法是:
总是先对现有的飞机锚进行打击测试.(如果存在任何此类锚点且仅在其范围内.)
通过针对特征点云的命中测试收集有关环境的更多信息,但不会返回结果.
如果需要或必要(没有好的功能命中测试结果):对无限水平面进行测试(忽略现实世界).
如果可用,如果跳过对无限平面的命中测试或没有命中无限平面,则返回命中测试的结果与高质量特征.
作为最后的手段,对功能执行第二次未经过滤的命中测试.如果场景中没有任何特征,则此处返回的结果将为零.
如您所见,他们会考虑可能或可能不适用于您的用例的各个方面.考虑研究和重复使用(部分)他们的方法.
| 归档时间: |
|
| 查看次数: |
3210 次 |
| 最近记录: |