Swift / ARKit:在不接触屏幕的情况下将对象节点放置在检测到的表面上

Swift / ARKit: Place an object node on a detected surface without touching the screen

我想使用 hitTest 将我面前的物体放置在检测到的表面上,而无需触摸屏幕(如 IKEA Place 或 Snapchat)

有人有解决方案吗?

谢谢

这是在不接触屏幕的情况下将节点放置在检测到的表面上的方法。

在 viewWillAppear 中将配置添加到您的 ARSCNView。添加布尔变量,它将检查是否检测到表面。

var surfaceDetected = false

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    sceneView.delegate = self
    let configuration = ARWorldTrackingConfiguration()
    configuration.planeDetection = .horizontal
    sceneView.session.run(configuration)
}

不要忘记继承ARSCNViewDelegate协议并实现下一个方法。

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {

    guard !surfaceDetected else { return }
    surfaceDetected = true

    guard let planeAnchor = anchor as? ARPlaneAnchor else { return }

    let x = CGFloat(planeAnchor.transform.columns.3.x)
    let y = CGFloat(planeAnchor.transform.columns.3.y)
    let z = CGFloat(planeAnchor.transform.columns.3.z)
    let position = SCNVector3(x,y,z)

    sceneView.scene.rootNode.addChildNode(yourNode)
    yourNode.position = position 

}

希望对您有所帮助!