模型:

需要启用StaticMesh中的AllowCPUAccess属性。

UE4-Component-实时切割模型

新建ActorBP,添加Procedural Mesh Component,调用CopyProceduralMeshfromStaticMeshComopnent方法来生成一个Procedural Mesh Component. 

UE4-Component-实时切割模型

模型切割

ProceduralMeshComponentSlice Procedural Mesh函数,这个函数可以将Procedural Mesh进行切割,并且生成另外的一半模型块。

UE4-Component-实时切割模型

参数介绍:

  • Plane Position: 世界坐标系下该平面的中心位置
  • Plane Normal: 世界坐标系下该平面的发现
  • Create Other Half: 是否将切下来的那一块模型独立出来
  • Cap Option: 切面状态 
    • No Cap: 切面不缝合,模型中空
    • Create New Section for Cap: 切面缝合,使用自定义的材质
    • Use Last Section for Cap: 切面缝合,使用与模型一样的材质
  • Cap Material: 如果Cap OptionCreate New Section for Cap时自定义的材质

效果如下: 
UE4-Component-实时切割模型

原理分析

UKismetProceduralMeshLibrary::SliceProceduralMesh()函数中,可以看到它实现的方法如下:

SliceProceduralMesh(plane) 
1. create two maps of base vert index to vert index m1,m2 
2. for each vertice{v} 
3.     if (vertice on the positive side of the plane) 
4.         m1vertice 
5.     else  
6.         m2vertice 
7. create two sections s1,s2 
8. for each face{(v1,v2,v3)} 
9.     if (v1,v2,v3on the positive side of the plane )  
10.         s1v1,v2,v3 
11.     if (v1,v2,v3on the negative side of the plane )  
12.         s2v1,v2,v3 
13.     else 
14.         s1 positive vertices 
15.         s2 negative vertices 
16.         find clipped verticesvclip1,vclip2,vclip3,vclip4 
17.         triangulate the clipped polygon 
18. create cap geometry for s1,s2 
19. create collision convex shape for s1,s2

简单来说,就是遍历所有的面和点,找到切割平面正向和负向的点,并且补好三角面即可。

运用以及注意事项

  1. 被切割的模型面数不宜太高,一方面是效率考虑,另一方面是切面的表现会有些奇怪。
  2. 被切割的模型的拓扑结构不宜太复杂,否则碰撞体的构建容易表现的很怪异。
  3. 实际运用的时候,可以考虑在切面处生成一个力场将两个section分开一些,否则有可能因为相互的摩擦而影响表现。

相关文章:

  • 2022-01-10
  • 2021-04-20
  • 2021-10-22
  • 2021-06-29
  • 2021-05-27
  • 2022-12-23
  • 2021-08-14
猜你喜欢
  • 2021-07-16
  • 2021-05-21
  • 2021-12-24
  • 2021-12-14
  • 2021-12-26
  • 2021-08-16
  • 2022-01-06
相关资源
相似解决方案