模型:
需要启用StaticMesh
中的AllowCPUAccess
属性。
新建ActorBP,添加Procedural Mesh Component,调用CopyProceduralMeshfromStaticMeshComopnent
方法来生成一个Procedural Mesh Component.
模型切割
ProceduralMeshComponent
有Slice Procedural Mesh
函数,这个函数可以将Procedural Mesh进行切割,并且生成另外的一半模型块。
参数介绍:
Plane Position
: 世界坐标系下该平面的中心位置Plane Normal
: 世界坐标系下该平面的发现Create Other Half
: 是否将切下来的那一块模型独立出来Cap Option
: 切面状态
No Cap
: 切面不缝合,模型中空Create New Section for Cap
: 切面缝合,使用自定义的材质Use Last Section for Cap
: 切面缝合,使用与模型一样的材质
Cap Material
: 如果Cap Option
是Create New Section for Cap
时自定义的材质
效果如下:
原理分析
在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. m1←vertice
5. else
6. m2←vertice
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. s1←v1,v2,v3
11. if (v1,v2,v3on the negative side of the plane )
12. s2←v1,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
简单来说,就是遍历所有的面和点,找到切割平面正向和负向的点,并且补好三角面即可。
运用以及注意事项
- 被切割的模型面数不宜太高,一方面是效率考虑,另一方面是切面的表现会有些奇怪。
- 被切割的模型的拓扑结构不宜太复杂,否则碰撞体的构建容易表现的很怪异。
- 实际运用的时候,可以考虑在切面处生成一个力场将两个section分开一些,否则有可能因为相互的摩擦而影响表现。