ARKit преобразит всю сцену

У меня есть SCNScene, который довольно хорош и содержит несколько nSCNNodes... Теперь я хочу отобразить эту сцену в ARSCNView. Но вся моя сцена построена с x,y,z >= 0, иначе, если бы я просто установил экран, вся моя сцена была бы позади камеры.

Я также не могу визуализировать свою сцену внутри представления после того, как у меня есть currentFrame, потому что слишком много узлов, и он застревает...

Итак: я ищу способ как-то трансформировать мою SCNScene, чтобы она не менялась сама по себе, а находилась в правильном положении перед камерой (то есть 0,0,0) и, возможно, немного уменьшалась,

Это вообще возможно? Если да, то какие преобразования мне придется делать с какими объектами?

Спасибо за прочтение:)

1 ответ

Решение

Предполагая, что я правильно вас понимаю, вы хотите сделать две вещи:

  • Загрузите свою сцену,
  • Убедитесь, что он масштабируется до разумного размера.

В первой части вашего вопроса вы говорите, что не можете загрузить модель, потому что там слишком много узлов. Поскольку вы не разместили ни одного кода, трудно найти конкретное решение, но это может помочь.

а) в вашем 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()
 }

Вам нужно будет поэкспериментировать с масштабом и т. Д., Но это должно помочь вам начать.

Другие вопросы по тегам