Как насчет компонента, который загружает .png
s как текстуры и заменяет их через фиксированный интервал:
AFRAME.registerComponent("slideshow", {
init: function() {
загружает и сохраняет изображения
var loader = new THREE.TextureLoader()
this.array = []
this.array.push(loader.load("one.png"))
this.array.push(loader.load("two.png"))
Вместо того, чтобы делать это один за другим, вы можете сделать это в цикле ("img-" + i + ".png").Также вы можете предоставить список, используя схему.
Дождитесь загрузки объекта:
this.el.addEventListener('loaded', e => {
let mesh = this.getObject3D('mesh')
let material = mesh.material
поменяйте местами текстуру material.map
в tick()
или в пределах интервала:
let i = 0
setInterval(e => {
// if we're at the last element - swap to the first one
if (i >= this.array.length) i = 0
this.material.map = this.array[i++]
this.material.needsUpdate = true
и он должен работать как в этой скрипке , когда присоединен к сущности:
<a-box slideshow></a-box>
- Почему
this.array
?Например, вы можете легко получить к нему доступ в обратном вызове remove()
и использовать текстуры для освобождения памяти. - Почему бы просто не сделать
setAttribute('material', 'src', 'img-' + i + '.png')
?Я считаю, что с большим количеством изображений это может быть крайне неэффективно.