Three.js Mesh模型拍平功能封装

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值