【发布时间】:2021-09-08 16:09:00
【问题描述】:
我正在使用以下代码将对象保持在屏幕前并使用相机移动它。在 didUpdate frame: ARFrame 委托上,我调用 getCameraPosition()。
一切都很完美,
现在我需要一个有效的解决方案来缩短处理时间。在当前的解决方案中,我觉得有时电话会挂起。如果existingPlaneInfinite 和estimatedPlane 不可用怎么办?
这是我所做的视频link。
extension ARView {
func getCameraPosition(from: CGPoint? = nil) -> Position {
let from = from ?? self.center
var result: ARRaycastResult?
if let raycast = self.raycast(from: from,
allowing: .existingPlaneInfinite,
alignment: .horizontal).last {
result = raycast
} else if let raycast = self.raycast(from: from,
allowing: .estimatedPlane,
alignment: .horizontal).last {
result = raycast
}
return result?.worldTransform.getPosition() ?? .zero
}
}
func session(_ session: ARSession, didUpdate frame: ARFrame) {
if self.viewModel.isFirstHorizontalPlanDetected {
DispatchQueue.main.async {
self.object.position = self.arView.currentPositionOfCamera()
}
}
}
【问题讨论】:
-
"在 didUpdateFrame 委托上我调用 getCameraPosition()" Que!?在哪里?
-
我没有得到你。每次调用 didUpdate 框架委托时,我都会获得新的职位。你可以看到有问题的代码。
-
如果您存储
self.center值,您可能不需要切换到主线程。除此之外,按照@andy-fedoroff 的建议使用 ARRaycastQuery 是可行的方法 -
正确的@maxxfrazer
-
@maxxfrazer,感谢您在 Medium 上的故事。他们太棒了))
标签: swift augmented-reality arkit realitykit