使用ProceduralMeshComponent实现模型实时切割
来源:
52vr |
责任编辑:传说的落叶 |
发布时间: 2019-06-13 08:19 | 浏览量:
这篇文章介绍了如何使用UE4.13的ProceduralMeshComponent来实现针对一个模型的实时切割。
背景说明
在游戏潜龙谍影崛起:复仇 中,主角可以针对场景中的大部分物体进行实时切割。在游戏中,玩家需要指定一个切割平面,在主角挥刀后,对应的物体便可以根据这个平面进行切割。
在UE4中可以使用Apex Destruction来实现物体的破碎效果,但由于该破碎效果是离线生成的,换句话说一个DM只能够有一种破碎效果,因此无法达成实时切割的效果。
在UE4.13中,Epic加入了ProceduralMeshComopnent插件,使用这个插件可以进行针对于模型的实时切割操作。
前置准备工作
首先准备好需要进行切割的模型,我这里使用的是UE4示例中的人头模型。值得一提的是,由于要达成实时切割的目的,因此需要启用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()函数中,可以看到它实现的方法如下:
[代码]:
01 |
SliceProceduralMesh(plane) |
02 |
1. create two maps of base vert index to vert index m1,m2 |
03 |
2. for each vertice∈{v} |
04 |
3. if (vertice on the positive side of the plane) |
05 |
4. m1←vertice |
06 |
5. else |
07 |
6. m2←vertice |
08 |
7. create two sections s1,s2 |
09 |
8. for each face∈{(v1,v2,v3)} |
10 |
9. if (v1,v2,v3on the positive side of the plane ) |
11 |
10. s1←v1,v2,v3 |
12 |
11. if (v1,v2,v3on the negative side of the plane ) |
13 |
12. s2←v1,v2,v3 |
14 |
13. else |
15 |
14. s1← positive vertices |
16 |
15. s2← negative vertices |
17 |
16. find clipped verticesvclip1,vclip2,vclip3,vclip4 |
18 |
17. triangulate the clipped polygon |
19 |
18. create cap geometry for s1,s2 |
20 |
19. create collision convex shape for s1,s2 |
简单来说,就是遍历所有的面和点,找到切割平面正向和负向的点,并且补好三角面即可。
运用以及注意事项
被切割的模型面数不宜太高,一方面是效率考虑,另一方面是切面的表现会有些奇怪。
被切割的模型的拓扑结构不宜太复杂,否则碰撞体的构建容易表现的很怪异。
实际运用的时候,可以考虑在切面处生成一个力场将两个section分开一些,否则有可能因为相互的摩擦而影响表现。
相关文章
网友评论
全部评论:0条
推荐
热门