1.核心关键思路:获取所有将要拍平的点,判断这些点是否在我们规定的面中,这里我们以z轴为上,只判断二维面。若点在其内改变它的z轴,实现拍平。
2.核心算法,代码如下:
function isLeft(first_cube_point, second_cube_point, obj_point) { var abc = ((second_cube_point.x - first_cube_point.x) * (obj_point[1] -first_cube_point.y) - ( obj_point[0]- first_cube_point.x) * (second_cube_point.y - first_cube_point.y)); return abc; } function sInRegion(obj_point, array_cube_point) { var wn = 0; var j=0; for (var i = 0; i < array_cube_point.length; i++) { //开始循环 if (i ==array_cube_point.length - 1) { j = 0;//如果 循环到最后一点 第二个指针指向第一点 } else { j = j + 1; //如果不是 ,则找下一点 } if (array_cube_point[i].y <= obj_point[1]) // 如果多边形的点 小于等于 选定点的 Y 坐标 { if (array_cube_point[j].y > obj_point[1]) // 如果多边形的下一点 大于于 选定点的 Y 坐标 { if (isLeft(array_cube_point[i], array_cube_point[j], obj_point) > 0) { wn++; } } } else { if (array_cube_point[j].y <= obj_point[1]) { if (isLeft(array_cube_point[i], array_cube_point[j], obj_point) < 0) { wn--; } } } } if(wn == 0) { return false; } else { return true; } }
3.拍平模型获取与排序。代码如下:
function operation_Subtract(firstmesh,secondmesh) {
console.log(firstmesh);
console.log(secondmesh);
var firstmesh_v=firstmesh.geometry.vertices;
var secondmesh_v=secondmesh.geometry.attributes.position.array;
var two_secondmesh_v=new Array();
var firstmesh_v_length=firstmesh.geometry.vertices.length/2;
var need_change_xyz=new Array();
//冒泡
if(firstmesh.geometry.type==='BoxGeometry'){
for(var i=0;i<firstmesh_v.length-1;i++){
//开闭原则。(写在第一个for循环里,是为了,每轮比较初始化bool变量变为true。
var bool=true;
//2.指定轮数和次数(内循环控制次数)
for(var j=0;j<firstmesh_v.length-1-i;j++){
//3.判断是否符合标准。如果符合标准交换位置。
//从小到大排列顺滑,如果前面的比后面的大,那么交换位置。
if(firstmesh_v[j].z < firstmesh_v[j+1].z){
var temp = firstmesh_v[j];
firstmesh_v[j] = firstmesh_v[j+1];
firstmesh_v[j+1] = temp;
bool = false;
}
}
//bool这个变量默认值为true;如果本轮比较有一对元素相互交换位置,那么也不能跳出循环。
//但是,如果本轮比较没有任何元素相互交换位置,那么说明已经比较完成,可以跳出循环。
if(bool){
var change_cube= firstmesh_v[2];
firstmesh_v[2]= firstmesh_v[3];
firstmesh_v[3]=change_cube;
break;
}
}
}
for (var m=0;m<firstmesh_v_length;m++){
// need_change_xyz[m]=new Array();//声明二维数组
var point=new THREE.Vector3(firstmesh_v[m].x,firstmesh_v[m].y,firstmesh_v[m].z);
need_change_xyz[m]=point.applyMatrix4(firstmesh.matrix);
(function (n) {
need_change_xyz[n].x-=secondmesh.position.x;
need_change_xyz[n].y-=secondmesh.position.y;
need_change_xyz[n].z-=secondmesh.position.z;
})(m)
}
console.log(need_change_xyz);
//var M_point=need_change_xyz[0].applyMatrix4(firstmesh.matrix);
//console.log(M_point);
for(var n=0;n<secondmesh_v.length/3;n++){
two_secondmesh_v[n]=new Array();
two_secondmesh_v[n][0]=secondmesh_v[3*n];
two_secondmesh_v[n][1]=secondmesh_v[3*n+1];
two_secondmesh_v[n][2]=secondmesh_v[3*n+2];
}
for(var k=0;k<two_secondmesh_v.length;k++){
if(sInRegion(two_secondmesh_v[k],need_change_xyz)){
two_secondmesh_v[k][2]=need_change_xyz[0].z;
}
}
var new_position=[];
fun(two_secondmesh_v);
function fun(arr){
for(var i=0;i<arr.length;i++){
if(Array.isArray(arr[i])){
fun(arr[i]);
}else{
new_position.push(arr[i]);
}
}
}
console.log(new_position);
for (var g=0;g<two_secondmesh_v.length;g++){
secondmesh_v[g*3]=new_position[g*3];
secondmesh_v[g*3+1]=new_position[g*3+1];
secondmesh_v[g*3+2]=new_position[g*3+2];
}
secondmesh.geometry.attributes.position.needsUpdate=true;
console.log(two_secondmesh_v);
firstmesh.geometry.computeBoundingBox();
//firstmesh.geometry.computeBoundingSphere();
)