ARKit拖动对象改变比例

时间:2017-10-10 14:15:30

标签: swift scenekit arkit scnnode

我正在尝试将我放置的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
    }
}

2 个答案:

答案 0 :(得分:1)

我的回答可能很晚,但是我自己面对了这个问题,花了我一段时间才弄清楚为什么会发生。我将分享我的经验,也许您可​​以与之联系。

我的问题是我在运行时更改其比例后尝试更改节点的位置(添加后,我的大多数3D资产非常大,我会用捏手势将其缩小)。我注意到更改比例是导致位置更改无法按预期进行的原因。

我找到了一个非常简单的解决方案。您只需要更改此行:

movedObject?.position = vector

对此:

movedObject?.worldPosition = vector

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

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

答案 1 :(得分:-2)

这是因为你在3轴上移动物体而Z改变了为什么感觉它会缩放,但它只是越来越接近你。