humbleCoder
humbleCoder

Reputation: 473

Using UIPanGesture to move node in ARScene

so I'm trying to set up a pan gesture to move a node within a sceneview to another area of the view. For example, if I place a cup on a flat surface I want the ability to be able to move the cup to another location on that surface. I have this so far from looking at other questions, but was still confused.

@objc func panGesture(sender: UIPanGestureRecognizer){

    let sceneView = sender.view as! ARSCNView
    let pannedLocation = sender.location(in: sceneView)
    let hitTest = sceneView.hitTest(pannedLocation)

    let state = sender.state

    if(state == .failed || state == .cancelled){
        return
    }

    if(state == .began){
        let sceneHitTestResult = hitTest.first!
    }
}

Upvotes: 0

Views: 304

Answers (1)

Clay
Clay

Reputation: 1761

check out this answer for a full playground example Drag Object in 3D View

you need to add this line to viewDidLoad

sceneView.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(panGesture(_:))))

The basic panGesture function is...

@objc func panGesture(_ gesture: UIPanGestureRecognizer) {     

gesture.minimumNumberOfTouches = 1

let results = self.sceneView.hitTest(gesture.location(in: gesture.view), types: ARHitTestResult.ResultType.featurePoint)

guard let result: ARHitTestResult = results.first else {
    return
}

let hits = self.sceneView.hitTest(gesture.location(in: gesture.view), options: nil)
if let tappedNode = hits.first?.node {
    let position = SCNVector3Make(result.worldTransform.columns.3.x, result.worldTransform.columns.3.y, result.worldTransform.columns.3.z)
    tappedNode.position = position
 }

} 

Upvotes: 2

Related Questions