ios - 如何使用平移手势识别器在 ARSCNView 中移动节点?

标签 ios scenekit arkit

我在 viewDidLoad 中有以下代码

let scene = SCNScene(named: "funModel")!
myNode = scene.rootNode.childNode(withName: "blah")!
myNode.position = SCNVector3Make(0, 0, -1)
sceneView.scene = scene
let pan = UIPanGestureRecognizer(target: self, action: #selector(panGesture(recognizer:)))
view.addGestureRecognizer(pan)

然后是来自 another SO answerpanGesture 中的以下代码,但它不起作用。该节点似乎只是转到 0, 0, 0。我只想能够在屏幕上拖动节点。

let projectedOrigin = sceneView.projectPoint(SCNVector3Zero)
let vp = recognizer.location(in: sceneView)
let vpWithZ = SCNVector3(x: Float(vp.x), y: Float(vp.y), z: Float(projectedOrigin.z))
let worldPoint = sceneView.unprojectPoint(vpWithZ)
myNode.position = worldPoint

最佳答案

您首先需要从 UIPanGestureRecognizer 位置(在您的 UIPanGestureRecognizer 函数中)获取命中点,例如:

let point = pan.location(in: scene)
let result = scene.hitTest(point, types: .featurePoint)
let resultPoint = result.first

现在你的新世界点是:

let vpWithZ = SCNVector3(x: Float(resultPoint.worldTransform.columns.3.x), y: Float(resultPoint.worldTransform.columns.3.y), z: Float(projectedOrigin.z))

希望对您有所帮助。

关于ios - 如何使用平移手势识别器在 ARSCNView 中移动节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45134068/

相关文章:

ios - 如何在 iOS 上的 Swift 中获取 sharedApplication?

ios - 在 scnnode 上施加力而不在碰撞时松开它

swift - 缩放 SCNNode 时更新 SCNPhysicsBody

swift - 如何在 ARKit 中使用环境贴图?

swift - 如何在 Swift 中以编程方式旋转 USDZ 文件中的 3D 模型?

ios - 如何不断获取 ARCamera 的旋转/欧拉角度值

ios - 隐藏目标 VC-Swift 中的开关

iphone - 应用商店中是否有针对 iOS 应用评论的 RSS 提要?

ios - 带标签栏 Controller 的导航 Controller ?

swift - SceneKit 节点的定位