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

标签 ios swift arkit

我正在尝试在场景中放置多个模型。

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

candidateselectedCandidate 代表我要使用的模型的索引。每个模型都包含一个 rootNode 和附加到它的节点。我使用 SCNNode 的 API worldPositionposition 来获取和修改 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 值。

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

更新:

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

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

关于ios - ARkit - 相机位置和 3D 模型位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49278464/

相关文章:

ios - AutoLayout View 使应用程序在 popViewController 上崩溃

ios - 元素不保留其 Storyboard 可访问性标识符或运行时类型

ios - MVVM 架构使用 swift 获取数据和更新 UITableView

ios - 具有低高度 UICollectionView 的 UIRefreshControl

ios - 在 TabBarController 应用程序中从另一个 ViewController 在 vi​​ewController 中设置属性是一种不好的做法

ios - Swift Table View (Chat UI) 如果显示键盘,整个 View 会变低

ios - ARKit,用于 ARSCNView 的金属着色器

rotation - 获取 ARKit pointOfView 的 Y 旋转

ios - Autolayouts 设置纵向和横向 View iOS

ios - 为 3D 模型的某些部分添加纹理