ARkit - 相机位置和 3D 模型位置
ARkit - Camera Position and 3D model Positions
我正在尝试在场景中放置多个模型。
for candidate in selectedCandidate {
sceneView.scene.rootNode.addChildNode(selectedObjects[candidate])
}
candidate
和 selectedCandidate
代表我要使用的模型的索引。每个模型都包含一个 rootNode 和附加到它的节点。我使用 SCNNode
的 API worldPosition
和 position
来获取和修改 3D 模型的位置。
我想做的就是将这些模型放在用户眼前。这意味着我需要获取相机的位置和方向矢量才能将模型放在我想要的正确位置。我还使用这些代码根据此解决方案 :
获取相机的位置
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 值。
希望它能为您指明正确的方向...
更新:
如果您有多个节点,例如在场景中,为了使用此功能,最好创建一个 'holder' 节点,然后将所有内容添加为子节点。
这意味着您可以在 holder 节点上简单地调用此函数。
我正在尝试在场景中放置多个模型。
for candidate in selectedCandidate {
sceneView.scene.rootNode.addChildNode(selectedObjects[candidate])
}
candidate
和 selectedCandidate
代表我要使用的模型的索引。每个模型都包含一个 rootNode 和附加到它的节点。我使用 SCNNode
的 API worldPosition
和 position
来获取和修改 3D 模型的位置。
我想做的就是将这些模型放在用户眼前。这意味着我需要获取相机的位置和方向矢量才能将模型放在我想要的正确位置。我还使用这些代码根据此解决方案
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 值。
希望它能为您指明正确的方向...
更新:
如果您有多个节点,例如在场景中,为了使用此功能,最好创建一个 'holder' 节点,然后将所有内容添加为子节点。
这意味着您可以在 holder 节点上简单地调用此函数。