1

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

在我拥有 currentFrame 之后,我也无法在视图中渲染我的场景,因为节点太多并且卡住了......

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

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

谢谢阅读 :)

4

1 回答 1

1

假设我正确地解释了你,你想做两件事:

  • 加载你的场景,
  • 确保它被缩放到一个合理的大小。

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

(a) 在您SCNScene创建一个EmptyNode并将其称为“根”等时,然后将所有实际场景元素设为此子项,例如:

在此处输入图像描述

由于我们现在有一个保存场景的“根”节点,我们可以简单地执行以下操作来加载它:

  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()
 }

您将需要尝试规模等,但这应该可以帮助您入门。

于 2018-03-17T09:27:00.743 回答