这篇博客介绍了如何使用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()
函数中,可以看到它实现的方法如下:
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←vertic