Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.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_3d_Three.js - Fatal编程技术网

Javascript Three.js删除内表面

Javascript Three.js删除内表面,javascript,3d,three.js,Javascript,3d,Three.js,我正在使用three.GeometryUtils.merge将多个立方体合并成不同的块形状。我想使这些块形状透明,但当它透明时,您可以看到它是多个立方体粘在一起,如下所示: 如何在不渲染内部边的情况下使合并的立方体透明?(如何移除内表面?) 合并多维数据集的我的代码: geometry = new THREE.CubeGeometry(STEP_SIZE, STEP_SIZE, STEP_SIZE); for (i = 0; i < shape.length; i++) { tm

我正在使用
three.GeometryUtils.merge
将多个立方体合并成不同的块形状。我想使这些块形状透明,但当它透明时,您可以看到它是多个立方体粘在一起,如下所示:

如何在不渲染内部边的情况下使合并的立方体透明?(如何移除内表面?)

合并多维数据集的我的代码:

geometry = new THREE.CubeGeometry(STEP_SIZE, STEP_SIZE, STEP_SIZE);
for (i = 0; i < shape.length; i++) {
    tmpGeometry =  new THREE.Mesh(new THREE.CubeGeometry(STEP_SIZE, STEP_SIZE, STEP_SIZE));
    tmpGeometry.position.x = STEP_SIZE * shape[i].x;
    tmpGeometry.position.y = STEP_SIZE * shape[i].y;
    THREE.GeometryUtils.merge(geometry, tmpGeometry);
}

block = new THREE.Mesh(geometry, new THREE.MeshBasicMaterial({ color: 0x0000ff, opacity: 0.5, transparent: true }));
geometry=新的三次立方测量法(步长、步长、步长);
对于(i=0;i
您实际上可以单独初始化立方体的每个面材质,并单独将内部面的不透明度设置为0。代码是这样的

    var materialArray = [];

        materialArray.push(new THREE.MeshLambertMaterial({
            opacity:0,
            color:0x0000FF,
            transparent: true
        }));// assuming you want this face to be transparent 
        materialArray.push(new THREE.MeshLambertMaterial({
            opacity:0,
            color:0x0000FF,
            transparent: true
        }));// assuming you want this face to be transparent
        materialArray.push(new THREE.MeshLambertMaterial({
            opacity:0.5,
            color:0x0000FF,
            transparent: true
        }));
        materialArray.push(new THREE.MeshLambertMaterial({
            opacity:0.5,
            color:0x0000FF,
            transparent: true
        }));
        materialArray.push(new THREE.MeshLambertMaterial({
            opacity:0.5,
            color:0x0000FF,
        transparent: true
        }));
        materialArray.push(new THREE.MeshLambertMaterial({
            opacity:0.5,
            color:0x0000FF,
            transparent: true
        }));
        var CubeMat = new THREE.MeshFaceMaterial(materialArray);
block = new THREE.Mesh(geometry,CubeMat )
然后像这样把它传给你的立方体网格

    var materialArray = [];

        materialArray.push(new THREE.MeshLambertMaterial({
            opacity:0,
            color:0x0000FF,
            transparent: true
        }));// assuming you want this face to be transparent 
        materialArray.push(new THREE.MeshLambertMaterial({
            opacity:0,
            color:0x0000FF,
            transparent: true
        }));// assuming you want this face to be transparent
        materialArray.push(new THREE.MeshLambertMaterial({
            opacity:0.5,
            color:0x0000FF,
            transparent: true
        }));
        materialArray.push(new THREE.MeshLambertMaterial({
            opacity:0.5,
            color:0x0000FF,
            transparent: true
        }));
        materialArray.push(new THREE.MeshLambertMaterial({
            opacity:0.5,
            color:0x0000FF,
        transparent: true
        }));
        materialArray.push(new THREE.MeshLambertMaterial({
            opacity:0.5,
            color:0x0000FF,
            transparent: true
        }));
        var CubeMat = new THREE.MeshFaceMaterial(materialArray);
block = new THREE.Mesh(geometry,CubeMat )

查看此演示

经过一些实验,我终于得到了我想要的。希望这能帮助其他人

我遍历块的每个面,并使用面的质心和反向法线(使法线指向内部)对块本身进行光线投射。如果它与块的另一个面相交,我们知道该面是一个内面,我们可以继续并移除它

// block is a Three.Mesh object
function removeInternalFaces(block) {
    var geometry = block.geometry;
    var face;
    var toDelete = [];
    var blockRaycaster = new THREE.Raycaster();

    // raycast itself from the center of each face (negated normal), and whichever face gets intersected
    // is an inner face
    for (i = 0; i < geometry.faces.length; i++) {
        face = geometry.faces[i];
        if (face) {
            normal = face.normal.clone();
            normal.negate();
            blockRaycaster.set(face.centroid, normal);
            intersects = blockRaycaster.intersectObject(block);
            for (j = 0; j < intersects.length; j++) {
                toDelete.push(intersects[j].faceIndex);
            }
        }
    }

    // actually delete them
    for (i = 0; i < toDelete.length; i++) {
        delete geometry.faces[toDelete[i]];
    }
    geometry.faces = geometry.faces.filter( function(v) { return v; });
    geometry.elementsNeedUpdate = true; // update faces
}
//块是一个3.Mesh对象
函数removeInternalFaces(块){
var geometry=block.geometry;
变脸;
var toDelete=[];
var blockRaycaster=new THREE.Raycaster();
//从每个面的中心(否定法线)以及相交的面进行光线投射
//是一个内表面
对于(i=0;i
谢谢你的建议!虽然这并不完全是我想要的——但我自己想出了一个解决方案。再次感谢!另一种方法是:从它看起来像的面上删除质心。我正试图找到另一个解决方案,实现了与modern three(用r76测试)一起使用的功能