我有一个ThreeJS场景,我想提供在不同模式下看到所有模型的选项(不管有没有纹理和/或线框)。
我试着用一个几何学和每一个物体的一种材料来完成这个任务。
当我试图删除一个对象的纹理,将其材质的map属性设置为空时,会发生一些奇怪的事情。该对象接受最新加载的纹理,即使它被加载并应用于另一个对象。这是一种预期的行为吗?如果没有,我应该如何删除地图?
发布于 2016-05-20 18:16:19
一个很好的方法是从一开始就初始化您需要的材料:
var materials = {};
materials['lambert'] = new THREE.MeshLambertMaterial( { color: 0xdddddd, shading: THREE.SmoothShading } );
materials['phong'] = new THREE.MeshPhongMaterial( { color: 0xFF0000, specular: 0x009900, shininess: 30, shading: THREE.FlatShading } );
materials['basic'] = new THREE.MeshBasicMaterial( { color: 0xffaa00, transparent: true, blending: THREE.AdditiveBlending } );
materials['wireframe'] = new THREE.MeshBasicMaterial( { color: 0xffffff, wireframe : true } );
并在需要时替换对象的材料:
function changeMaterial(id){
mesh.material = materials[id];
}
changeMaterial('wireframe');
我做了一把小提琴,证明了这一点:http://jsfiddle.net/95t964o0/75/
我没有使用带有纹理的材料,因为jsfiddle.com加载图像有点棘手。
注意:当许多物体共享相同的材料时,要小心!如果对对象的材料进行更改,它会影响所有其他对象(显然是因为它是共享的)。
https://stackoverflow.com/questions/37280995
复制相似问题