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 ThreeCSG布尔运算导致意外网格结果_Three.js_Threecsg - Fatal编程技术网

Three.js ThreeCSG布尔运算导致意外网格结果

Three.js ThreeCSG布尔运算导致意外网格结果,three.js,threecsg,Three.js,Threecsg,我正在创建一个场景&使用布尔函数在我的墙上剪出洞。但是,灯光显示,生成的形状已经弄乱了面。我希望表面看起来像一个实体,而不是支离破碎并向后显示灯光。有人知道我的几何学出了什么问题吗 布尔对象的代码如下所示: //boolean subtract two shapes, convert meshes to bsps, subtract, then convert back to mesh var booleanSubtract = function (Mesh1, Mesh2, materia

我正在创建一个场景&使用布尔函数在我的墙上剪出洞。但是,灯光显示,生成的形状已经弄乱了面。我希望表面看起来像一个实体,而不是支离破碎并向后显示灯光。有人知道我的几何学出了什么问题吗

布尔对象的代码如下所示:

//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);

编辑:使用WestLangley的建议,我能够部分修复墙壁渲染。并使用材质。线框=真;我可以看到,在布尔运算之后,我的墙面没有合并。有没有办法合并它们


您的问题是由两个问题造成的

首先,您应该使用
FlatShading

其次,如中所述,
MeshLambert
material仅计算每个顶点处的照明,并在每个面上插值颜色<代码>网格材质计算每个纹理的颜色

您需要使用
MeshPhongMaterial
来避免看到的照明瑕疵


three.js r.68

使用
three.VerteNormalsHelper
以便可以看到顶点法线。我希望
computeVertexNormals()
是一种您不应该使用的方法,因为它平滑共享法线。可以调用
computeFaceNormals()
并使用
THREE.FlatShading
。确保您的库版本兼容。@WestLangley删除computeVertexNormals()肯定有助于修复墙的外观。谢谢但由于某些原因,这些面看起来仍然按照布尔值分割。ThreeCSG在布尔运算后不会将面合并为一个面吗?如果您设置
material.wireframe=TRUE
@WestLangley,可能您会有所了解,我可以看到面没有合并,但不知道如何修复。您使用的是
MeshLambertMaterial
?如果是,请尝试
MeshPhongMaterial