aframe - aframe 直接实时更新 aframe-particle-system-component 的属性,无需 setAttribute()
问题描述
我正在使用aframe-particle-system-component,并且正在使用.setAttribute()
该tick()
功能来实时更新粒子系统,但它执行得非常糟糕,几乎导致与内存相关的崩溃。有没有办法直接访问系统的maxAge
、opacity
和enabled
属性?我假设这是解决此问题的最佳方法,因为框架建议.object3D
出于性能原因直接访问它。我希望能够以类似的方式访问粒子系统。任何帮助表示赞赏。
解决方案
tldr:这是一个带有动画不透明度、大小和一些切换的示例。切换最大年龄似乎要等到所有当前粒子都消失了,尽管文档中没有关于它的消息。
1. 破坏粒子系统
粒子系统是基于ShaderParticleEngine的,所以修改它不会是 THREE.js'ish。
据我所知,particle-system
创建和存储SPE.Emitter
的。你可以在这里访问它们:
let particleSystem = this.el.component['particle-system']
let emitterGroup = particleSystem.particleGroup.emitters
更改值 - 例如,如果您有一个发射器:
emitterGroup[0].disable() // disables the emitter
emitterGroup[0].opacity.value = 0.1 // sets the opacity
2. a-frame 自定义组件的作业
我会创建一个自定义组件 - 任何更改都会遍历发射器组并更改属性:
AFRAME.registerComponent('particle-controller', {
schema: {
opacity: {default: 1}
},
init: function() {
let system = this.el.components['particle-system']
this.emitterGroup = system.particleGroup.emitters
},
update: function() {
this.setValueInEmitters(this.emitterGroup, 'opacity', this.data.opacity)
},
// may come in handy when changing more key-value pairs
setValueInEmitters(group, prop, value) {
for (let i = 0; i < group.length; i++) {
group[i].prop.value = value
}
}
})
可以为模式提供键值对等,以使组件更加通用。
3.为什么setAttribute这么重
从源代码中收集,任何更改都会删除旧的粒子组并从头开始创建一个新的粒子组。
推荐阅读
- django - DRF 中的 KeyError“请求”
- sql-server - 从 .bak 文件中恢复数据
- java - 我在哪里可以找到 Java 8u241?
- html - 通过导航栏创建类
- pyqt5 - CheckBox 到一个变量。PyQt5
- python - 如何在不使用 python 循环的情况下检测和转换列值的单位?
- angular - 如何使用数组在角度 7 中的 for 循环中填充 Flex 布局的内容
- r - 如何在 dplyr 分组数据上使用 rollmean
- c++ - 我的代码已成功提交,但尝试在代码厨师上运行代码时出现 SIGSEGV 错误
- css - 我尝试在 macOS 上的 CSS 中回退 SF Compact Rounded,而不是 -applye-system