2017-06-23 3 views
8

Ich habe einen einfachen SCNNode in ARKit und ich versuche, es zu ziehen, wo auch immer ich meinen Finger auf dem Telefon bewegte. Hier ist mein Code.Ziehen von SCNNode in ARKit Verwenden von 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) 
     } 
    } 

Das Problem ist, dass der Widerstand sehr langsam und nicht glatt ist.

+0

zu dieser Frage Werfen Sie einen Blick: https: // Stackoverflow .com/questions/6672677/how-to-use-uipangesture-recognizer-zu-bewegen-objekt-iphone-ipad. Sie sollten mit Schwenkgesten korrekt arbeiten. –

+0

Hat dies für Sie funktioniert? – mergesort

+0

Fragen Sie sich, ob Sie John Doe etwas herausgefunden haben. –

Antwort

0

Ich hatte ein ähnliches Problem. Während Sie Johns Ratschlag in den Kommentaren verwenden sollten und die Pan-Gesten-Zustände korrekt verwenden (Begin, Changed, Ended), glaube ich, dass das Problem darin liegt, dass Sie den hitResult.node greifen, wenn Sie den Elternknoten des Knotens greifen sollten, oder Sogar die Eltern der Eltern, etc ... Ich hatte dieses Problem und endete damit, es zu beheben, indem ich die übergeordneten Ebenen hinaufging, bis das gesamte Objekt ausgewählt wurde, anstatt eines Teils davon.

1

Ich handle Übersetzung mit PanGesture wie folgt. Die Division durch 700 zu glätten und die Geschwindigkeit der Bewegung anpassen, ich auf diesen Wert durch Versuch oder Fehler erreicht hat, kann man damit experimentieren wollen

@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 
     } 
    } 
} 
Verwandte Themen