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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.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
在Three.js中引用与Promise相同的基本纹理文件时出错_Three.js - Fatal编程技术网

在Three.js中引用与Promise相同的基本纹理文件时出错

在Three.js中引用与Promise相同的基本纹理文件时出错,three.js,Three.js,我正在使用示例,但在使用promise时无法让代码同时读取金属和粗糙贴图(Cerberus_RM metalness在通道B中粗糙度在通道G中): 产生错误: BasisTextureLoader.js:152未捕获(承诺中)DomeException:未能对“Worker”执行“postMessage”:索引0处的ArrayBuffer已被中性化。 在examples/jsm/loaders/basistextureload.js:152:13 在新的承诺() 在examples/jsm/lo

我正在使用示例,但在使用promise时无法让代码同时读取金属和粗糙贴图(Cerberus_RM metalness在通道B中粗糙度在通道G中):

产生错误:

BasisTextureLoader.js:152未捕获(承诺中)DomeException:未能对“Worker”执行“postMessage”:索引0处的ArrayBuffer已被中性化。
在examples/jsm/loaders/basistextureload.js:152:13
在新的承诺()
在examples/jsm/loaders/basistextureload.js:146:12

我尝试了这段代码,但我只得到了一个没有粗糙度的全金属纹理对象(粗糙度和金属度设置均为1)。我能得到一些关于如何用承诺来构建这个的指导吗

