2016-05-18 9 views
3

タッチでSceneKitのノードを移動しようとしています。 ここでコードを使用しています:Move a specific node in SceneKit using touchtouchを使用してSceneKitのノードを移動する

問題は、私がpanGestureを開始するたびに、タッチするオブジェクトがシーンの左隅に移動を開始することです。その位置から移動して離しても問題ありません。パンニングが始まるたびに、オブジェクトは左隅からリセットされます。ズームアウトすると、この新しいズームレベルの角からリセットされます。

私のコードは次のとおりです。

globalPanRecognizer = UIPanGestureRecognizer(target: self, 
    action:#selector(ViewController.dragObject(_:))) 
objectView.addGestureRecognizer(globalPanRecognizer) 

これらの値は、次のとおりです。これを行うことによって呼び出され

func CGPointToSCNVector3(view: SCNView, depth: Float, point: CGPoint) -> SCNVector3 { 
    let projectedOrigin = view.projectPoint(SCNVector3Make(0, 0, depth)) 
    let locationWithz = SCNVector3Make(Float(point.x), Float(point.y), projectedOrigin.z) 
    return view.unprojectPoint(locationWithz) 
} 
func dragObject(sender: UIPanGestureRecognizer){ 
    if(movingNow){ 
     let translation = sender.translationInView(sender.view!) 
     var result : SCNVector3 = CGPointToSCNVector3(objectView, depth: tappedObjectNode.position.z, point: translation) 
     tappedObjectNode.position = result 
    } 
    else{ 
     let hitResults = objectView.hitTest(sender.locationInView(objectView), options: nil) 
     if hitResults.count > 0 { 
      movingNow = true 
     } 
    } 
    if(sender.state == UIGestureRecognizerState.Ended) { 
    } 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    let scnView = objectView 
    scnView.backgroundColor = UIColor.whiteColor() 
    scnView.autoenablesDefaultLighting = true 
    scnView.allowsCameraControl = true 

私は一時的にDragObject型前allowsCameraControlのパン機能を無効にしていますCGPointToSCNVector3への最初の呼び出しの内部で:

tappedObjectNodeの
  • 初期値:SCNVector3(X:0.100000001、Y:0.100000001、Z:3.0)
  • projectedOrigin:SCNVector3(X:261.613159、Y:285.530396、Z:0.949569583) - これは異常に大きな
  • ありますCGPointToSCNVector3によって返さ
  • 値:SCNVector3(X:1.03418088、Y:1.9734658、Z:4.64346933)

IはCGPointToSCNVector3が、運の異なるバリエーションで果たしています。 この現象の原因は何ですか? おかげで、

+0

を変更しました同じ動作をします。どのようにコードをコメントしたかわかりません。私はそれをやろうとしています。ありがとう –

+0

私が言及したSOリンクのコメントにリンクされている@ricksterコードと同じ動作です。 if(movingNow){ let translation = sender.translationInView(sender.view!) var offset = objectView.unprojectPoint(SCNVector3Make(Float(translation.x)、Float(translation.y)、globalProjectedOrigin.z))//ステップ5 tappedObjectNode.position.x = globalOffset.x + offset.x //ステップ6であり、y及びz他 } { せhitResults = objectView.hitTest(sender.locationInView(objectView)、オプション:ゼロ) ..nextコメント } –

+0

を継続: '場合hitResults.count> 0 { globalWorldCoordinates = hitResults [0] .worldCoordinates //ステップ2 globalProjectedOrigin = objectV (ここでコードの書式設定を行うことはできませんが、このコードの書式設定はできません。ごめんなさい) –

答えて

3

解決策は、私はラインをコメントしているため、それがラインallowsCameraControlによるものではないので、ハローsender.translationInViewにsender.translationInView(sender.view!)(self.view!)

関連する問題