zoukankan      html  css  js  c++  java
  • Unreal Engine 4 动态切割模型实现

    转自:http://gad.qq.com/article/detail/33199

    《合金装备:复仇》里面,有一个很有趣的设定,游戏里大部分的场景和物件都可以用主角的刀动态切割。 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实现模型实时切割

    转自:http://www.52vr.com/article-875-1.html

    这篇文章介绍了如何使用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分开一些,否则有可能因为相互的摩擦而影响表现。
  • 相关阅读:
    #转 并查集详解
    美素数
    Wireless Network
    寒假CF- WA了不要怕!
    寒假CF1 小呀小苹果儿
    (专题赛)A Bug's Life
    (周三赛)The Hardest Problem Ever
    (周三赛)A==B?
    (周三赛)还是畅通工程
    cursor改变鼠标样式
  • 原文地址:https://www.cnblogs.com/sevenyuan/p/7808820.html
Copyright © 2011-2022 走看看