插件地址
github地址:
https://github.com/Mustenaka/OpenFracture
百度网盘地址(上传日期:2023/12/18)
有小伙伴反映打不开github,所以我又加了个网盘地址,但是后来的小伙伴最好是去github下载,因为可能作者会更新:
链接:https://pan.baidu.com/s/1-7dc9D0CHtvfLHBUXBS4Dg?pwd=7gsf
提取码:7gsf
使用注意事项
1.如果要导入自定义网格,则必须在导入设置中将“启用读/写”设置为 true。否则,您将收到错误。
2.网格必须是非相交和封闭的。否则,重新三角测量将失败。
上面描绘的是凳子的线框模型。注意横杆如何与凳子腿相交。相交几何图形将导致三角测量算法(填充新切割的面)失败,并导致如下所示的伪影。我实现的三角测量算法不处理自相交多边形。检测自相交几何是一个不平凡的问题,作者并不打算添加。
3.优化性能
压裂过程是一个计算密集型过程。简单的模型(几百个顶点)可以毫不费力地分成几十个部分。在运行时对包含数千个顶点的复杂模型进行压裂的性能在较旧的、功能较差的计算机上可能会非常慢。
以下是优化性能的一些提示
1.减少片段数量
2.禁用或减少折射间隔次数
3.编辑器中的预断裂模型,而不是运行时的破裂
4.将您的模型引入 Blender 等 3D 建模程序,并使用抽取工具简化网格几何体
Fracture
断裂,在运行时将网格分解成多个部分
1.先决条件
对象应添加以下组件。前三个是脚本的必需组件(即它们是自动添加的),而碰撞体不是必需的组件,因为您可以使用任何类型的碰撞体。
- MeshFilter
- MeshRenderer
- RigidBody
- Collider(任何类型)
2.给想要破坏的物体添加Fracture脚本
3.参数说明
Trigger Options(触发选项)
- Trigger Type(触发类型)
- Collision(碰撞):基于物理碰撞的触发
- Minimum Collision Force(最小碰撞力触发断裂所需的最小碰撞力):如果碰撞力等于或大于此值,则将触发断裂。要忽略此设置,请将最小力设置为 0。
- Limit collisions to selected tags(将冲突限制为选定标签):通过启用此选项,您可以限制哪些对象标签将触发冲突。检测到冲突时,碰撞对象的标记将与包含的标记列表进行比较。如果它包含在该列表中(并且满足其他冲突条件),则将触发断开。
- Included Tags(包含的标签):可以触发断开的游戏对象标签集。
- Trigger(触发器):基于触发器的触发
- Filter Collisions By Tag(按标签过滤碰撞):如果为true,则只使用带有“Allowed tags”标签的对象列表将触发冲突。
- Trigger Allowed Tags(触发允许的标签):如果“Filter Collisions By Tag”设置为true,只有带有此列表中标记的对象将触发骨折。
- Keyboard(键盘):用户按下某个键触发
- Trigger Key(触发键):按下时触发断裂的键。
Fracture Options 断裂选项
- Fragment Count(片段计数): 要将对象分解为的片段数。注意:如果“检测浮动片段”设置为 true,则最终的片段数可能高于“片段计数”。这是因为浮动碎片检测是在压裂阶段完成后进行的。
- Asynchronous(异步): 如果启用,网格将通过使用协程异步断开。骨折步骤分布在许多框架上,而不是一个框架上,以防止卡顿。如果碎片计数很大,则触发裂缝和实际发生压裂之间的延迟可能很大。如果性能是一个问题,建议在编辑器而不是运行时中断开网格。
- Detect Floating Fragments (检测浮动片段): 如果启用,将在执行断裂算法后对生成的片段进行传递,以确定是否有任何片段包含未连接的几何图形。在压裂非凸网格时,可能会发生这种情况。由于必须搜索每个片段的几何形状以识别这些不相连的顶点/面集,因此此选项将显着降低压裂的性能。同样,如果性能问题,建议您使用该脚本
- Fracture Along X/Y/Z Plane(沿 X/Y/Z 平面的断裂): 每条断裂线都可以由一个向量指定。对于某些对象,最好将此向量锁定到特定平面。例如,假设您有一个玻璃窗格模型,其宽度沿 X 轴,高度沿 Y 轴,厚度沿 Z 轴。断裂线应约束在玻璃的表面(X-Y 平面),而不是沿其厚度分割玻璃。在这种情况下,您可以将“沿 X 平面的断裂”和“沿 Y 平面的断裂”设置为 true,将“沿 Z 平面的断裂”设置为 false。
- Inside Material(内部材料):用于新断裂面的材料
- Texture Scale(纹理比例): 应用于断裂面的 UV 坐标的比例因子
- Texture Offset(纹理偏移:) 应用于断裂面的 UV 坐标的常量偏移。
Refracture Options重裂选项
- Enabled(已启用): 设置为 true 以启用片段折射。
- Invoke Callbacks(调用回调):如果启用,折射片段也会触发回调。如果只想在对象首次断开时触发操作,而不要在片段重新断开时触发操作(在这种情况下,应将此选项设置为 false),则此选项非常有用。
- Max # of Refractures(最大 # 个重新断开): 一个片段可以重新断开的最大次数。警告:折射会导致碎片呈指数增长。如果启用折射,建议保持较低的片段计数。
callvack options 回调选项
- OnComplete():当破裂完成时,将触发此回调。使用它来播放声音、打开灯或您需要的任何其他游戏内逻辑。
Prefracture
预断裂,用于编辑器中的预断裂网格。生成的片段可以直接保存在场景中,也可以保存到磁盘(如果要创建预制件)。
该脚本允许在编辑器中断开网格。预断开网格时,片段将添加到场景中,并将原始对象设置为非活动状态。每个碎片都有一个被冻结的刚体。片段可以根据几种触发条件(如下所列)解冻。当满足触发条件时,片段解冻。或者,如果满足单个片段的触发条件,则可以解冻所有片段。这允许预断裂的网格一次分解一块或一次全部破碎
1.先决条件
跟Fracture 一样
2.给想要破坏的物体添加Prefracture脚本
3.参数说明
其他参数跟前面的Fracture 一样
Prefracture Options预断裂选项
- Unfreeze All(全部解冻):如果触发了一个片段,请解冻所有片段。
- Save Fragments to Disk(将片段保存到磁盘):将片段网格保存到磁盘。如果预制件中将使用预断开网格,则为必需。如果预断开网格不会用作预制件并将嵌入到场景中,则可选。
- Save Location(保存位置):将片段保存到相对于项目根目录的位置。
- Prefracture Mesh(预断裂):此按钮将断开网格并生成碎片。生成片段后,包含基础网格体的对象将设置为非活动状态,但仍保留在场景中。
Slice
切片,网格的运行时切片
该脚本允许在运行时将网格切成两部分。如果需要,片段可以重新切片为较小的片段
1.先决条件
跟Fracture 一样
2.给想要破坏的物体添加Slice脚本
3.参数说明
Slice Options切片选项
- Enable Reslicing(启用重新切片):设置为 true 以启用片段重新切片。
- Max Reslice Count(最大重新切片计数):片段可以重新切片的最大次数。
- Detect Floating Fragments(检测浮动片段):如果启用,将在切片算法执行后对生成的片段进行传递,以确定是否有任何片段包含未连接的几何图形。切片非凸网格时可能会发生这种情况。由于必须搜索每个片段的几何形状以识别这些断开连接的顶点/面集,因此此选项将显着降低切片的性能。
- Inside MaterialI(内部材质):用于新切片面的材质。
- Texture Scale(纹理比例):应用于切片面的 UV 坐标的比例因子。
- Texture Offset(纹理偏移):应用于切片面的 UV 坐标的常量偏移。
- Invoke Callbacks(调用回调):如果启用,切片片段也会触发回调函数。如果只想在第一次切片对象时触发操作,而不要在重新切片片段时触发操作(在这种情况下,将此选项设置为 false),则此选项非常有用。
Callback Options回调选项
- OnCompleted():当切片完成时触发此回调。使用它来播放声音、打开灯或您需要的任何其他游戏内逻辑。
4.刀片脚本
与 Fracture和Prefracture不同,Slice需要编写脚本,因为您必须在运行时传入切片平面的法线和原点。
如果是要切片的对象,请执行以下代码将切片为两个片段。 sliceNormal和 sliceOrigin分别是切片平面在世界坐标中的法线和原点。
public GameObject obj;//切割物体 var slicer = obj.GetComponent<Slice>(); var sliceNormal = Vector3.up; var sliceOrigin = obj.transform.position; slicer.ComputeSlice(sliceNormal, sliceOrigin);