unity中切割ShatterToolkit代码分析

ShatterToolkit是针对unity3d编写的一款粉碎模型的插件

再来分析插件的功能,我们可以将代码划分为三层:

1.操作层

菜单MouseForce:

通过这个脚本可以对模型进行拖拽,根据当前鼠标左键按下的位置和鼠标移动后的位置在单位增量时间内的差值计算力度,并将这个力通过AddForceAtPosition附加给带有刚体属性的对象。

菜单MouseSplit:
这个脚本用于对模型的切割,按下当前鼠标左键拖动鼠标然后抬起,记录开始位置和结束位置,一帧内在屏幕空间从开始点到结束点默认相等划分为10个点(数值越大敏感度越高性能越差),并向世界坐标发射10条射线,根据【射线方向】和【划线方向】叉乘得到【法线】,通过【法线】和【当前射线点】就能确定一个【平面】,最后将这个【平面信息】传给【ShatterTool类】进行切割处理。

菜单MouseShatter:

这个脚本用于击毁模型,直接点击模型就可以将模型粉碎,上层只是通过屏幕向世界发射一条射线并传给【ShatterTool类】进行粉碎模型。

 

2.中间层

脚本ShatterTool:

其中两个函数对外:

首先对于切割物体分为正面和反面两部分也就是fasthull和legacyhull,对象也分为切割之前的信息参数和切割之后的信息参数。SendPostSplitMessage和SendPreSplitMessage,计算局部物体的中心点处也就是网格边界的局部中心点。如果内部的点在FAST则化为FASThull,如果内部的点在LEGACY则化为LEGACYhull,接下来就是粉碎方面的,使用随机生成的平面通过点分割hull,然后成成一些新的gameobject,然后把一些mesh rigidbody,uv,法线等一些属性,在生成新的对象之后原始的对象会被毁灭。

Split(Plane[]planes)函数将获取的【面板信息】变换到【对象空间】然后通过Hull类进行切割,最后生成两个新切割后的对象。

Shatter(Vector3point)函数通过获取的【击打点】并随机生成【法线方向】创建不同的【面板信息】,然后再调用Split生成多个切割碎片,达到粉碎模型的效果。

脚本UvMapper:

 WorldUvMapper代码:首先确定UV坐标,然后计算纹理方向向量用坐标的方向向量与平面的法线及逆行叉乘,然后进行设置AB的切线,然后是UVS的设置,进行UV缩放的设置。

TargetUvMapper代码:在UV坐标中进行纹理坐标中确定目标区域的开始和区域的大小。然后计算纹理方向向量,以下步骤和WorldUvMapper代码一样。

它的基类有WorldUvMapper和TargetUvMapper都是设置切割面的纹理信息,WorldUvMapper设置切割面的uv缩放,TargetUvMapper比较灵活,可以设置uv起点和大小等。

 

3.底层

脚本Hull等:

之所以称Hull为底层,是因为它通过【面板panel信息】将模型进行拆分然后重组顶点,里面封装了一系列比较复杂的算法。

Edge代码主要是进行两点确定一个边,为下面的三角面片构成做基础。

Point代码:主要是确定上面边的点。

EdgeHit代码:主要是切割的边被分类到两个区域A和B.

Triangle代码:由顶点点和边确定三角面片。

首先是IHull代码:主要是进行mesh中的局部的面,法线等的参数设置。

 HullType代码:主要是把hull分为FastHull,和LegacyHull两种hull.

其中比较重要的是下面的这两个代码:FastHull和LegacyHull

FastHull代码:这个是新算法主要是对切割面的重构。

首先为mesh设置normals tangents triangles uv的各种参数,然后在不为空的前提下转为数组。切割过程中会产生两个面如果顶点在A面的话就归A如果定点在B面的话就归B,对于三角面的分配,如果这个三角面的三个顶点都在A中则这个三角面归A ,如果这个三角面都在B中则这个三角面归B,如果这个三角面被切割到了则重新在被切的边上添加一些点,重新构成三角面片。

LegacyHull代码:和上面的代码功能差不多,都死对于切割卖你上的三角面片的重构与分配。

 

ShatterScheduler代码:破碎调度程序 

OutlineCreator代码:轮廓创建

Tools代码:此代码主要是把零尺寸的三角形给剔除掉。

ShatterToolEditor代码:generationLimitTooltip代数限制,切割片数限制,cutsTooltip这个值限制了游戏对象使用Stter()被击碎的次数。fillCutTooltip获取或设置剪切区域是否应该三角化。preSplitMsgTooltip获取或设置预裂(平面[]平面)消息是否应在分割发生之前发送到原始游戏对象。所提供的对象将是用来分割游戏对象的平面数组。 postSplitMsgTooltip获取或设置PostSplit对象消息是否应在发生分裂后发送到原始游戏对象。该消息将在销毁原始游戏对象之前发送。所提供的对象将是在分割期间创建的所有新游戏对象的数组。 internalHullTypeTooltip获取或设置用于粉碎网格的内部壳的类型。Fasthull实现比LeaCyhull实现大约快20%-50%,并且不需要启动时间。在极端情况下,LeGACYhull实现更健壮,并且提供向后兼容性。在运行时,此设置不能更改。 

ITriangulator代码:要实现三角剖分的轮廓应该在实现类的构造函数中指定,并且应该包括:空间中的点列表。1点占用1个数组元素。一个边的列表,每个边引用2个点的整数索引。1边占用2个后续数组元素。三角形占据3个数组元素,每个元素对应于一个点索引。三角形具有顺时针卷绕顺序。例如,新三角形〔11×3+2〕等于第十二三角形的第三点。新三角形的对应边。三角形占用3个数组元素,每个元素对应于一个边缘索引。用索引引用边缘,而不是引用数组中的位置。例如,[新三角边(5×3+1)* 2+0 ]等于第六三角形第二边的第1点。 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值