ARkit - 摄像机位置和3D模型位置

时间:2018-03-14 13:00:52

标签: ios swift arkit

我试图在场景中放置几个​​模型。

for candidate in selectedCandidate {
    sceneView.scene.rootNode.addChildNode(selectedObjects[candidate])
}

candidateselectedCandidate代表我想要使用的模型的索引。每个模型都包含一个rootNode和附加到它的节点。我使用worldPosition的API positionSCNNode来获取和修改3D模型的位置。

我想要做的就是将这些模型放在前面的用户面前。眼睛。这意味着我需要获取相机的位置和方向矢量,以便将模型放在我想要的正确位置。我还根据此解决方案使用这些代码来获取相机的位置https://stackoverflow.com/a/47241952/7772038

guard let pointOfView = sceneView.pointOfView else { return }
let transform = pointOfView.transform
let orientation = SCNVector3(-transform.m31, -transform.m32, transform.m33)
let location = SCNVector3(transform.m41, transform.m42, transform.m43)

问题在于相机的位置和我直接打印的模型位置在数量级上严重不同。相机的位置是10 ^ -2级别,如{0.038 ...,0.047 ...,0.024 ...}但是模型的位置是10 ^ 2级别,如{197.28,100.29,-79.25 }。从我的角度来看,当我运行程序时,我处于中间的模型和模型非常接近,但位置是如此不同。所以你能告诉我如何将模型的位置修改为我想要的任何位置吗?我真的需要将模型放在用户面前。如果我只是做addChildNode()模特在我身后或其他地方,我需要模特只是在用户面前'眼睛。提前谢谢!

1 个答案:

答案 0 :(得分:1)

如果您想在相机前面放置SCNNode,可以这样做:

   /// Adds An SCNNode 3m Away From The Current Frame Of The Camera
   func addNodeInFrontOfCamera(){

     guard let currentTransform = augmentedRealitySession.currentFrame?.camera.transform else { return }

     let nodeToAdd = SCNNode()
     let boxGeometry = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0)
     boxGeometry.firstMaterial?.diffuse.contents = UIColor.red
     nodeToAdd.geometry = boxGeometry

     var translation = matrix_identity_float4x4

     //Change The X Value
     translation.columns.3.x = 0

     //Change The Y Value
     translation.columns.3.y = 0

     //Change The Z Value
     translation.columns.3.z = -3

    nodeToAdd.simdTransform = matrix_multiply(currentTransform, translation)
    augmentedRealityView?.scene.rootNode.addChildNode(nodeToAdd)

}

您可以根据需要更改任何X,Y,Z值。

希望它指出你正确的方向......

<强>更新

如果您有多个节点,例如在场景中,为了使用此功能,最好创建一个“持有者”节点,然后将所有内容添加为孩子。

这意味着您只需在持有者节点上调用此函数即可。