ARKit 变换整个场景

ARKit transform whole scene

我有这个 SCNScene,它非常好并且包含一些 nSCNNodes... 现在我想在 ARSCNView 中显示这个场景。但是,我的整个场景都是用 x,y,z >= 0 构建的,也就是说,如果我只是设置屏幕,我的整个场景就会在相机后面。

在获得 currentFrame 之后,我也无法在视图中渲染我的场景,因为节点太多,它会卡住...

所以: 我正在寻找一种方法来以某种方式转换我的 SCNScene,这样它就不会自行改变,但会在相机前找到一个合适的位置(即 0,0,0)并且可能会缩小一点。

这可能吗?如果是这样,我必须对哪些对象进行哪些转换?

感谢阅读:)

假设我对你的解释是正确的,你想做两件事:

  • 加载您的场景,
  • 确保将其缩放到合理的大小。

在你的问题的第一部分,你说你无法加载模型,因为节点太多了。由于您尚未发布任何代码,因此很难提供具体的解决方案,但这可能会有所帮助。

(a) 在您的 SCNScene 中创建一个 EmptyNode 并将其命名为 'Root' 等,然后将您所有的实际场景元素作为此元素的子元素,例如:

因为我们现在有一个 'Root' 节点来保存场景,我们可以简单地这样做来加载它:

  func loadScene(){

    //1. Get The Name Of The SCNSceme
    guard let hugeScene = SCNScene(named: "SceneKitAssets.scnassets/HugeScene.scn"),
           //2. Get The Root Node Which Holds All Your Content
           let sceneNode = hugeScene.rootNode.childNode(withName: "Root", recursively: false) else { return }

    //3. Add It To Your ARSCNView
    self.augmentedRealityView?.scene.rootNode.addChildNode(sceneNode)

    //4. Set The Scenes Position 1.5m Away From The Camera
     sceneNode.position =  SCNVector3(0, 0, -1.5)

    //5. Scale It To A Reasonable Size
    sceneNode.scale = SCNVector3(0.2,0.2,0.2)
}

您还可以考虑在后台线程上加载它,例如:

 DispatchQueue.global(qos: .background).async {
        self.loadScene()
 }

您将需要尝试缩放等,但这应该让您入门。