使用ARKit 3仅跟踪屏幕中心的AR锚点,可以通过以下步骤实现:
import ARKit
@IBOutlet var arView: ARSCNView!
let arConfiguration = ARWorldTrackingConfiguration()
viewDidLoad()
方法中设置AR视图的会话配置和委托:override func viewDidLoad() {
super.viewDidLoad()
arView.session.run(arConfiguration)
arView.delegate = self
}
renderer(_:didAdd:for:)
:func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
// 检查新添加的锚点是否是AR平面锚点
guard let planeAnchor = anchor as? ARPlaneAnchor else { return }
// 创建一个平面节点
let planeNode = createPlaneNode(anchor: planeAnchor)
// 将平面节点添加到场景中
node.addChildNode(planeNode)
// 仅保留屏幕中心的平面节点
let screenCenter = CGPoint(x: arView.bounds.midX, y: arView.bounds.midY)
let hitTestResults = arView.hitTest(screenCenter, types: .existingPlaneUsingExtent)
if hitTestResults.isEmpty {
node.removeChildNode(planeNode)
}
}
createPlaneNode()
来创建平面节点:func createPlaneNode(anchor: ARPlaneAnchor) -> SCNNode {
let planeGeometry = SCNPlane(width: CGFloat(anchor.extent.x), height: CGFloat(anchor.extent.z))
let planeNode = SCNNode(geometry: planeGeometry)
planeNode.position = SCNVector3(anchor.center.x, 0, anchor.center.z)
planeNode.eulerAngles.x = -.pi / 2
return planeNode
}
通过以上步骤,ARKit 3将仅在屏幕中心检测到的平面上创建AR锚点。请注意,这仅是一个简单的示例,您可以根据您的需求扩展和修改代码。