Use A-frame Img Assets Inside Javascript
Solution 1:
You're using mesh.traverse()
which calls your function once per child of mesh
. If you have two children in your mesh, it'll call TextureLoader.load()
twice. Simply take the load call out of traverse()
, and you should see the image loaded just once.
let mesh = this.el.getObject3D('mesh')
letTextureLoader = newTHREE.TextureLoader()
let mymap = TextureLoader.load( data.mymap )
mesh.traverse( function( child )
{
if ( child.isMesh )
{
child.material = newTHREE.MeshPhongMaterial({ map: mymap })
child.material.needsUpdate = true;
}
})
Solution 2:
After some research digging in ThreeJs code I've found that TextureLoader
relies on ImageLoader
(see here) which, before loading a new image, it looks into THREE.Cache
to see if the image has already been loaded (see here).
Loading images as img
in AFrame doesn't store them in THREE.Cache
therefore the image was loaded twice. But if you load the image as a-asset-item
it does.
So there is no need to change anything in javascript. Just use a-asset-item
instead of img
.
For more info see AFrame documentation
Post a Comment for "Use A-frame Img Assets Inside Javascript"