【问题标题】:How to replace Collada-imported textures with ShaderMaterial ones in Three.js?如何在 Three.js 中用 ShaderMaterial 替换 Collada 导入的纹理?
【发布时间】:2012-06-02 16:30:38
【问题描述】:

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

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

“brochureFrontCover”->“brochureFrontCover-color.jpg”、“brochureFrontCover-normal.jpg”、“brochureFrontCover-spec.jpg”

如果哪位好心人能告诉我这样的功能应该是什么样子,我将不胜感激。

脚本: http://dev.printhouse.co.uk/uv-simulator/j/Brochure.js

科拉达型号: http://dev.printhouse.co.uk/uv-simulator/m/Brochure.dae

【问题讨论】:

    标签: javascript webgl three.js collada


    【解决方案1】:

    我觉得应该是这样的:

    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
            } );
    
        }
    
    } );
    

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

    【讨论】:

    • 谢谢mrdoob!我已经更新了脚本并且收到了GL_INVALID_OPERATION : glDrawXXX: attempt to access out of range vertices 错误。 dae 参数是否应该调用模型层次结构中的任何特定级别(我将其设置为 dae = collada.scene;)?
    • 哦哦!好吧,从child.material = new THREE.MeshBasicMaterial( { wireframe: true } ); 开始,看看至少它是否有效......
    • 是的,这显示了一个不错的线框模型。那么,你怎么看?
    • 如果这是库中的错误或者有其他方法可以更新我吗?非常感谢!
    • 那么,让child.material = new THREE.MeshBasicMaterial( { wireframe: true } ); 工作......你什么时候开始遇到问题?
    猜你喜欢
    • 1970-01-01
    • 2018-04-02
    • 2017-02-20
    • 2018-10-05
    • 2012-01-17
    • 2018-02-26
    • 2018-09-02
    • 2015-06-01
    • 2013-02-08
    相关资源
    最近更新 更多