Unreal Engine 4 动态切割模型实现
图形图像技术CGGraph渲染图形学 7119 328
实名

通过了实名认证的内容创造者

发布于 2018-4-6 21:00:24

您需要 登录 才可以下载或查看,没有账号?注册

x
《合金装备:复仇》里面,有一个很有趣的设定,游戏里大部分的场景和物件都可以用主角的刀动态切割。 UE4中的ProceduralMeshComponent这个组件可以很容易的就实现这种功能,下面就给大家介绍下UE4中动态切割模型实现的方法。

准备模型

首先我们准备一个模型。

1.png

我做了一个简单的圆柱体,用来测试。注意需要切割的地方,为了保证细节,多放点顶点。
为了能够动态切割,我们要勾选这个模型的Allow CPUAccess选项。

2.png

新建蓝图

新建一个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分开一些,否则有可能因为相互的摩擦而影响表现。

评分

参与人数 2元素币 +50 活跃度 +10 展开 理由
狼之独步... + 20 + 10 【给力】阅贴无数,楼主最强!
元素界王神... + 30 切割什么效果!来个GIF

查看全部评分

还没有设置签名!您可以在此展示你的链接,或者个人主页!
使用道具 <
流云飞魄  发表于 2018-4-7 07:56:36  
2#
感谢大神赐教,此文将作为技术教科书留存!!!!!!
回复 收起回复
使用道具
qq_海蓝蓝_T48  发表于 2018-9-9 13:40:16  
3#
Unreal Engine 4 动态切割模型实现
回复 收起回复
使用道具
叼丝走天下  发表于 2018-9-20 19:19:09  
4#
很喜欢  什么软件做的啊?
回复 收起回复
使用道具
RXBH  发表于 2018-10-14 12:43:41  
5#
大神的思维都是很高 很高
回复 收起回复
使用道具
轻风  发表于 2018-10-14 13:31:33  
6#
666
回复 收起回复
使用道具
qq908955297  发表于 2018-10-14 17:27:35  
7#
元素那么大,我想来看看!
回复 收起回复
使用道具
mxd708  发表于 2018-10-14 18:47:50  
8#
thank you very much
回复 收起回复
使用道具
胖-哒  发表于 2018-10-14 19:34:42  
9#
感谢分享~~~~
回复 收起回复
使用道具
wolfram  发表于 2018-10-14 23:25:30  
11#

元素帖子强,满满正能量!
回复 收起回复
使用道具
qq_衔蝉_wcS  发表于 2018-10-15 00:05:00  
12#
我爱学习哦,因为学习可以赚钱
回复 收起回复
使用道具
hubayiooo  发表于 2018-10-15 00:05:27  
13#
回复 收起回复
使用道具
hubayiooo  发表于 2018-10-15 00:05:40  
14#
回复 收起回复
使用道具
sunnytree  发表于 2018-10-15 10:02:47  
15#
总有刁民想害朕,却不知朕日日元素,早已天下无敌
回复 收起回复
使用道具
qimoji  发表于 2018-10-15 10:05:29  
16#
流弊流弊
回复 收起回复
使用道具
qq_wangbingxv_i  发表于 2018-10-15 10:47:10  
17#
多谢分享。
回复 收起回复
使用道具
Howardxnh  发表于 2018-10-15 10:57:28  
18#
感谢楼主分享。。。。。。。。。
回复 收起回复
使用道具
不能好好起名  发表于 2018-10-15 11:48:47  
19#
很好
回复 收起回复
使用道具
SaulGoodman  发表于 2018-10-15 12:59:02  
20#
厉害
回复 收起回复
使用道具
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表