【问题标题】:ARKit dragging object changes scaleARKit 拖动对象改变比例
【发布时间】:2018-03-21 23:56:18
【问题描述】:

我正在尝试将我放置在表面上的 SCNNode 对象移动。当我第一次开始移动时,它会移动,但规模会发生变化并且变得更小。

这就是我所做的;

@IBAction func dragBanana(_ sender: UIPanGestureRecognizer) {
    guard let _ = self.sceneView.session.currentFrame else {return}

    if(sender.state == .began) {
        let location = sender.location(in: self.sceneView)
        let hitTestResult = sceneView.hitTest(location, options: nil)
        if !hitTestResult.isEmpty {
            guard let hitResult = hitTestResult.first else {return}
            movedObject = hitResult.node
        }
    }
    if (sender.state == .changed) {
        if(movedObject != nil) {
            let location = sender.location(in: self.sceneView)
            let hitTestResult = sceneView.hitTest(location, types: .existingPlaneUsingExtent)
            guard let hitResult = hitTestResult.first else {return}
            let matrix = SCNMatrix4(hitResult.worldTransform)
            let vector = SCNVector3Make(matrix.m41, matrix.m42, matrix.m43)
            movedObject?.position = vector
        }
    }
    if (sender.state == .ended) {
        movedObject = nil
    }
}

【问题讨论】:

    标签: swift scenekit arkit scnnode


    【解决方案1】:

    我的回答可能很晚,但我自己也遇到了这个问题,我花了一段时间才弄清楚为什么会发生这种情况。我会分享我的经验,也许你可以理解它。

    我的问题是,我在运行时更改了节点的比例后试图更改节点的位置(我的大多数 3D 资产在添加时都非常大,我用捏合手势将它们缩小)。我注意到更改比例是导致位置更改未按预期工作的原因。

    我找到了一个非常简单的解决方案。你只需要改变这一行:

    movedObject?.position = vector
    

    到这里:

    movedObject?.worldPosition = vector
    

    根据SCNNodedocumentationposition 属性确定节点相对于其父节点的位置。而worldPosition是节点相对于场景根节点的位置(即ARSCNView的世界原点)

    我希望这能回答你的问题。

    【讨论】:

      【解决方案2】:

      这是因为您在 3 轴上移动对象并且 Z 发生变化,这就是为什么它感觉像是在缩放但它只是越来越靠近您。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-01
        • 1970-01-01
        • 2021-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多