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分開一些,否則有可能因為相互的摩擦而影響表現。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM