我试图在场景中放置几个模型。
for candidate in selectedCandidate {
sceneView.scene.rootNode.addChildNode(selectedObjects[candidate])
}
candidate
和selectedCandidate
代表我想要使用的模型的索引。每个模型都包含一个rootNode和附加到它的节点。我使用worldPosition
的API position
和SCNNode
来获取和修改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()
模特在我身后或其他地方,我需要模特只是在用户面前'眼睛。提前谢谢!
答案 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值。
希望它指出你正确的方向......
<强>更新强>
如果您有多个节点,例如在场景中,为了使用此功能,最好创建一个“持有者”节点,然后将所有内容添加为孩子。
这意味着您只需在持有者节点上调用此函数即可。