swift 如何从RC加载场景作为ModelEntity而不是普通Entity?

dfty9e19  于 2023-05-05  发布在  Swift
关注(0)|答案(1)|浏览(191)

我试图从Reality Composer项目的场景中将Entity加载到代码中。
我直接接触到自动生成的.reality文件,因为我不希望它自动放置在它检测到的第一个平面上。我遵循了Taking Control of Scene Anchoring文章中的文档。
示例项目名称为Experience,其中有两个场景。
1.自动生成的Box,它随新创建的项目自动提供。
1.一个六角形导入的USDZ文件。
我用来将两者作为ModelEntity加载的代码如下:

let url = Bundle.main.url(forResource: "Experience", 
                        withExtension: "reality")!
            .appending(path: "SceneName", directoryHint: .notDirectory)
        
let modelEntity = try! Entity.loadModel(contentsOf: url)

其中SceneNameBoxHexagon
两者都无法加载。
如果我使用下面的代码,它们会成功,但它们被加载为Entity,而不是ModelEntity

let modelEntity = try! Entity.load(contentsOf: url)

是否可以将对象加载为ModelEntity而不是Entity?到目前为止,我使用的方法是遍历子层次结构,找到第一个ModelEntity,并将其模型和物理复制到其父对象上(在我的情况下,这是可行的,因为我在场景中只有一个对象)。

编辑:即使我在Scene中命名对象,然后尝试在Scene中找到的“根”Entity对象上使用findEntity(named:)方法获取它们,我仍然会得到Entity而不是ModelEntity

irtuqstp

irtuqstp1#

Reality Composer的.rcproject

如果您使用Reality Composer的Experience.rcproject文件,请尝试以下技术。实现findEntity(named:)方法,然后使用typecast as!操作符从RC场景中抓取所需的模型实体。

import UIKit
import RealityKit

class ViewController: UIViewController {
    
    @IBOutlet var arView: ARView!
    typealias ModelPack = ModelEntity & HasPhysicsBody
    
    override func viewDidLoad() {
        super.viewDidLoad()

        let scene1 = try! Experience.loadBox()
        let scene2 = try! Experience.loadHexagon()
        
        print(scene1); print(scene2)
        
        let boxModel = scene1.findEntity(named: "simpBld_root") as! ModelPack
        let hexModel = scene2.findEntity(named: "simpBld_root") as! ModelPack
        boxModel.position.x = -0.075
        hexModel.position.x = 0.075
        
        let anchor = AnchorEntity()     // any RealityKit or ARKit anchor
        anchor.scale *= 3
        anchor.addChild(boxModel)
        anchor.addChild(hexModel)
        
        arView.scene.anchors.append(anchor)
    }
}

.reality文件

Apple专有的.reality可加快上传速度。使用以下方法将.reality文件加载到3D场景中。记住每个RealityKit的场景都是实体的层次结构。

import UIKit
import RealityKit

class ViewController: UIViewController {
    
    @IBOutlet var arView: ARView!
    typealias ModelPack = ModelEntity & HasPhysicsBody
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let entity = try! Entity.load(named: "SomeScene.reality")
        print(entity)
        
        let boxModel = entity.findEntity(named: "simpBld_root") as! ModelPack
        
        let anchor = AnchorEntity(.face)
        anchor.addChild(boxModel)
        arView.scene.anchors.append(anchor)
    }
}

相关问题