ios - 在 ARKit 中检测平面
问题描述
当应用程序在 ARKit 中检测到至少一架飞机时,我如何收到通知?
我目前正在做这样的事情,但它没有触发/它不相关:
extension MyViewController: ARSCNViewDelegate, ARSessionDelegate {
internal func setupAR() {
let scene = SCNScene()
sceneView.scene = scene
let configuration = ARWorldTrackingConfiguration()
configuration.planeDetection = [.horizontal]
sceneView.session.delegate = self
sceneView.session.run(configuration)
}
public func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {
if !anchors.isEmpty {
print("ANCHORS NOT EMPTY")
planesDetectedState()
} else {
print("Anchors is empty")
}
}
}
解决方案
如果你想检测ARAnchors
有几种方法可以做到这一点。
第一:您可以使用ARSessionDelegate
回调:
public func session(_ session: ARSession, didAdd anchors: [ARAnchor]) { }
哪个:
告诉代理一个或多个锚点已添加到会话中。
因此,使用此回调的示例如下所示:
extension UIViewController: ARSessionDelegate{
public func session(_ session: ARSession, didAdd anchors: [ARAnchor]) {
//1. If We Have At Least One ARAnchor Detected The Log The Information
if !anchors.isEmpty {
anchors.forEach { (anchor) in
print("""
The Type Of Anchor = \(anchor.classForCoder)
The Anchor Identifier = \(anchor.identifier)
The Anchor Translation = X: \(anchor.transform.columns.3.x), Y: \(anchor.transform.columns.3.y), Z: \(anchor.transform.columns.3.z)
""")
}
}
}
}
第二:您可以使用ARSCNViewDelegate
回调:
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor)
哪个:
告诉代理对应于新 AR 锚点的 SceneKit 节点已添加到场景中。
因此,使用此回调的示例如下所示:
extension ViewController: ARSCNViewDelegate{
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
//1. Check An ARPlane Anchor Has Been Detected
guard let planeAnchor = anchor as? ARPlaneAnchor else { return }
//2. Get The Width & Height Of The Plane
let width = CGFloat(planeAnchor.extent.x)
let height = CGFloat(planeAnchor.extent.z)
//3. Create An SCNPlane So We Can Visualize The Plane Detected
let plane = SCNPlane(width: width, height: height)
//4. Set It's Colour
plane.materials.first?.diffuse.contents = UIColor.cyan
//5. Create An SCNNode To Hold Our Plane
let planeNode = SCNNode(geometry: plane)
//6. Position & Rotate It
let x = CGFloat(planeAnchor.center.x)
let y = CGFloat(planeAnchor.center.y)
let z = CGFloat(planeAnchor.center.z)
planeNode.position = SCNVector3(x,y,z)
planeNode.eulerAngles.x = -.pi / 2
//7. Add It To The Node For Anchor
node.addChildNode(planeNode)
}
}
推荐阅读
- google-app-engine - 无法在浏览器中访问 Google App Engine
- laravel-7 - 安装 Laravel UI 等软件包
- uwp - 无法启动 UNO UWP 项目
- java - Spring Boot 单元测试如何加载文件
- wordpress - 如何将 Authorize.net API 导入 Wordpress?
- node.js - NodeJS express 添加 style.css 静态
- javascript - 猫鼬返回空数组
- java - Spring Boot JPA Native Query - 不是基于参数的空检查
- spring-tools-4 - sts 4.7.0.RELEASE 启动嵌入式mongo
- c# - 如何检查 RGB 颜色以及如何知道此范围是绿色还是红色?