Goal: I have a massive USDZ scene file, with hundreds of layers and objects. Need to grab each object easily, to then manipulate in RealityKit.
Tried: The approach bellow by Andy Jazz is the only solution I found for now:
let entity = scene.children[0].........children[0] as! ModelEntity
Problem: It's impossible to know each USDZ's entity number on the hierarchy.
Is it possible to grab the entity by its name?
import RealityKit
class ViewController: UIViewController {
@IBOutlet var arView: ARView!
override func viewDidLoad() {
super.viewDidLoad()
do {
let path = Bundle.main.path(forResource: "Matrix", ofType: "usdz")!
let url = URL(fileURLWithPath: path)
// Scene
let scene = try Entity.load(contentsOf: url)
print(scene)
// Entity
let entity = scene.children[0].........children[0] as! ModelEntity
entity.model?.materials[0] = UnlitMaterial(color: .red)
let anchor = AnchorEntity(plane: .any)
anchor.addChild(scene)
arView.scene.anchors.append(anchor)
} catch {
print(error)
}
}
}
Use findEntity(named:)
instance method to recursively get any descendant entity by its name.
func findEntity(named name: String) -> Entity?
.rcproject
scenelet boxAnchor = try! Experience.loadBox()
arView.scene.anchors.append(boxAnchor)
print(boxAnchor)
let entity = boxAnchor.findEntity(named: "Steel Box")
entity?.scale *= 7
.usdz
modellet model = try! ModelEntity.load(named: "model.usdz")
let anchor = AnchorEntity(world: [0,0,-1])
anchor.addChild(model)
arView.scene.anchors.append(anchor)
print(model)
let entity = model.findEntity(named: "teapot")
entity?.scale /= 33
P. S.
Unfortunately, not all entities in .usdz
or .rcproject
have names by default.
So, you must give all the required names to entities to use this method.