【问题标题】:SceneKit: Using pan gesture to move a node that's not at originSceneKit:使用平移手势移动不在原点的节点
【发布时间】:2018-10-30 22:02:43
【问题描述】:

我有一个设置在 SCNVector3(0,0,-1) 位置的 SCNNode。以下代码沿 Z 轴向前或向后移动节点,但初始平移手势将节点移动到 (0,0,0),然后按照平移手势移动节点。

let currentPositionDepth = CGPoint()

@objc func handlePan(sender: UIPanGestureRecognizer) {    
    let translation = sender.translation(in: sceneView)
    var newPos = CGPoint(x: CGFloat(translation.x), y: CGFloat(translation.y))
    newPos.x += currentPositionDepth.x
    newPos.y += currentPositionDepth.y

    node.position.x = Float(newPos.x)
    node.position.z = Float(newPos.y)

    if(sender.state == .ended) { currentPositionDepth = newPos }
}

我希望节点从其设置的 (0,0,-1) 位置移动。我尝试将 currentPositionDepth.y 设置为 -1,但是它没有达到预期的效果。我怎样才能做到这一点?

【问题讨论】:

    标签: ios swift scenekit


    【解决方案1】:

    试试这样的:

    var previousLoc = CGPoint.init(x: 0, y: 0)
    
    @objc func panAirShip(sender: UIPanGestureRecognizer){
        var delta = sender.translation(in: self.view)
        let loc = sender.location(in: self.view)
    
        if sender.state == .changed {
            delta = CGPoint.init(x: 2 * (loc.x - previousLoc.x), y: 2 * (loc.y - previousLoc.y))
            airshipNode.position = SCNVector3.init(airshipNode.position.x + Float(delta.x * 0.02), airshipNode.position.y + Float(-delta.y * (0.02)), 0)
            previousLoc = loc
        }
    previousLoc = loc
    
    
    }
    

    我已将 0.02 因子乘以使翻译更流畅,从而使最终用户更容易。您可以将该因素更改为您喜欢的任何其他因素。

    【讨论】:

    • 如果用户在一个方向上平移并按住(不是抬起手指),此方法会导致节点继续移动,类似于操纵杆的功能。我希望节点在平移移动期间移动,但如果用户停止移动手指,则停止移动,这就是我选择原始代码的原因。然而,原始代码确实产生了我想要解决的问题。
    • 其实并没有这样做。只有当 sender.state 为 .changed 时,节点的位置才会发生变化。 .这意味着节点只有在触摸位置发生变化时才会移动。
    • @SWAT 如果我只用一根手指拖动,这将非常有效。从我用第二根手指在屏幕上点击的那一刻起,手势就会跳到另一个位置。你知道如何在不设置 numberOfMaximumTouches 的情况下禁用它吗?我需要第二根手指同时触发一个 pinchGesture。
    猜你喜欢
    • 2018-02-09
    • 2017-11-30
    • 1970-01-01
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 2018-07-17
    相关资源
    最近更新 更多