前言
GitHub 上的工程多如繁星,有些好的仓库,但凡不经意间错过了就很难找回,故稍作收集,希望能帮助到有用的人
今天推荐的仓库叫 EzySlice。 - 便捷3d物体剖切工具
功能:
Ability to slice any convex Mesh using a Plane
- 支持使用一个面片对任意的 Convex Mesh 进行剖切。
UV/Normal/Tangent Space Interpolation for seamless cuts - UV / Normal / Tangent Space插值,用于无缝切割
Flexible and Documented API - 灵活且文档化的API
No external plugin dependencies, fully written in C# - 无需外部拆件支持,全部使用 C# 实现
Updated for Unity3D 2018 - 支持到 Unity 2018
MIT Open Source License
-使用 MIT 开源协议
插件地址
https://github.com/DavidArayan/ezy-slice
使用
最终效果
代码实现
using EzySlice; public class splitter : MonoBehaviour { public Material cross;//材质 void Update() { //检测鼠标横向移动,带动切割平面旋转 float mx = Input.GetAxis("Mouse X"); transform.Rotate(0, 0, -mx * 2); if (Input.GetMouseButtonDown(0)) { //立方体射线检测,把他的高度设置为平面高度的一半(非常薄),也就相当于一个面射线检测 Collider[] colliders = Physics.OverlapBox(transform.position,//检测碰撞的区域的中心点 new Vector3(4, 0.005f, 4),//检测碰撞的区域的大小 transform.rotation,//朝向 ~LayerMask.GetMask("Solied"));//~表示取反,定义不会被切割的层,比如地面和切割面 //将每一个检测到的物体进行切割 foreach (Collider c in colliders) { Destroy(c.gameObject);//每次切割是产生两个新物体,所以要先销毁之前的物体 //GameObject[] objs=c.gameObject.SliceInstantiate(transform.position, transform.up);//切割出的面材质会丢失 //切割并返回表皮 SlicedHull hull = c.gameObject.Slice(transform.position, transform.up); print(hull); if (hull != null) { GameObject lower = hull.CreateLowerHull(c.gameObject, cross);//定义切割下半部分的材质 GameObject upper = hull.CreateUpperHull(c.gameObject, cross);//定义切割上半部分的材质 GameObject[] objs = new GameObject[] { lower, upper }; foreach (GameObject o in objs) { Rigidbody rb = o.AddComponent<Rigidbody>();//添加刚体 //因为切割之后是不规则物体,所以要选择 MeshCollider(网格碰撞) //如果一个MeshCollider是刚体,要想正常碰撞,一定要将convex设true //Unity的规定:这样会形成一个凸多面体,只有凸多面体才能是刚体 o.AddComponent<MeshCollider>().convex = true; //在切割的地方添加一个爆炸力 参数解释:力大小 位置 爆炸半径 rb.AddExplosionForce(100, o.gameObject.transform, 20); } } } } }
切割单物体
using UnityEngine; using EzySlice; public class SliceTest : MonoBehaviour { public GameObject sourceGo;//切割的物体 public GameObject slicerGo;//切片物体 public Material sectionMat;//切面材质 private void Update() { if (Input.GetKeyDown(KeyCode.A)) { SlicedHull hull = sourceGo.Slice(slicerGo.transform.position, slicerGo.transform.up); GameObject upper = hull.CreateUpperHull(sourceGo, sectionMat); GameObject lower = hull.CreateLowerHull(sourceGo, sectionMat); sourceGo.SetActive(false); } } }
源码
链接:https://pan.baidu.com/s/1sazoSRHaa3EMzwz6ijQUYQ
提取码:qryi
扩展推荐其他3D切割插件
感兴趣可以自行看文档或下载源码研究
1. 单位网格切片
Unity 的视图对齐网格切片
https://github.com/mattatz/unity-mesh-slicing
2. Unity3D 横截面着色器
简单的横截面着色器可用于剪切部分网格
https://github.com/Dandarawy/Unity3DCrossSectionShader
3. Mesh网格切割
https://github.com/carefreeq/SplitMesh
4. 网格拆分
这是我在“程序网格拆分”硕士论文中的源代码和演示的简化版本。 这篇论文是在2012年写的,是使用unity开发的,但该理论可以应用于任何引擎。
要切片,请按住空格键,然后按下鼠标左键,拖动切片线,然后松开按钮。
https://github.com/DanniSchou/MeshSplitting
5. 网格切割机
https://github.com/hugoscurti/mesh-cutter
使用介绍:https://community.uwa4d.com/blog/detail?id=1549328790572228609&entrance=0
6. 在 Unity3D 中切割蒙皮网格角色
https://github.com/JoeCooper/LimbHacker
7. 网格切片运行时
在运行时以动态方式对网格进行切片。与《合金装备崛起》中实现的内容非常相似。
代码被分成多个实现,每个实现都有越来越多的功能,但也更复杂,开销更高。这样,根据对象是否相当容易切割,就不需要更复杂的计算。
https://github.com/toninhoPinto/MeshSlicingRunTime