SceneKit - 平移手势移动节点过快

3

我目前正在尝试使用平移手势识别器在SceneKit中移动一个节点。我只沿着X轴移动它,但是即使只使用小手势,我的手势也会使对象移动得比应该快得多/远。我不确定我在这里做错了什么,但这是我的手势识别器代码:

@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场景中让它正常运行,但现在我已经把所有东西都剥离开来,只是想让一个节点正确移动,但还是遇到了问题。

这个pan是添加到ARSCNView中,而我想操作的节点是作为子节点添加到ARSCNView.scene.rootNode,所以我想知道是否它们之间的位置/坐标是问题所在。

1个回答

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

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

要将屏幕点转换为3D世界坐标,请使用ARSCNViewunprojectPoint方法。您可能需要保存先前的手势位置以便能够找到位置变化。


啊,好的,那我们怎么进行转换呢?我主要是在SpriteKit中工作的,显然我正在尝试从那里转换这段代码。 - TommyBs
SCNVector 中的 Z 代表 unprojectPoint 的深度,对于您的目的来说可能为零。 - Vasilii Muravev
谢谢,我已经快速尝试了一下,但是无论我向哪个方向移动,我的对象现在总是向左移动,但我会继续尝试并考虑保存先前的位置,就像你建议的那样。 - TommyBs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接