2017-06-23 13 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

この質問に見てください、それを試してみたいこと.com/questions/6672677/how-to-use-uipangesture認識ツールから移動オブジェクト-iphone-ipad。パンジェスチャの状態で正しく作業する必要があります。 –

+0

これはあなたのために機能しましたか? – mergesort

+0

あなたが何かをJohn Doeの元に戻すことができたらどうかと思います。 –

答えて

0

私は同様の問題がありました。コメントでJohnのアドバイスを使用し、パンジェスチャの状態を正しいもの(Began、Changed、Ended)にする必要がありますが、ノードの親を取得する必要があるときにhitResult.nodeを取得している可能性があります。私はこの問題を抱えていて、オブジェクトの一部ではなくオブジェクト全体が選択されるまで、親レベルに上がることで解決しました。

1

このようにPanGestureで翻訳を処理します。します。https:// stackoverflowの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 
     } 
    } 
} 
関連する問題