如何向 RealityKit 中现有的 modelEntity 添加简单材质?

问题描述 投票:0回答:1

我导入一个 usdz 文件,其中包含 obj 文件作为图层。这些对象既没有结构、材质也没有颜色,因为我必须在运行时单独设置它们。

使用 SceneKit,我可以按如下方式实现这一点。

// get all parts
guard let scene = SCNScene(named: "art.scnassets/allParts.usdz") else { return }
// hide all parts
scene.rootNode.childNodes.forEach { child in
    child.isHidden = true
}

// then unhide and setup (position and grouping) the parts i need
let part1 = scene.rootNode.childNode(withName: "part1_abc2", recursively: true)!
part1.isHidden = false
part1.childNodes.first?.geometry?.firstMaterial?.diffuse.contents = UIColor.red
part1.localRotate(by: SCNQuaternion(0, 0, 0, 0))
part1.localTranslate(by: SCNVector3(0, 0, 0.216))
...

我想模仿RealityKit中的行为

let modelEntity = try! ModelEntity.load(named: "art.scnassets/allParts.usdz")
modelEntity.children.forEach { child in
    child.isEnabled = false
}

guard let part1 = modelEntity.findEntity(named: "part1_abc2") else { return }
part1.isEnabled = true
part1.orientation = Transform(pitch: 0, yaw: 0, roll: 0).rotation
part1.transform = Transform(translation: [0, 0, 0.216])

如何为我的零件指定颜色或材料?我知道可以用这样的材质初始化 ModelEntity

let mesh = MeshResource.generateBox(size: 0.5, cornerRadius: 0.1)
let material = SimpleMaterial(color: .red, roughness: 0.15, isMetallic: true)
let model = ModelEntity(mesh: mesh, materials: [material])

但是之后如何将材质添加到现有的 obj 中?

更新:我刚刚意识到 ModelEntity.load 确实返回一个实体而不是 ModelEntity。我想我必须弄清楚如何获取 usdz 文件中每个层/部分的 ModelEntities?有人可以让我走上正轨吗?

更新2:我做了以下操作,但我的模型完全消失了。

let modelEntity = try! Entity.loadModel(named: "art.scnassets/allParts.usdz")
modelEntity.model?.materials = [UnlitMaterial(color: .red)]

我想,我确实必须为每个子/层设置材质。但这个块仍然返回一个实体...

guard let part1 = modelEntity.findEntity(named: "part1_abc2") else { return }
part1.isEnabled = true
part1.orientation = Transform(pitch: 0, yaw: 0, roll: 0).rotation
part1.transform = Transform(translation: [0, 0, 0.216])
swift scenekit realitykit
1个回答
0
投票

使用向下转换为 ModelEntity 类型来获取所需组件的

model
实例:

let model = try! Entity.loadModel(named: "allThePartsOf.usdz")
print(model)

guard let part1 = model.findEntity(named: "part1_abc2") as? ModelEntity
else { return }

part1.model?.materials = [UnlitMaterial(color: .red)]
© www.soinside.com 2019 - 2024. All rights reserved.