您需要 登录 才可以下载或查看,没有账号?注册
x
《合金装备:复仇》里面,有一个很有趣的设定,游戏里大部分的场景和物件都可以用主角的刀动态切割。 UE4中的ProceduralMeshComponent这个组件可以很容易的就实现这种功能,下面就给大家介绍下UE4中动态切割模型实现的方法。
准备模型
首先我们准备一个模型。
我做了一个简单的圆柱体,用来测试。注意需要切割的地方,为了保证细节,多放点顶点。
为了能够动态切割,我们要勾选这个模型的Allow CPUAccess选项。
新建蓝图
新建一个Actor蓝图,为它添加两个组件,一个是StaticMeshComponent,一个是ProceduralMeshComponent,在Construct Script中,将StaticMesh的模型数据拷贝到ProceduralMesh中去。
调整ProceduralMesh参数
出于优化的目的,ProceduralMeshComponent默认勾选了UseComplexAs SimpleCollision这个属性,为了实现我们切割下来的能正常的进行物理模拟,需要把这个属性给取消勾选。
实现切割
SliceProceduralMesh实现模型的切割。说下几个参数:
* PlanePosition是切割平面的位置
* PlaneNormal 是切割平面的法线,也就是朝向
* Create Other Half 切割下来的部分,是否创建新的ProceduralMesh
* Cap Option No Cap,切面不缝合,Create New Section For Cap; 缝合,使用自定义的材质来贴补缝合的面; Use Last Section for Cap,使用模型的材质来贴补缝合的面。
使用ProceduralMeshComponent实现模型实时切割
这篇文章介绍了如何使用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)
create two maps of base vert index to vert index m1,m2
for each vertice∈{v}
if (vertice on the positive side of the plane)
m1←vertice
else
m2←vertice
create two sections s1,s2
for each face∈{(v1,v2,v3)}
if (v1,v2,v3on the positive side of the plane )
s1←v1,v2,v3
if (v1,v2,v3on the negative side of the plane )
s2←v1,v2,v3
else
s1← positive vertices
s2← negative vertices
find clipped verticesvclip1,vclip2,vclip3,vclip4
triangulate the clipped polygon
create cap geometry for s1,s2
create collision convex shape for s1,s2
复制代码
简单来说,就是遍历所有的面和点,找到切割平面正向和负向的点,并且补好三角面即可。
运用以及注意事项
被切割的模型面数不宜太高,一方面是效率考虑,另一方面是切面的表现会有些奇怪。
被切割的模型的拓扑结构不宜太复杂,否则碰撞体的构建容易表现的很怪异。
实际运用的时候,可以考虑在切面处生成一个力场将两个section分开一些,否则有可能因为相互的摩擦而影响表现。
|