2017-08-31 36 views
2

我正在尝试使用平移手势识别器移动scenekit中的节点。我只是沿x轴移动它,但是我的手势使对象进一步/更快地移动,然后它甚至应该只使用小手势。我不是100%肯定,我在做什么错在这里,但这里是我的手势识别代码:Scenekit平移手势移动节点太快

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

正如我所说的物体被移动时,它只是被以难以置信的速度和距离发射。效果几乎看起来是累积的。

我想这可能是,如果我没有重置我的移动手势识别翻译的情况下,但我做的是,这里

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

我其实是想在ARKit得到这个工作场景,但我已经将所有这些都剥离出来,让一个节点正确移动,但我仍然遇到问题。

泛添加到ARSCNView,而我试图操作的节点作为childNode添加到ARSCNView.scene.rootNode,所以我想知道它是这些问题的位置/坐标。

回答

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

此代码返回CGPoint与在points视图手势位置(这是可能是像素)。但SCNNode的位置(在现实世界中)是以米为单位的位置。因此,当您在SCNVector中为X位置添加一个点时,实际上是为其添加了一米。

要将屏幕点转换为3D世界坐标,请使用unprojectPoint方法ARSCNView。您可能需要保存先前的手势位置才能找到位置更改。

+0

啊对,我们怎么去做那里的转换呢?我主要在SpriteKit工作,这显然是我试图从 – TommyBs

+0

@TommyBs转换这个代码的地方。更新回答 –

+0

'SCNVector'中的'Z'代表'unprojectPoint' - 深度,可能为您的目的为零。 –