如何在RealityView中修改无ModelComponent实体的网格及VideoPlayerComponent圆角?
RealityKit 实体网格与 VideoPlayer 圆角修改方案
问题1:修改无 ModelComponent 实体的网格
对于没有自带 ModelComponent 的实体(比如自动生成渲染载体的 VideoPlayer 实体),有两种可行方式:
- 手动添加自定义
ModelComponent覆盖默认网格:直接创建符合需求的网格和材质,给实体添加ModelComponent,系统会用你定义的网格替代自动生成的版本。 - 遍历子实体修改自动生成的网格:RealityKit 给带
VideoPlayerComponent的实体自动添加的渲染载体是它的子实体,你可以遍历实体的子节点,找到带有ModelComponent的那个实体,然后修改其 mesh 或材质属性。
问题2:修改 VideoPlayerComponent 实体的圆角
完全可以实现,推荐两种方案:
方案1:自定义带圆角的 ModelComponent 替换默认网格
手动创建带圆角的矩形网格,给实体添加 ModelComponent,视频会直接渲染在你定义的圆角载体上。修改后的示例代码如下:
var body: some View { RealityView { content in let entity = Entity() let player = AVPlayer() entity.components[VideoPlayerComponent.self] = .init(avPlayer: player) // 创建带圆角的网格(可自行调整尺寸和圆角半径) let mesh = MeshResource.generateBox(size: [2, 1.5, 0.01], cornerRadius: 0.1) let material = SimpleMaterial() entity.components[ModelComponent.self] = .init(mesh: mesh, materials: [material]) content.add(entity) } }
方案2:修改自动生成的子实体网格
等待实体加载完成后,遍历其子实体找到承载渲染的 ModelComponent,修改网格的圆角属性。需要注意要在实体渲染完成后执行,可通过监听场景事件实现:
var body: some View { RealityView { content in let entity = Entity() let player = AVPlayer() entity.components[VideoPlayerComponent.self] = .init(avPlayer: player) content.add(entity) // 监听实体加入场景的事件,确保渲染载体已生成 content.subscribe(to: SceneEvents.DidAddEntity.self) { event in guard event.entity == entity else { return } // 遍历所有子实体,找到带ModelComponent的渲染载体 entity.visit { child in if var modelComp = child.components[ModelComponent.self] { // 获取原网格尺寸,生成对应圆角网格替换 let originalSize = modelComp.mesh.bounds.extents let roundedMesh = MeshResource.generateBox(size: originalSize, cornerRadius: 0.1) modelComp.mesh = roundedMesh child.components[ModelComponent.self] = modelComp } } } } }
参考:WWDC23《用 RealityKit 增强你的空间计算应用》相关内容
内容的提问来源于stack exchange,提问作者Jack Guo
相关产品推荐
相关产品推荐

