在ARKit中,检测到水平面时 . 我添加了一个像结构一样的平面( SCNNode ),其高度非常小,所以它看起来像地板 . 然后我在那个平面上添加更多像立方体等对象 . 现在我希望用户只能在该平面上移动立方体,它应该看起来像是只在那个表面上推动对象 . 多维数据集节点也已作为子节点添加到主场景节点 .

我添加了这样的平移手势:

let globalPanRecognizer: UIPanGestureRecognizer = UIPanGestureRecognizer(target: self,
                                                                         action: #selector(dragObject(sender:)))
self.sceneView.addGestureRecognizer(globalPanRecognizer)

这就是我在 dragObject 函数中所做的:

@objc func dragObject(sender: UIPanGestureRecognizer) {

    if(movingNow) {
        let translation = sender.translation(in: self.sceneView)
        //let result : SCNVector3 = CGPointToSCNVector3(view: self.sceneView, depth: currentTouchLocationInPlane.z, point: translation)
        let result : SCNVector3 = SCNVector3Make(Float(translation.x), Float(tappedObjectNode.position.y),currentTouchLocationInPlane.z)
        tappedObjectNode.position = result
    } else {
        let hitResults = self.sceneView.hitTest(sender.location(in: self.sceneView), options: nil)
        if hitResults.count > 0 {
            //tappedObjectNode = (hitResults.last?.node)!
            tappedObjectNode = hitResults[0].node
            movingNow = true
        }
    }
    if(sender.state == UIGestureRecognizerState.ended) {
    }
}

此代码导致移动对象,但它们不遵循放置它们的平面的边界 .

现在的代码中没有任何边界限制,我如何添加它们,所以如果用户将立方体移动到平面的边缘,它将不会更进一步 .