来自ThreeCSG布尔运算的意外网格结果

时间:2014-08-20 19:54:54

标签: three.js threecsg

我正在制作一个场景&使用布尔函数来切除墙上的洞。然而,照明显示所得到的形状使面部混乱。我希望表面看起来像一个坚固的部分,而不是碎片并向后显示照明。有谁知道我的几何体会出现什么问题?

布尔对象的代码如下:

//boolean subtract two shapes, convert meshes to bsps, subtract, then convert back to mesh 

var booleanSubtract = function (Mesh1, Mesh2, material) {

    //Mesh1 conversion
    var mesh1BSP = new ThreeBSP( Mesh1 );

    //Mesh2 conversion
    var mesh2BSP = new ThreeBSP( Mesh2 );

    var subtract_bsp = mesh1BSP.subtract( mesh2BSP );
    var result = subtract_bsp.toMesh( material );
    result.geometry.computeVertexNormals();
    return result;
};

我在场景中有两盏灯:

        var light = new THREE.DirectionalLight( 0xffffff, 0.75 );
        light.position.set( 0, 0, 1 );
        scene.add( light );

        //create a point light
        var pointLight = new THREE.PointLight(0xFFFFFF);

        // set its position
        pointLight.position.x = 10;
        pointLight.position.y = 50;
        pointLight.position.z = 130;

        // add to the scene
        scene.add(pointLight);

Unexpected Mesh Behaviour

编辑:使用WestLangley的建议,我能够部分修复墙渲染。并通过使用material.wireframe = true;我可以看到在布尔操作之后我的墙面没有合并。有没有办法合并它们?

unmerged faces

1 个答案:

答案 0 :(得分:4)

你的问题是由于两个问题造成的。

首先,您应该使用FlatShading

其次,正如this stackoverflow post中所述,MeshLambert材质仅计算每个顶点的光照,并在每个面上插入颜色。 MeshPhongMaterial计算每个纹素的颜色。

您需要使用MeshPhongMaterial来避免您看到的灯光瑕疵。

three.js r.68