Three.js 剖切模型功能封装

1.获取到需要剖切模型的包围盒,并计算每个包围盒的顶点位置,代码如下:

var Box = new THREE.Box3().setFromObject(mesh);
console.log(Box);
var
point_max =new THREE.Vector3();
var
point_max_right =new THREE.Vector3();
var
point_max_behind =new THREE.Vector3();
var
point_max_under =new THREE.Vector3();
var
point_min =new THREE.Vector3();
var
point_min_front =new THREE.Vector3();
var
point_min_top =new THREE.Vector3();
var
point_min_left =new THREE.Vector3();
point_max.set(Box.max.x,Box.max.y,Box.max.z);
point_max_right.set(Box.min.x,Box.max.y,Box.max.z);
point_max_under.set(Box.max.x,Box.max.y,Box.min.z);
point_max_behind.set(Box.max.x,Box.min.y,Box.max.z);
point_min.set(Box.min.x,Box.min.y,Box.min.z);
point_min_front.set(Box.min.x,Box.max.y,Box.min.z);
point_min_top.set(Box.min.x,Box.min.y,Box.max.z);
point_min_left.set(Box.max.x,Box.min.y,Box.min.z);

 

2.剖切面可视化,这里以前切面为例,别的切面以此类推,这里的clipping_box_mesh为全局变量。(部分读者不太清楚clipping_box_mesh变量存储的信息,这里解释一下clipping_box_mesh就是一个存储可视化剖切面mesh的全局索引数组方便我后续去拿到其中一个mesh去做一些改动,我这里用数组做收集当然读者也可以用Map;而Get_normal函数返回的是我后续将得到的三角面的法线,传入值是三个顶点:v1,v2,v3, 按照右手定理,得到的面法线 )代码如下:

//前切面可视化
var planeFront=new THREE.Geometry();
planeFront.name='front';
planeFront.vertices.push(point_max,point_max_right,point_min_front,point_max_under);
var
planeFront_normal=Get_normal(point_max,point_min_front,,point_max_under);
var
planeFront_face1=new THREE.Face3(0,1,2, planeFront_normal);
var
planeFront_face2=new THREE.Face3(2,3,0, planeFront_normal);
planeFront.faces.push(planeFront_face1,planeFront_face2);
var
planeFront_material=new THREE.MeshBasicMaterial({
   
color:0x00BFFF,
   
side:THREE.DoubleSide,
   
opacity: 0.2,
   
transparent: true
});
var
planeFront_mesh= new THREE.Mesh(planeFront,planeFront_material);
clipping_box_mesh.push(planeFront_mesh);
scene.add(planeFront_mesh);

3.对应可视化切面的真实切面,以前切面为例,记得打开剖切的局部效果:

//对应前剖面
clipping_localPlane[0] = new THREE.Plane( new THREE.Vector3( 0, -1, 0 ),point_max.y );

renderer.localClippingEnabled = true; //剖切局部效果

4.绑定需要切面的mesh,以及对各个可视化切面的自身的剖切。代码如下:

mesh.traverse(function (child) {
   
if (child.isMesh)
    {
       child.
material.clippingPlanes=clipping_localPlane;
       
child.material.side=THREE.DoubleSide;
   
}
})
;
for
(var i=0;i<clipping_box_mesh.length;i++){
   
var array_clipping=new Array();
    for
(var j=0;j<clipping_box_mesh.length;j++) {
       
if (i != j) {
            array_clipping.
push(clipping_localPlane[j])
        }
    }
    clipping_box_mesh[i].
material.clippingPlanes=array_clipping;
}

6.效果展示

  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值