Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在three.js中更改obj模型材质_Javascript_Three.js_Texture Mapping_Uv Mapping - Fatal编程技术网

Javascript 在three.js中更改obj模型材质

Javascript 在three.js中更改obj模型材质,javascript,three.js,texture-mapping,uv-mapping,Javascript,Three.js,Texture Mapping,Uv Mapping,我在blender中创建了一个带有UV贴图的3D模型。我应用UV贴图的方式是,纹理仅应用于模型的一侧。我将模型导出为obj和mtl。当我在three.js上导入此模型时,它会按预期工作,加载程序会自动应用mtl文件中定义的图像作为纹理 现在我想在three.js中以编程方式更改此纹理。模型有多种材质(我认为这是因为有多个面)。如何重新应用材质以保持UV贴图并仅更改应用的纹理?我想对模型应用map和envMap var m = new THREE.Me

我在blender中创建了一个带有UV贴图的3D模型。我应用UV贴图的方式是,纹理仅应用于模型的一侧。我将模型导出为
obj
mtl
。当我在
three.js
上导入此模型时,它会按预期工作,加载程序会自动应用
mtl
文件中定义的图像作为纹理

现在我想在
three.js
中以编程方式更改此纹理。模型有多种材质(我认为这是因为有多个面)。如何重新应用材质以保持UV贴图并仅更改应用的纹理?我想对模型应用
map
envMap

                       var m = new THREE.MeshPhongMaterial({
                            envMap: cubemap,
                            reflectivity: 0.9
                        });
                        var m2 = new THREE.MeshPhongMaterial({
                            envMap: cubemap,
                            color: parseInt(material.color, 16),
                            reflectivity: 0.9,
                            map: THREE.ImageUtils.loadTexture('/textures/uv_checker large.png')
                        });

                        loadedMesh.material = [m,m,m,m,m,m2,m2,m2,m];
经过一些尝试和错误后,使用
m
m2
位置。纹理已应用,但最终看起来与原始纹理不同。我有一些小的空白,甚至纹理的地方,我不应该有纹理,因为我的UV映射


我该怎么做呢?

好的,我找到了一个方法。我不知道这是否适用于所有模型,但我用另一种纹理替换了所有具有
贴图
纹理的材质,并用另一种不同的材质替换了所有其他材质。它工作得很好,紫外线贴图仍然在那里

var m1 = new THREE.MeshPhongMaterial({map: texture, ...});
var m2 = new THREE.MeshPhongMaterial({...});
for(var n = 0; n < model.material.length; ++n) {
   if(model.material[n].map) model.material[n] = m1;
   else model.material[n] = m2;
}
var m1=new THREE.MeshPhongMaterial({map:texture,…});
var m2=新的三点网格材质({…});
对于(变量n=0;n
我从不使用OBJMTLLoader,因为我过去遇到过问题,我会使用OBJLLoader加载模型,然后单独创建材质。