【发布时间】:2021-03-21 05:39:40
【问题描述】:
我有一个 .glb 模型,其中包含多个对象和材料。我正在更新运行时具有某种材料的孩子,但由于有近 1,000 个孩子使用这种材料,这有点令人窒息。如果存在,我正在寻找更优雅的解决方案。
AFRAME.registerComponent('apply-texture', {
schema: {
texture: { type: 'string' }
},
init: function() {
var data = this.data;
var el = this.el;
var loader = new THREE.TextureLoader();
var alphamap = loader.load("./images/PETAL-DATA.jpg");
el.object3D.traverse(function(child) {
if (child.isMesh && child.material.name == "Material_to_update") {
var texture = loader.load(data.texture,
function ( texture ) {
child.material.map = texture;
child.material.alphaMap = alphamap;
child.material.map.encoding = THREE.sRGBEncoding;
child.material.side = THREE.DoubleSide;
child.material.color.set("#FFFFFF");
child.material.alphaTest = 0.5;
child.material.opacity = 0.8;
child.material.needsUpdate = true;
},
function ( xhr ) {
console.log( (xhr.loaded / xhr.total * 100) + '% loaded' );
},
function ( xhr ) {
console.log( 'An error happened' );
}
);
}
由于所有子对象都使用相同的材质,我希望有一种方法可以只更新材质本身,而不是更新 1,000 个子对象。
【问题讨论】:
-
你为什么要在每个循环中加载纹理??????您只需要加载一次纹理!
-
好点@jscastro 我已经修改了,但仍然存在遍历有很多孩子的模型的问题