Как мне загрузить мою собственную сцену Reality Composer в RealityKit? - PullRequest
1 голос
/ 10 июля 2020

Я создал 3 «сцены» внутри Experience.rcproject файла, который создается, когда вы запускаете новый проект дополненной реальности с использованием xcode.

Много работая с 3D, я бы сказал, что это 3 объекта внутри сцены, но внутри Experience.rcproject я добавил 3 "сцены". Внутри каждого одна и та же 3D модель. Первый прикреплен к горизонтальной плоскости, второй - к вертикальной, а третий - к изображению.

Я впервые работаю с Reality Kit и попутно учусь.

Моя идея заключается в том, чтобы загрузить нужный объект, когда я хочу, чтобы он был прикреплен к горизонтали, вертикали или изображению.

Вот как я это сделал.

I изменили файл Experience.swift, предоставленный Apple, чтобы принимать имена сцен, например:

public static func loadBox(namedFile:String) throws -> Experience.Box {
    guard let realityFileURL = Foundation.Bundle(for: Experience.Box.self).url(forResource: "Experience", withExtension: "reality") else {
      throw Experience.LoadRealityFileError.fileNotFound("Experience.reality")
    }
    
    let realityFileSceneURL = realityFileURL.appendingPathComponent(namedFile, isDirectory: false)
    let anchorEntity = try Experience.Box.loadAnchor(contentsOf: realityFileSceneURL)
    return createBox(from: anchorEntity)
  }

, и я называю эту строку

let entity = try! Experience.loadBox(namedFile:sceneName)

как угодно, но я должен использовать это code:

// I have to keep a reference to the entity so I can remove it from its parent and nil
currentEntity?.removeFromParent()
currentEntity = nil

// I have to load the entity again, now with another name
let entity = try! Experience.loadBox(namedFile:sceneName)

// store a reference to it, so I can remove it in the future
currentEntity = entity

// remove the old one from the scene
arView.scene.anchors.removeAll()

// add the new one
arView.scene.anchors.append(entity)

Этот код глупый, и я уверен, что есть способ лучше.

Есть мысли?

1 Ответ

3 голосов
/ 10 июля 2020

Иерархия в RealityKit / Reality Composer

Думаю, это скорее «теоретический» вопрос, чем практический. Сначала я должен сказать, что редактирование Experience файла, содержащего сцены с якорями и сущностями, не является хорошей идеей.

В RealityKit и Reality Composer существует вполне определенная иерархия на случай, если вы создали один объект в сцене по умолчанию:

Scene –> AnchorEntity -> ModelEntity 
                              |
                           Physics
                              |
                          Animation
                              |
                            Audio
                          

Если вы поместили две 3D-модели в сцену, они имеют одну и ту же привязку:

Scene –> AnchorEntity – – – -> – – – – – – – – ->
                             |                  |
                       ModelEntity01      ModelEntity02
                             |                  |
                          Physics            Physics
                             |                  |
                         Animation          Animation
                             |                  |
                           Audio              Audio

AnchorEntity в RealityKit определяет, какие свойства конфигурации World Tracking выполняются в текущем ARSession: horizontal / vertical обнаружение плоскости и / или image detection, и / или body detection, et c.

Давайте посмотрим на эти параметры:

AnchorEntity(.plane(.horizontal, classification: .floor, minimumBounds: [1, 1]))

AnchorEntity(.plane(.vertical, classification: .wall, minimumBounds: [0.5, 0.5]))

AnchorEntity(.image(group: "Group", name: "model"))


Объединение двух сцен из реальности Composer

Для этого поста я подготовил две сцены в реальности Composer - первая сцена (ConeAndBox) с обнаружение в горизонтальной плоскости и вторая сцена (Sphere) с обнаружением в вертикальной плоскости. Если вы объедините эти сцены в RealityKit в одну большую сцену, вы получите два типа обнаружения плоскости - горизонтальную и вертикальную.

enter image description here

Two cone and box are pinned to one anchor in this scene.

enter image description here

In RealityKit I can combine these scenes into one scene.

// Plane Detection with a Horizontal anchor
let coneAndBoxAnchor = try! Experience.loadConeAndBox()
coneAndBoxAnchor.children[0].anchor?.scale = [7, 7, 7]
coneAndBoxAnchor.goldenCone!.position.y = -0.1  //.children[0].children[0].children[0]
arView.scene.anchors.append(coneAndBoxAnchor)

coneAndBoxAnchor.name = "mySCENE"
coneAndBoxAnchor.children[0].name = "myANCHOR"
coneAndBoxAnchor.children[0].children[0].name = "myENTITIES"

print(coneAndBoxAnchor)
     
// Plane Detection with a Vertical anchor
let sphereAnchor = try! Experience.loadSphere()
sphereAnchor.steelSphere!.scale = [7, 7, 7]
arView.scene.anchors.append(sphereAnchor)

print(sphereAnchor)

enter image description here

In Xcode's console you can see ConeAndBox scene hierarchy with names given in RealityKit:

enter image description here

And you can see Sphere scene hierarchy with no names given:

ЭТОТ ПОЧТ и ЭТОТ ПОЧТ .


PS

Дополнительный код, показывающий, как загружать сцены из ExperienceX.rcproject:

import ARKit
import RealityKit

class ViewController: UIViewController {
    
    @IBOutlet var arView: ARView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
                    
        // RC generated "loadGround()" method automatically
        let groundArrowAnchor = try! ExperienceX.loadGround()
        groundArrowAnchor.arrowFloor!.scale = [2,2,2]
        arView.scene.anchors.append(groundArrowAnchor)

        print(groundArrowAnchor)
    }
}

enter image description here

введите описание изображения здесь

...