问题描述
这是我上一个问题的延续项目。 How to move multiple nodes in ARSCNView
之前的程序是一个原型。此函数的目的是移动由视觉框架(不是 UI 手势识别器)使用手部跟踪通过手部跟踪添加的 AR 对象。该应用程序的很大一部分基于 kkoronuei 创建的 ARPaint。 https://github.com/kkorouei/ARPaint
我发布的代码发生在 func session(_ session: ARSession,didUpdate frame: ARFrame) {
内。基本上,该应用程序有 2 种模式。 drawMode
是添加锚点的地方,否则是使用手势移动绘图。两种模式不能同时发生,因此应用程序要么在 drawMode
中,要么不在其中。我当前的逻辑是将所有现有节点分组到一个名为 motherNode
的新节点,并将平移矩阵应用于它。 indexTip2
指的是来自视觉框架的食指尖的手指 VNImagePointForNormalizedPoint
。 “距离”是指由激光雷达传感器计算出的到相机的距离。这 2 个变量可以正常工作。从这 2 个变量中,我可以创建平移矩阵并将整个场景移动到当前手指位置(现在我不会担心正在移动哪个节点,只要一切都向正确的方向移动)。
这是第一次有效。然而,当它再次被调用时,这个 motherNode
已经存在,所以为了避免一遍又一遍地创建相同的节点,我添加了一个 if 循环来跳过创建方法。当前的问题是当我重用注释掉的行时,对象不再移动到手指位置。它要么很快消失在视线之外,要么根本不动。我可能在使用 swift 选项时犯了一个错误,但我不确定。当然可以多次应用到根节点的翻译,对吗?任何想法都非常感谢。
if (!drawMode.isOn){
var parentNode: SCNNode?
var nodes: [SCNNode] = getMyNodes()
parentNode = sceneView.scene.rootNode.childNode(withName: "motherNode",recursively: true)
if parentNode != nil {
// guard let touchPositionInFrontOfCamera = getPosition(ofPoint: indexTip2,atDistanceFromCamera: self.distance,inView: self.sceneView) else { return }
// print(touchPositionInFrontOfCamera)
// let translationMatrix = SCNMatrix4Translate(parentNode!.worldTransform,// touchPositionInFrontOfCamera.x,// touchPositionInFrontOfCamera.y,// touchPositionInFrontOfCamera.z)
// parentNode!.transform = translationMatrix
return
}
parentNode = SCNNode()
parentNode!.name = "motherNode"
for node in nodes {
parentNode!.addChildNode(node)
}
sceneView.scene.rootNode.addChildNode(parentNode!)
guard let touchPositionInFrontOfCamera = getPosition(ofPoint: indexTip2,inView: self.sceneView) else { return }
let translationMatrix = SCNMatrix4Translate(parentNode!.worldTransform,touchPositionInFrontOfCamera.x,touchPositionInFrontOfCamera.y,touchPositionInFrontOfCamera.z)
parentNode!.transform = translationMatrix
return
}
我添加了一些打印行来查看发生了什么。以下在初始化时打印 translationMatrix
。然后在 if 循环内打印 touchPositionInFrontOfCamera
和 'translationMatrix'。
______
SCNMatrix4(m11: 1.0,m12: 0.0,m13: 0.0,m14: 0.0,m21: 0.0,m22: 1.0,m23: 0.0,m24: 0.0,m31: 0.0,m32: 0.0,m33: 1.0,m34: 0.0,m41: 0.5359205,m42: 0.18874621,m43: -1.810905,m44: 1.0)
SCNVector3(x: 0.58134866,y: -0.099451624,z: -1.8089545)
SCNMatrix4(m11: 1.0,m41: 1.1172692,m42: 0.08929459,m43: -3.6198595,m44: 1.0)
SCNVector3(x: 0.5735985,y: 0.01310969,z: -1.8194867)
SCNMatrix4(m11: 1.0,m41: 1.6908677,m42: 0.10240428,m43: -5.4393463,m44: 1.0)
SCNVector3(x: 0.5767575,y: -0.01947598,z: -1.8248432)
SCNMatrix4(m11: 1.0,m41: 2.267625,m42: 0.0829283,m43: -7.2641897,m44: 1.0)
SCNVector3(x: 0.53923947,y: 0.012032239,z: -1.8421669)
SCNMatrix4(m11: 1.0,m41: 2.8068645,m42: 0.09496054,m43: -9.106357,m44: 1.0)
SCNVector3(x: 0.5817139,y: -0.086378224,z: -1.8321315)
SCNMatrix4(m11: 1.0,m41: 3.3885784,m42: 0.008582316,m43: -10.938488,m44: 1.0)
SCNVector3(x: 0.5687888,y: -0.064390875,z: -1.8420491)
SCNMatrix4(m11: 1.0,m41: 3.9573672,m42: -0.05580856,m43: -12.780537,m44: 1.0)
SCNVector3(x: 0.5444935,y: -0.063903295,z: -1.855654)
SCNMatrix4(m11: 1.0,m41: 4.5018606,m42: -0.11971185,m43: -14.63619,m44: 1.0)
SCNVector3(x: 0.5435701,y: -0.06915884,z: -1.8613077)
SCNMatrix4(m11: 1.0,m41: 5.0454307,m42: -0.1888707,m43: -16.497498,m44: 1.0)
SCNVector3(x: 0.3528172,y: -0.0486469,z: -1.9168768)
SCNMatrix4(m11: 1.0,m41: 5.3982477,m42: -0.2375176,m43: -18.414375,m44: 1.0)
SCNVector3(x: 0.34087926,y: -0.053323507,z: -1.9242713)
SCNMatrix4(m11: 1.0,m41: 5.739127,m42: -0.2908411,m43: -20.338646,m44: 1.0)
SCNVector3(x: 0.58009064,y: -0.22830658,z: -1.8522431)
SCNMatrix4(m11: 1.0,m41: 6.3192177,m42: -0.5191477,m43: -22.19089,m44: 1.0)
SCNVector3(x: 0.42730594,y: -0.17960595,z: -1.9075701)
SCNMatrix4(m11: 1.0,m41: 6.746524,m42: -0.69875365,m43: -24.09846,m44: 1.0)
SCNVector3(x: 0.47545266,y: -0.20432584,z: -1.8975433)
SCNMatrix4(m11: 1.0,m41: 7.2219763,m42: -0.9030795,m43: -25.996002,m44: 1.0)
SCNVector3(x: 0.4368087,y: -0.15196265,z: -1.9180105)
SCNMatrix4(m11: 1.0,m41: 7.658785,m42: -1.0550421,m43: -27.914013,m44: 1.0)
如您所见,translationMatrix
最终会变得如此巨大,以至于无法看到。为什么会发生这种情况?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)