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

时间:2018-12-26 15:15:25

标签: swift scenekit arkit

我想使用hitTest在检测到的表面上将我前面的物体放在不触摸屏幕的地方(例如IKEA Place或Snapchat)

有人知道吗?

谢谢

1 个答案:

答案 0 :(得分:1)

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

在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 

}

希望有帮助!