【问题标题】:Scaling a SCNNode in ARKit在 ARKit 中缩放 SCNNode
【发布时间】:2018-08-04 11:27:12
【问题描述】:

我正在尝试使用 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 模型倒置。任何想法为什么?此外,虽然缩放有效,但在使用捏合缩放的多个进程中使用时,它并不平滑,并且从不同的缩放因子有点跳跃。

【问题讨论】:

    标签: ios scenekit arkit


    【解决方案1】:

    这是我扩展节点的方式:

    /// 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,尽管您可以随意设置。

    【讨论】:

    • 谢谢! gesture.scale = 1 line 的目的是什么。
    • 拖动节点怎么样?例如我需要触摸节点并在场景中移动它
    • 嘿@BlackMirrorz,非常感谢您的详细回答!我和我的团队在一个问题上停留了好几天啊:/我发布了一个有趣的问题:stackoverflow.com/questions/63662318/…希望您提出建议!
    • 上帝保佑你,兄弟!这非常有效!
    猜你喜欢
    • 2016-03-25
    • 2018-01-12
    • 2019-01-30
    • 2019-09-22
    • 2018-02-22
    • 2018-01-05
    • 2017-11-27
    • 2018-09-01
    • 2018-08-03
    相关资源
    最近更新 更多