首页 文章

在ARKit中缩放SCNNode

提问于
浏览
2

我正在尝试使用SceneKit在ARKit中缩放椅子的3D模型 . 这是我的捏手势代码:

@objc func pinched(recognizer :UIPinchGestureRecognizer) {

        var deltaScale :CGFloat = 0.0

        deltaScale = 1 - self.lastScale - recognizer.scale

        print(recognizer.scale)

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

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

        if let hitTestResult = scnHitTestResults.first {

            let chairNode = hitTestResult.node

            chairNode.scale = SCNVector3(deltaScale,deltaScale,deltaScale)
            self.lastScale = recognizer.scale

        }

    }

它确实可以扩展,但由于一些奇怪的原因,它颠倒了3D模型 . 有什么想法吗?此外,尽管缩放有效,但是当使用捏合缩放在多个进程中使用时,它不会像不同的比例因子那样平滑且有点跳跃 .

1 回答

  • 5

    以下是我扩展节点的方法:

    /// Scales An SCNNode
    ///
    /// - Parameter gesture: UIPinchGestureRecognizer
    @objc func scaleObject(gesture: UIPinchGestureRecognizer) {
    
        guard let nodeToScale = currentNode else { return }
        if gesture.state == .changed {
    
            let pinchScaleX: CGFloat = gesture.scale * CGFloat((nodeToScale.scale.x))
            let pinchScaleY: CGFloat = gesture.scale * CGFloat((nodeToScale.scale.y))
            let pinchScaleZ: CGFloat = gesture.scale * CGFloat((nodeToScale.scale.z))
            nodeToScale.scale = SCNVector3Make(Float(pinchScaleX), Float(pinchScaleY), Float(pinchScaleZ))
            gesture.scale = 1
    
        }
        if gesture.state == .ended { }
    
    }
    

    在我的示例中,当前节点引用 SCNNode ,尽管您可以根据需要设置它 .

相关问题