本文主要是介绍【unity插件】切割unity3d物体插件——Ezy-Slice的使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 前言
- 功能:
- 插件地址
- 使用
- 源码
- 扩展
- 1. 单位网格切片
- 2. Unity3D 横截面着色器
- 3. Mesh网格切割
- 4. 网格拆分
- 5. 网格切割机
- 6. 在 Unity3D 中切割蒙皮网格角色
- 7. 网格切片运行时
- 完结
前言
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
扩展
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
6. 在 Unity3D 中切割蒙皮网格角色
https://github.com/JoeCooper/LimbHacker
7. 网格切片运行时
在运行时以动态方式对网格进行切片。与《合金装备崛起》中实现的内容非常相似。
代码被分成多个实现,每个实现都有越来越多的功能,但也更复杂,开销更高。这样,根据对象是否相当容易切割,就不需要更复杂的计算。
https://github.com/toninhoPinto/MeshSlicingRunTime
完结
如果你有其他更好的方法也欢迎评论分享出来,当然如果发现文章中出现了什么问题或者疑问的话,也欢迎评论私信告诉我哦
好了,我是向宇,https://xiangyu.blog.csdn.net/
一位在小公司默默奋斗的开发者,出于兴趣爱好,于是开始自习unity。最近创建了一个新栏目【你问我答】,主要是想收集一下大家的问题,有时候一个问题可能几句话说不清楚,我就会以发布文章的形式来回答。 虽然有些问题我可能也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
这篇关于【unity插件】切割unity3d物体插件——Ezy-Slice的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!