Pra*_*mar 1 swift realitykit visionos
RealityKit中有粒子系统吗?如果是这样,有人可以指出我正确的文档/文章吗?
到目前为止,我在 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 场景导入的粒子系统的参数。这是我使用 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)
此外,您还可以使用 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)