Promise.all([
                new Promise((resolve, reject) => basisLoader.load( "Photog_Glace1/Cerberus_A.basis", resolve, undefined, reject ) ),
                new Promise((resolve, reject) => basisLoader.load( "Photog_Glace1/Cerberus_N.basis", resolve, undefined, reject ) ),
                new Promise((resolve, reject) => basisLoader.load(Photog_Glace1/Cerberus_RM.basis", resolve, undefined, reject ) ),
            ]).then(([albedoM, normalMap, metalMap, roughMap]) => {
            albedoM.encoding = THREE.sRGBEncoding;
                                albedoM.wrapS = THREE.RepeatWrapping;
                                albedoM.wrapT = THREE.RepeatWrapping;
            albedoM.repeat.x = 1;
                                albedoM.repeat.y = 1;

            normalMap.wrapS = THREE.RepeatWrapping;
                                normalMap.wrapT = THREE.RepeatWrapping;
                                normalMap.repeat.x = 1;
                                normalMap.repeat.y = 1;

            metalMap.wrapS = THREE.RepeatWrapping;
                                metalMap.wrapT = THREE.RepeatWrapping;
                                metalMap.repeat.x = 1;
                                metalMap.repeat.y = 1;
            roughMap=metalMap;

             vaseMeshMaterial = new THREE.MeshStandardMaterial({
                    roughnessMap: roughMap,
                    metalnessMap: metalMap,
                    map: albedoM,
                    normalMap: normalMap,
                    roughness: settings.roughness,
                    metalness: settings.metalness,
                    side: THREE.DoubleSide
                    });

                    roughMap.wrapS = THREE.RepeatWrapping;
                    roughMap.wrapT = THREE.RepeatWrapping;
                    roughMap.repeat.x = 1;
                    roughMap.repeat.y = 1;
如果three.js论坛不可用,解决方案是:

Promise.all([
新承诺((解决,拒绝)=>basisLoader.load(“Photog_Glace1/albedo.basis”,解决,未定义,拒绝)),
新承诺((解决,拒绝)=>basisLoader.load(“Photog_Glace1/normal.basis”,解决,未定义,拒绝)),
新承诺((解决,拒绝)=>basisLoader.load(“Photog_Glace1/Cave.basis”,解决,未定义,拒绝)),
新承诺((解决,拒绝)=>basisLoader.load(“Photog_Glace1/rough_metal_Map.basis”,解决,未定义,拒绝)),
])。然后(([albedoM,normalMap,aoMap,metalRoughMap])=>{
albedoM.encoding=3.sRGBEncoding;
vaseMeshMaterial=新的三点网格标准材质({
粗糙度贴图:金属粗糙度贴图,
metalnessMap:metalRoughMap,
地图:反射率,
法线贴图:法线贴图,
粗糙度:设置。粗糙度,
金属度:设置。金属度,
aoMap:aoMap,
AOMAPI强度:1,
不正确,,
侧面:三个。双面
});
控制台日志(“材料完成装载”);
myObjectLoader.load(“Photog_Glace1/Glace1_Model.obj”,函数(组){
var geometry=group.children[0]。几何体;
geometry.attributes.uv2=geometry.attributes.uv;
几何中心();
vaseMesh=新的三点网格(几何体、vaseMeshMaterial);
vaseMeshMaterial.normalScale.x=-1;
vaseMesh.castShadow=true;
vaseMesh.receiveShadow=true;
瓦塞梅什位置集(28,0,0);
},onProgress,onError);

});问题在于basis loader不会多次读取同一文件,例如,B通道中的金属和g通道中的粗糙。我无法使用Promise获得正确的代码。感谢@Mugen87和@donmccurdy帮助解决了这个问题,Three.js forum上的完整线程

问题是basis loader不会多次读取同一个文件,例如B通道中的metallic和g通道中的rough。我无法使用Promise获得正确的代码。感谢@Mugen87和@donmccurdy帮助解决了这个问题,Three.js论坛上的完整线程

请使用堆栈片段创建一个最小的示例。您可以从cdnjs链接three.js的副本。通过一个片段,我们不仅可以看到您如何配置所有内容,还可以看到您在渲染场景中看到的内容。Hi@TheJim01我使用webgl_materials_standard three.js示例进行了测试,问题似乎是我无法为不同的材质属性读取相同的纹理文件-我使用promise,因为我使用基本纹理。如何正确编码以引用金属/粗糙属性的相同纹理文件?请使用堆栈片段创建一个最小示例。您可以从cdnjs链接three.js的副本。通过一个片段,我们不仅可以看到您如何配置所有内容,还可以看到您在渲染场景中看到的内容。Hi@TheJim01我使用webgl_materials_standard three.js示例进行了测试,问题似乎是我无法为不同的材质属性读取相同的纹理文件-我使用promise,因为我使用基本纹理。如何正确编码以引用金属/粗糙属性的同一纹理文件?请在回答中给出解决方案的要点?我不认为three.js论坛会很快关闭,但是外部链接甚至会随着时间的推移而改变,并且您的解决方案的上下文可能会丢失。请在您的回答中在此发布解决方案的要点,好吗?我不认为three.js论坛会很快消失,但外部链接甚至会随着时间的推移而改变,您的解决方案的上下文可能会丢失。
Promise.all([
                new Promise((resolve, reject) => basisLoader.load( "Photog_Glace1/Cerberus_A.basis", resolve, undefined, reject ) ),
                new Promise((resolve, reject) => basisLoader.load( "Photog_Glace1/Cerberus_N.basis", resolve, undefined, reject ) ),
                new Promise((resolve, reject) => basisLoader.load(Photog_Glace1/Cerberus_RM.basis", resolve, undefined, reject ) ),
            ]).then(([albedoM, normalMap, metalMap, roughMap]) => {
            albedoM.encoding = THREE.sRGBEncoding;
                                albedoM.wrapS = THREE.RepeatWrapping;
                                albedoM.wrapT = THREE.RepeatWrapping;
            albedoM.repeat.x = 1;
                                albedoM.repeat.y = 1;

            normalMap.wrapS = THREE.RepeatWrapping;
                                normalMap.wrapT = THREE.RepeatWrapping;
                                normalMap.repeat.x = 1;
                                normalMap.repeat.y = 1;

            metalMap.wrapS = THREE.RepeatWrapping;
                                metalMap.wrapT = THREE.RepeatWrapping;
                                metalMap.repeat.x = 1;
                                metalMap.repeat.y = 1;
            roughMap=metalMap;

             vaseMeshMaterial = new THREE.MeshStandardMaterial({
                    roughnessMap: roughMap,
                    metalnessMap: metalMap,
                    map: albedoM,
                    normalMap: normalMap,
                    roughness: settings.roughness,
                    metalness: settings.metalness,
                    side: THREE.DoubleSide
                    });

                    roughMap.wrapS = THREE.RepeatWrapping;
                    roughMap.wrapT = THREE.RepeatWrapping;
                    roughMap.repeat.x = 1;
                    roughMap.repeat.y = 1;