2017-08-31 4 views
2

J'essaie actuellement d'utiliser un système de reconnaissance de mouvement panoramique pour déplacer un nœud dans le kit de scène. Je ne fais que le déplacer le long de l'axe des x, mais mon geste déplace l'objet beaucoup plus loin/plus vite, il devrait même lorsque vous utilisez seulement de petits gestes. Je ne suis pas 100% sûr de ce que je fais mal ici, mais voici le code pour mon geste de reconnaissance:Gestes de mouvements de scène en mouvement déplaçant le nœud trop rapidement

@objc func handlePan(pan:UIPanGestureRecognizer) { 
    if pan.state == .changed { 
     let translation = pan.translation(in: pan.view!) 

     node!.position = SCNVector3(x:node!.position.x + Float(translation.x), y:node!.position.y, z:node!.position.z) 

     pan.setTranslation(CGPoint.zero, in: pan.view!) 
    } 
} 

Comme je l'ai dit l'objet est déplacé, il est juste d'être lancé à une vitesse incroyable et la distance. L'effet semble presque cumulatif.

Je pensais que ce pourrait être le cas si je ne l'ai pas remis à zéro la traduction de mon geste pan de reconnaissance, mais je fais ici que

pan.setTranslation(CGPoint.zero, in: pan.view!) 

J'essaie en fait d'obtenir ce travail dans un Arkit scénario, mais j'ai dépouillé tout cela pour obtenir un nœud se déplaçant correctement, mais j'ai toujours des problèmes. Le pan est ajouté à un ARSCNView tandis que le nœud que j'essaie de manipuler est ajouté en tant que childNode à ARSCNView.scene.rootNode, donc je me demande si ce sont les positions/coordonnées de ceux-ci qui sont le problème.

Répondre

3
let translation = pan.translation(in: pan.view!) 

Ce code renvoie CGPoint avec la position de geste dans la vue en points (ce qui est peut être pixels). Mais la position SCNNode (dans le monde réel) est la position en mètres. Ainsi, lorsque vous ajoutez un point pour la position X dans SCNVector, vous ajoutez en fait un mètre pour cela.

Pour convertir un point d'écran en coordonnées du monde 3D, utilisez la méthode unprojectPoint de ARSCNView. Vous devrez probablement sauvegarder la position du geste précédent pour pouvoir trouver les changements de position.

+0

Ah oui, comment allons-nous faire la conversion là-bas? J'ai principalement travaillé dans SpriteKit qui est évidemment où j'essaye de convertir ce code de – TommyBs

+0

@TommyBs voir la réponse mise à jour –

+0

'Z' dans' SCNVector' pour 'unprojectPoint' - est la profondeur, qui pourrait être zéro pour vos buts . –