【问题标题】:SceneKit – pan gesture is moving node too quicklySceneKit - 平移手势移动节点太快
【发布时间】:2018-02-09 07:45:11
【问题描述】:

我目前正在尝试使用平移手势识别器来移动 SceneKit 中的节点。我只是沿X 轴移动它,但是我的手势使对象移动得更远/更快,即使只使用小手势也是如此。我不是 100% 确定我在这里做错了什么,但这里是我的手势识别器的代码:

@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 而我尝试操作的节点作为 childNode 添加到 ARSCNView.scene.rootNode 所以我想知道这些的位置/坐标是否是问题所在。

【问题讨论】:

    标签: ios scenekit augmented-reality arkit


    【解决方案1】:
    let translation = pan.translation(in: pan.view!)
    

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

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

    【讨论】:

    • 啊,对了,那我们如何进行转换呢?我主要在 SpriteKit 中工作,这显然是我试图从中转换代码的地方
    • Z in SCNVector for unprojectPoint - 是深度,对于您的目的,它可以为零。
    • 谢谢,我玩得很快,但无论我以哪种方式平移,我的对象现在总是向左移动,但我会继续尝试并按照你的建议保存以前的位置
    猜你喜欢
    • 2018-10-30
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 2018-07-29
    相关资源
    最近更新 更多