2017-06-23 48 views
8

我在ARKit中有一個簡單的SCNNode,我試圖將它拖動到手機的任何位置。這是我的代碼。使用SceneKit在ARKit中拖動SCNNode

@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) 
     } 
    } 

問題是拖動非常緩慢而且不平滑。

+0

採取對這個問題看:https://開頭計算器.COM /問題/ 6672677 /如何使用的,uipangesturerecognizer到移動對象,iphone,ipad的。您應該正確使用平移手勢狀態。 –

+0

這個工作適合你嗎? – mergesort

+0

想知道如果你設法弄清楚John Doe。 –

回答

0

我有類似的問題。雖然你應該在評論中使用John的建議並且使用正確的(開始,改變,結束)平移手勢狀態,但我認爲這個問題可能是因爲當你應該抓住節點的父節點時,你會抓住hitResult.node,或者甚至父母的父母等等......我有過這個問題,最終通過上升父級來修復它,直到整個對象被選中而不是其中的一部分。

1

我用PanGesture這樣處理翻譯。由700師是平滑和調整移動速度,我伸手通過試驗或錯誤值,你可能想用它做實驗

@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 
     } 
    } 
} 
相關問題