2017-06-23 49 views
8

Mam prosty SCNNode w ARKit i próbuję przeciągnąć go wszędzie tam, gdzie przesunąłem palcem w telefonie. Oto mój kod.Przeciąganie SCNNode w ARKit przy użyciu SceneKit

@objc func pan(recognizer :UIGestureRecognizer) { 

     guard let currentFrame = self.sceneView.session.currentFrame else { 
      return 
     } 

     var translation = matrix_identity_float4x4 
     translation.columns.3.z = -1.5 

     let sceneView = recognizer.view as! ARSCNView 
     let touchLocation = recognizer.location(in: sceneView) 

     let hitTestResult = sceneView.hitTest(touchLocation, options: [:]) 

     if !hitTestResult.isEmpty { 

      print("hit result") 

      guard let hitResult = hitTestResult.first else { 
       return 
      } 

      let node = hitResult.node 

      node.simdTransform = matrix_multiply(currentFrame.camera.transform, translation) 
     } 
    } 

Problem polega na tym, że przeciągnięcie jest bardzo powolne i nie jest płynne.

+0

Spójrz na to pytanie: https: // stackoverflow .pl/questions/6672677/how-to-use-uipangesturerecognizer-to-move-object-iphone-ipad. Powinieneś poprawnie pracować ze stanami gestów pan. –

+0

Czy to działa dla ciebie? – mergesort

+0

Zastanawiam się, czy udało ci się wymyślić coś z John Doe. –

Odpowiedz

0

Miałem podobny problem. Podczas gdy w komentarzach powinieneś używać porady Johna i poprawiać stan gestów pan (Began, Changed, Ended), myślę, że problem może polegać na tym, że chwytasz hitResult.node, gdy powinieneś chwytać rodzica węzła, lub nawet rodzic rodzica, etc ... Miałem ten problem i skończyło się naprawianiem go, przechodząc do poziomu nadrzędnego, aż cały obiekt został wybrany zamiast jego części.

1

Obsługuję tłumaczenie z PanGesture w ten sposób. Podział przez 700 jest gładka i dostosować prędkość ruchu, dotarłem do tej wartości przez rozprawie lub błędów, można poeksperymentować z nim

@objc func onTranslate(_ sender: UIPanGestureRecognizer) { 
    let position = sender.location(in: scnView) 
    let state = sender.state 

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

    if (state == .began) { 
     // Check it's on a virtual object 
     if let objectNode = virtualObject(at: position) { 
      // virtualObject(at searches for root node if it's a subnode 
      targetNode = objectNode 
      latestTranslatePos = position 
     } 

    } 
    else if let _ = targetNode { 

     // Translate virtual object 
     let deltaX = Float(position.x - latestTranslatePos!.x)/700 
     let deltaY = Float(position.y - latestTranslatePos!.y)/700 

     targetNode!.localTranslate(by: SCNVector3Make(deltaX, 0.0, deltaY)) 

     latestTranslatePos = position 

     if (state == .ended) { 
      targetNode = nil 
     } 
    } 
}