2017-06-23 45 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 
     } 
    } 
} 
相关问题