RealityKit 中的粒子系统

Pra*_*mar 1 swift realitykit visionos

RealityKit中有粒子系统吗?如果是这样,有人可以指出我正确的文档/文章吗?

到目前为止,我在 RealityKit 模块中没有找到任何粒子系统。

ARG*_*Geo 8

RealityKit 中的粒子系统

可用于visionOS 1.0+tvOS 17.0+

在 WWDC'23 上,最终宣布 RealityKit 和 Reality Composer Pro 将获得自己的高级粒子系统以及一组附带的参数。对于那些不知道什么是粒子的人,我可以说它是一个 3D 工具,用于创建和渲染雨、雪、飞扬的灰尘和碎片、火、火花、烟雾、落叶等现象。

在此输入图像描述

这是我的初始场景类型的代码Volume。如果您需要更改卷的大小,请阅读这篇文章。

import SwiftUI
import RealityKit

struct ContentView: View {
    var body: some View {
        
        RealityView { content in
            let model = ModelEntity()
            model.components.set(particleSystem())
            content.add(model)
        }
    }        
    func particleSystem() -> ParticleEmitterComponent {
        var particles = ParticleEmitterComponent()
        particles.emitterShape = .sphere
        particles.emitterShapeSize = [1,1,1] * 0.05

        particles.mainEmitter.birthRate = 2000
        particles.mainEmitter.size = 0.05
        particles.mainEmitter.lifeSpan = 0.5
        particles.mainEmitter.color = .evolving(start: .single(.white),
                                                  end: .single(.cyan))
        return particles
    }
}
#Preview {
    ContentView()
}
Run Code Online (Sandbox Code Playgroud)

从 Reality Composer Pro 场景中检索粒子

您可以轻松更改/自定义从 Reality Composer Pro 场景导入的粒子系统的参数。这是我使用 RealityView 闭包内容的代码update

在此输入图像描述

import SwiftUI
import RealityKit
import RealityKitContent

struct ContentView: View {
    var body: some View {
        VStack {
            RealityView { content in
                if let scene = try? await Entity(named: "Scene",
                                                    in: realityKitContentBundle) {
                    content.add(scene)
                    print(scene)
                }
            } update: { content in
                if let scene = content.entities.first {
                    let particles = scene.findEntity(named: "ParticleEmitter")
                    var particleComp = particles?.components[ParticleEmitterComponent.self]
                    particleComp?.speed = 0.5
                    particleComp?.mainEmitter.blendMode = .additive
                    particleComp?.mainEmitter.color = .constant(.single(.red))
                    particleComp?.mainEmitter.birthRate = 2000
                    particleComp?.mainEmitter.isLightingEnabled = true
                    particleComp?.mainEmitter.size = 0.2
                    particles?.components.set(particleComp!)
                }
            }
        }
    }
}
#Preview {
    ContentView()
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


使用 Model3D 视图加载带有粒子的 USDZ 文件

此外,您还可以使用 SwiftUI 的 Model3D 视图异步加载.usdz不仅包含几何图形还包含粒子的场景。

import SwiftUI
import RealityKit

struct ContentView: View {
    var body: some View {
        Model3D(named: "pEmitter.usdz") {
            if let model = $0.model {
                model
            } else {
                Color.clear
            }
        }
    }
}
#Preview {
    ContentView()
}
Run Code Online (Sandbox Code Playgroud)