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
three.js透明材质:对象不总是透明的_Three.js_Trace_Transparent - Fatal编程技术网

three.js透明材质:对象不总是透明的

three.js透明材质:对象不总是透明的,three.js,trace,transparent,Three.js,Trace,Transparent,我使用Three.js查看和拾取对象,但存在可见性问题 我在three.js中加载了collada对象 我的collada加载器与回购的有点不同。我补充说 function copyMaterial (_material) { var newMaterial = new THREE.MeshLambertMaterial(); for (var p in _material) { if (_material.hasOwnProperty(p) &&

我使用Three.js查看和拾取对象,但存在可见性问题

我在three.js中加载了collada对象 我的collada加载器与回购的有点不同。我补充说

function copyMaterial (_material) {
    var newMaterial = new THREE.MeshLambertMaterial();
    for (var p in _material) {
        if (_material.hasOwnProperty(p) && p !== "id") {
            var obj = _material[p];
            newMaterial[p] = obj;
        }
    }
    return newMaterial;
}
当加载一个材料时,我只是在分配它之前复制它

这允许我分别更改每个对象的不透明度,即使它们使用相同的collada材质

这很有效。 现在通过这样做,我看到了一些奇怪的行为。 根据对象的方向,某些部分是否通过透明度显示。 截图可以更好地解释

你知道发生了什么以及如何解决吗


谢谢

据我所知,这种情况有两种:

1) 在同一位置上设置了多个镶嵌面,其中一个可见,另一个不可见时。所以在渲染时,它取决于要首先渲染的面所在的摄影机角度

2) 通常尝试将对象的所有部分设置为透明,但仍希望能够通过其他面看到某些面时。同样,渲染器就是这样工作的

现在,我找到的唯一解决方案是将正面和背面指定为单独的材质,并将它们都设置为同一对象(我猜是对象的一部分):


关于这个问题的更多信息,据我所知,这有两种情况:

1) 在同一位置上设置了多个镶嵌面,其中一个可见,另一个不可见时。所以在渲染时,它取决于要首先渲染的面所在的摄影机角度

2) 通常尝试将对象的所有部分设置为透明,但仍希望能够通过其他面看到某些面时。同样,渲染器就是这样工作的

现在,我找到的唯一解决方案是将正面和背面指定为单独的材质,并将它们都设置为同一对象(我猜是对象的一部分):


有关此问题的更多信息

非常感谢Alex的回答。这个解决方案似乎相当繁重,但至少有一个!非常感谢亚历克斯的回答。这个解决方案似乎相当繁重,但至少有一个!
texture = new THREE.Texture(textureImage);
texture.needsUpdate = true;
material = new THREE.MeshBasicMaterial({
    map: texture,
    transparent: true,
    side: THREE.BackSide
 }); 
material2 = new THREE.MeshBasicMaterial({
    map: texture,
    transparent: true
});
geometry = new THREE.SphereGeometry(RADIUS, 40, 20);
mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);
mesh = new THREE.Mesh(geometry, material2);
scene.add(mesh);