swift - ARKit 拖动对象改变比例

标签 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
    }
}

最佳答案

我的回答可能已经很晚了,但我自己也遇到过这个问题,我花了一段时间才弄清楚为什么会发生这种情况。我将分享我的经验,也许您会产生共鸣。

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

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

movedObject?.position = vector

为此:

movedObject?.worldPosition = vector

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

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

关于swift - ARKit 拖动对象改变比例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46669053/

相关文章:

swift - 如何从枚举中随机选择 10 张卡片(或数字)

ios - 动态加载的 UIStackView 上的分离 Controller 问题

swift - 按照 Xcode 的 Apple 'Food Tracker' 教程 - 无法获取更改标签文本的按钮

swift - UnsafeMutableRawPointer(变量)有多安全

objective-c - 将MDLMesh划分为多个SCNGeometry

ios - SCNNode在 anchor 坐标系内旋转

swift - ARSceneView 中使用哪个图像作为引用?

ios - 使用 ARKit 拍摄高质量照片

ios - 添加 SceneKit 场景文件到 View Controller

ios - ARKit : How to apply material with multiple colors for SCNCylinder in SCNView?