基于Pan手势在Y轴上旋转SCNNode

Rotating SCNNode on Y Axis Based on Pan Gesture

我有一个使用平移手势旋转的模型。它工作正常,但不能 360 度旋转。它旋转到 180,然后停止。此外,如果我结束平移手势并再次开始,则位置将被重置。这是我的代码。

 @objc func panned(recognizer :UIPanGestureRecognizer) {

        var newAngleY :Float = 0.0

        if recognizer.state == .changed {

            let sceneView = recognizer.view as! ARSCNView
            let touchPoint = recognizer.location(in: sceneView)
            let translation = recognizer.translation(in: sceneView)

            print(translation.x)

            let scnHitTestResults = self.sceneView.hitTest(touchPoint, options: nil)

            if let hitTestResult = scnHitTestResults.first {

                let chairNode = hitTestResult.node

                newAngleY = (Float)(translation.x)*(Float)(Double.pi)/180
                newAngleY += chairNode.eulerAngles.y/180
                chairNode.eulerAngles.y = newAngleY
            }
        }

        else if recognizer.state == .ended {
            currentAngleY = newAngleY
        }

    }

你可以试试这个:

创建 var currentAngleY: Float = 0.0

然后在您的 PanGestureRecognizer 中尝试以下操作:

/// Rotates An Object On It's YAxis
///
/// - Parameter gesture: UIPanGestureRecognizer
@objc func rotateObject(gesture: UIPanGestureRecognizer) {

    guard let nodeToRotate = currentNode else { return }

    let translation = gesture.translation(in: gesture.view!)
    var newAngleY = (Float)(translation.x)*(Float)(Double.pi)/180.0
    newAngleY += currentAngleY

    nodeToRotate.eulerAngles.y = newAngleY

    if(gesture.state == .ended) { currentAngleY = newAngleY }
}

nodeToRotate指的是我已经选择的一个SCNNode,但是你应该可以根据自己的需要调整它。