代码之家  ›  专栏  ›  技术社区  ›  john doe

在ARKit中缩放SCNNode

  •  3
  • john doe  · 技术社区  · 8 年前

    我正在尝试使用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 回复  |  直到 8 年前
        1
  •  13
  •   atulkhatri    6 年前

    以下是我如何缩放节点:

    /// Scales An SCNNode
    ///
    /// - Parameter gesture: UIPinchGestureRecognizer
    @objc func scaleObject(gesture: UIPinchGestureRecognizer) {
    
        let location = gesture.location(in: sceneView)
        let hitTestResults = sceneView.hitTest(location)
        guard let nodeToScale = hitTestResults.first?.node 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 ,尽管您可以随意设置。