Javascript 使用threeBSP方法后,创建的球体不平滑

Javascript 使用threeBSP方法后,创建的球体不平滑,javascript,three.js,csg,Javascript,Three.js,Csg,我试图改变球体的分段数,但是如果我已经达到45的限制,我就不能切割它,而且没有其他方法可以使球体更平滑 var result; var sphereG = new THREE.SphereGeometry( 115, 45, 45 ); var sphereM = new THREE.MeshPhongMaterial({color:"#fff"} ); var sphere = new THREE.Mesh(sphereG,sphereM); var polyhedronG = new THR

我试图改变球体的分段数,但是如果我已经达到45的限制,我就不能切割它,而且没有其他方法可以使球体更平滑

var result;
var sphereG = new THREE.SphereGeometry( 115, 45, 45 );
var sphereM = new THREE.MeshPhongMaterial({color:"#fff"} );
var sphere = new THREE.Mesh(sphereG,sphereM);
var polyhedronG = new THREE.Geometry();
polyhedronG.vertices.push(
    new THREE.Vector3(-200,200,-200),   //A 0
    new THREE.Vector3(-200,-200,200),   //B 1
    new THREE.Vector3(200,-200,-200),   //D 2
    new THREE.Vector3(-1,-1,-1)         //O 3
);
polyhedronG.faces.push( 
   new THREE.Face3( 0, 1, 2 ),
   new THREE.Face3( 0, 2, 3 ),
   new THREE.Face3( 0, 3, 1 ),
   new THREE.Face3( 3, 2, 1 )
);
var polyhedronM = new THREE.MeshPhongMaterial( {
    color:"#E8FBFF",
    side:THREE.DoubleSide,
    transparent:true,
    opacity:0.1
});
var polyhedron  = new THREE.Mesh(polyhedronG,polyhedronM);
var boxBSP = new ThreeBSP(polyhedron);
var sphereBSP = new ThreeBSP(sphere);
var resultBSP = sphereBSP.subtract(boxBSP);              
result = resultBSP.toMesh();
result.material=new THREE.MeshPhongMaterial({color:'#fff'});
你应该做你想做的事:

result = resultBSP.toMesh();
result.material=new THREE.MeshPhongMaterial({color:'#fff'});
result.geometry.computeVertexNormals();
请参阅代码片段:

对于右侧网格,调用了
computeVertexNormals()
,而对于左侧网格,未调用该函数

(函数onLoad(){
var容器、摄影机、场景、渲染器、控件;
init();
制作动画();
函数createModel(){
var sphereG=新的三种。球化法(115,45,45);
var sphere=新的三网格(sphereG);
var polyhedronG=新的三点几何体();
多面体。顶点。推(
新的3.Vector3(-200200,-200),//a0
新的3.Vector3(-200,-200200),//b1
新的3.Vector3(200,-200,-200),//d2
新的3.Vector3(-1,-1,-1)//o3
);
多面体。面。推(
新三面3(0,1,2),
新三面3(0,2,3),
新的三面3(0,3,1),
新三面三(3,2,1)
);
var polyhedronM=新的三种网格材料({
颜色:“E8FBFF”,
三面,双面,
透明:是的,
不透明度:0.1
});
var多面体=新的三点网格(多面体,多面体M);
var boxBSP=新的三BSP(多面体);
var sphereBSP=新的三个BSP(球体);
var ResultBS1=sphereBSP.subtract(boxBSP);
var resultMesh1=resultbp1.toMesh();
结果mesh1.material=新的3.MeshPhongMaterial({color:'#ff8080'});
结果网格1.position.x=100
var resultBSP2=sphereBSP.subtract(boxBSP);
var resultMesh2=resultBSP2.toMesh();
resultMesh2.material=新的三网格材质({color:'#ff8080'});
结果mesh2.position.x=-100
结果网格2.geometry.computeVertexNormals();
添加(结果网格1);
场景.添加(resultMesh2);
}
函数init(){
container=document.getElementById('container');
renderer=new THREE.WebGLRenderer({
反别名:对
});
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(window.innerWidth、window.innerHeight);
renderer.shadowMap.enabled=true;
container.appendChild(renderer.domeElement);
场景=新的三个。场景();
scene.background=新的三种颜色(0xffffff);
摄像头=新的三个透视摄像头(70,window.innerWidth/window.innerHeight,11000);
摄像机位置设置(0,-400,-150);
场景。添加(摄影机);
调整大小();
window.onresize=调整大小;
var环境光=新的三个环境光(0x404040);
场景。添加(环境光);
var方向光=新的三个方向光(0xffffff,0.5);
方向光.position.x=-1;
方向光位置y=0;
方向光.position.z=-2;
场景。添加(方向光);
控件=新的三个.轨道控件(摄影机、渲染器.doElement);
createModel();
}
函数resize(){
renderer.setSize(window.innerWidth、window.innerHeight);
camera.aspect=window.innerWidth/window.innerHeight;
camera.updateProjectMatrix();
}
函数animate(){
请求动画帧(动画);
render();
}
函数render(){
渲染器。渲染(场景、摄影机);
}
})();


欢迎来到SO。你能分享一些代码给你的问题更多的上下文吗?这些是我用threeBSP剪切的代码,我真诚地希望你能帮助我,这将使结果看起来更平滑:
result.geometry.mergeVertices();result.geometry.computeVertexNormals()