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:如何正确使用卡通材质的法线贴图(如果可能)?_Javascript_Three.js_Gltf - Fatal编程技术网

Javascript THREE.JS:如何正确使用卡通材质的法线贴图(如果可能)?

Javascript THREE.JS:如何正确使用卡通材质的法线贴图(如果可能)?,javascript,three.js,gltf,Javascript,Three.js,Gltf,我现在正在我的网站上使用Three.js开发一个3D查看器,用于学习JavaScript并演示一些使用GLTFLoader和Blender对象的3D作品。 查看器是基本的,按预期运行,但我想尝试将gltf对象的StandardMaterial替换为ToonMaterial。从这个角度来看,我想我可以使用法线贴图,但我无法正确渲染它 这里有两张具有材料特性的试验对象图片: 以下是我的流程: 将对象的初始材质保存在变量中 创建新的MeshToonMaterial并从初始材质指定贴图 将卡通材质指

我现在正在我的网站上使用Three.js开发一个3D查看器,用于学习JavaScript并演示一些使用GLTFLoader和Blender对象的3D作品。 查看器是基本的,按预期运行,但我想尝试将gltf对象的StandardMaterial替换为ToonMaterial。从这个角度来看,我想我可以使用法线贴图,但我无法正确渲染它

这里有两张具有材料特性的试验对象图片:

以下是我的流程:

  • 将对象的初始材质保存在变量中
  • 创建新的MeshToonMaterial并从初始材质指定贴图
  • 将卡通材质指定给对象
  • 该过程有效,但灯光不再遵循法线贴图。
    守则摘录:

    /* ... */
    let initialMaterial = '';
    const threeTone = new THREE.DataTexture(
        Uint8Array.from([0, 0, 0, 128, 128, 128, 255, 255, 255]),3,1,THREE.RGBFormat
    );
    /* ... function called by an onclick event to swap materials */
    function toonAssign(){
        scene.traverse( function ( child, ) {
            if ( child.isMesh ) {
                if (child.material.type == 'MeshToonMaterial') {
                    child.material = initialMaterial;
                }
                else {
                    let oldMaterial = child.material;
                    let toonMaterial = new THREE.MeshToonMaterial({
                        gradientMap: threeTone,
                        map: oldMaterial.map,
                        normalMap: oldMaterial.normalMap
                    });
                    child.material = toonMaterial;
                    child.material.needsUpdate = true;
                }
            }
        } );
    }
    /* ... initial material come from the gltf object here */
    let loader = new THREE.GLTFLoader(manager);
    loader.load( modelName + '.gltf', function ( gltf ) {
        gltf.scene.traverse( function ( child ) {
            if ( child.isMesh ) {
                child.castShadow = true;
                child.receiveShadow = true;
                defaultMaterial = child.material;
                child.material.needsUpdate = true;
            }
        } );
        scene.add( gltf.scene );
    } );
    /* ... */
    
    我肯定遗漏了一些东西,因为法线贴图正在显示并部分工作,但切线似乎没有用正确的方式或类似的方式

    我是Three.js的新手,我找不到任何结合了Three.js、'toon material'和'normal map'的技巧,所以我不知道该怎么做,或者如果这不可能或者什么的话

    任何帮助都是有用的,如果我遗漏了什么可以解释的,请告诉我