Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.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中将Collada导入的纹理替换为ShaderMaterial纹理?_Javascript_Webgl_Three.js_Collada - Fatal编程技术网

Javascript 如何在Three.js中将Collada导入的纹理替换为ShaderMaterial纹理?

Javascript 如何在Three.js中将Collada导入的纹理替换为ShaderMaterial纹理?,javascript,webgl,three.js,collada,Javascript,Webgl,Three.js,Collada,有没有办法替换通过Collada loader在Three.js库中导入的简单3D模型中的所有纹理 我想完成的是通过ShaderMaterial将颜色、镜面反射和法线贴图应用于模型,方法是指向具有模型材质名称但添加了“-color”、“normal”和“-spec”措辞的新文件: “BrochureFronCover”->“BrochureFronCover颜色.jpg”、“BrochureFronCover普通.jpg”、“BrochureFronCover-spec.jpg” 如果有一个好的

有没有办法替换通过Collada loader在Three.js库中导入的简单3D模型中的所有纹理

我想完成的是通过ShaderMaterial将颜色、镜面反射和法线贴图应用于模型,方法是指向具有模型材质名称但添加了“-color”、“normal”和“-spec”措辞的新文件:

“BrochureFronCover”->“BrochureFronCover颜色.jpg”、“BrochureFronCover普通.jpg”、“BrochureFronCover-spec.jpg”

如果有一个好的灵魂能告诉我这样的功能应该是什么样子,我将非常感激

剧本:

Collada型号:
我认为应该是这样的:

THREE.SceneUtils.traverseHierarchy( dae, function ( child ) {

    if ( child.material ) {

        var shader = THREE.ShaderUtils.lib[ "normal" ];
        var uniforms = THREE.UniformsUtils.clone( shader.uniforms );

        uniforms[ "tDiffuse" ].texture = THREE.ImageUtils.loadTexture( child.material.name + "-color.jpg" );
        uniforms[ "tNormal" ].texture = THREE.ImageUtils.loadTexture( child.material.name + "-normal.jpg" );
        uniforms[ "tSpecular" ].texture = THREE.ImageUtils.loadTexture( child.material.name + "-spec.jpg" );

        uniforms[ "enableDiffuse" ].value = true;
        uniforms[ "enableSpecular" ].value = true;

        child.geometry.computeTangents();

        child.material = new THREE.ShaderMaterial( {
            uniforms: uniforms,
            vertexShader: shader.vertexShader,
            fragmentShader: shader.fragmentShader,
            lights: true
        } );

    }

} );

如果你需要调整制服,这应该是一个很好的参考。

谢谢mrdoob!我已经更新了脚本,正在获取
GL\u无效\u操作:glDrawXXX:尝试访问超出范围的顶点
错误。
dae
参数是否应该调用模型层次结构中的任何特定级别(我将其设置为
dae=collada.scene;
)?噢,嗯!首先,执行
child.material=new THREE.MeshBasicMaterial({wireframe:true})看看是否至少可以…是的,这显示了一个很好的线框模型。那么,你认为呢?如果这是库中的一个bug,或者有其他方法,有人能告诉我吗?非常感谢!因此,拥有
child.material=new THREE.MeshBasicMaterial({wireframe:true})工作。。。什么时候开始出现问题?