我有一个ThreeJS场景,我想提供在不同模式下观看所有模型的选项(有或没有纹理和/或线框)。
我试图只使用一个几何图形和每个对象使用一个材质来完成此任务。
当我尝试通过将其材质的map属性设置为null来删除对象的纹理时,会发生奇怪的事情。该对象采用最新加载的纹理,即使它已加载并应用于另一个对象。这是某种预期的行为吗?如果没有,我该如何删除地图?
答案 0 :(得分:0)
一个好的方法是从头开始初始化你需要的材料:
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加载图片有点棘手。
注意:当许多物体共享相同的材料时要小心!如果您对对象的材质进行更改,则会影响所有其他对象(显然是因为它是共享的)。