ARkit - 相机位置和 3D 模型位置



我正在尝试将几个模型放入场景中。

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

candidateselectedCandidate代表我想使用的模型的索引。每个模型都包含一个根节点和附加到它的节点。我使用 APIworldPositionSCNNodeposition来获取和修改 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()模型在我身后或其他地方,而我需要模型就在用户眼前。提前谢谢你!

如果你想在相机前面放置一个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 值。

希望它能为你指明正确的方向...

更新:

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

这意味着您可以简单地在持有者节点上调用此函数。

最新更新