最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

UE5程序化內(nèi)容生成框架(PCG)

2023-08-30 15:57 作者:__Mr__wang__  | 我要投稿

程序化內(nèi)容生成框架(PCG)是一個用于在虛幻引擎中創(chuàng)建你自己的程序化內(nèi)容及工具的工具集。借助PCG,技術美術師、設計師和程序員能夠構(gòu)建任意復雜度的快速迭代式工具和內(nèi)容,從資產(chǎn)工具(如建筑物或群系生成等)到整個世界,不一而足。

Point?是 PCG 中非常重要的概念。例如,要生成一片森林,我們首先需要確定的是生成對象的位置點,也就是“散布點”的操作,然后,只需要將 StaticMesh 放置在這些點所在的位置就行了。

Point 上可以攜帶各種各樣的?Attribute,譬如大小,方向,位置,等等。在將 StaticMesh 放置到這些點的時候,可以利用這些 Attribute 來確定實際對象的大小,方向,位置,等等。
Attribute 可以跟隨 Point 從上一個步驟流向下一個步驟,然后下一個步驟的節(jié)點再利用 Point 所攜帶的信息來處理自己的邏輯,因此,Attribute 是 PCGGraph 中信息傳遞的重要載體。

PCG 中注重 Point 的概念,暫時沒有發(fā)現(xiàn)與 Houdini 中 Vertex,Edge,Primitive 對應的概念,雖然有名為 UPCGPrimitiveData 的類型,但看起來概念上似乎與 Houdini 中的 Primitive 有所區(qū)別。由于還沒有系統(tǒng)地閱讀 PCG 相關的代碼,且 PCG 尚處于測試開發(fā)的階段,如果有誤或功能完善會回來更正。

?

要啟用 PCG,需要確保引擎更新到?UE5.2?版本,并啟用如下插件。

??

PCG GraphNode

此處介紹 PCG GraphNode。本節(jié)會盡量介紹 PCG Graph 中每個節(jié)點的使用方法。如需快速查閱可使用 Ctrl+F 搜索對應 “ * + 節(jié)點名稱”關鍵字。

e.g.
查詢 MeshSampler 可使用關鍵字 *MeshSampler。

[ Sampler ]

Sampler 分類下的節(jié)點提供采樣并生成 Points 的功能。

*MeshSampler

MeshSampler 提供在 StaticMesh 上采樣模型表面 Points 的功能,通常這個節(jié)點需要配合 CopyPoints 節(jié)點來使用,以使采樣到的 Points 符合被采樣物體的全局空間變換。

PointSampler 提供從一組給定的 Points 中隨機篩選 Points 的功能,可以設定隨機篩選的比例,圖中是按照 10% 比例篩選上個示例的 Points 的效果。

SplineSampler 提供從給定的 PolyLineData 采樣樣條線上的 Points 的功能。

SplineSampler 可以選擇多種生成方式,如果選擇的是 Interior 方式生成,還可以通過曲線來控制優(yōu)邊緣到中心的 Density 變化。

SurfaceSampler 提供從給定的 SurfaceData 采樣表面 Points 的功能。有效的數(shù)據(jù)是這種綠色的 SurfaceData,但也可接受 SpatialData,例如 GetActorData 節(jié)點提供的數(shù)據(jù),但只會簡單地采樣 BoundBox 表面。

*VolumeSampler

VolumeSampler 提供從給定的 SpatialData 采樣體積 Points 的功能。

*CopyPoints

CopyPoints 將源輸入的點云復制到目標點云中每個點的位置。在復制的過程中會應用目標點云中點的變換,也可選擇繼承 Source 或 Target 其中之一的屬性。與 Houdini 中的 CopytoPoints 不同,CopyPoints 只能接受 PointData,在使用上會帶來一定的限制。

?

*CreatePoints

CreatePoints 用于手動創(chuàng)建 Points。示例圖片中使用 CreatePoints 創(chuàng)建了三個 Point。

CreatePointsGird 創(chuàng)建一個 Points 網(wǎng)格陣列。

MeshSocketsToPoints 將 Mesh 上的插槽轉(zhuǎn)換為 Points。

PointFromPlayerPawn 將 PlayerPawn 轉(zhuǎn)換為一個 Point。

StaticMeshSpawner 利用給定的 Points 信息(位置,縮放,旋轉(zhuǎn))生成 StaticMesh。

SpawnActor 利用給定的 Points 信息(位置,縮放,旋轉(zhuǎn))生成 Actor。示例圖片中白色元素為一個包含三角錐的藍圖。

[ Density ]

Density 是一個常用的 Attribute,它常被用來甄別 Points 是否應該存在。例如,通過比較 Density 是否大于或小于某一個值,來刪除或保留 Points。

DensityNoise 用于隨機化 Point 上的 Density 值。

DensityRemap 用于將 Density 的值從一個區(qū)間映射到另一個區(qū)間。

相比于 DensityRemap,CurveRemapDensity 提供更自由的映射形式,可以通過曲線來控制 Density 值的映射。

DistanceToDensity 計算一個指定坐標點到每個 Point 的距離,并直接將計算的值賦值給 Density 屬性。

在測試的過程中發(fā)現(xiàn) DistanceToNeighbors 的行為比較奇怪,查看實現(xiàn)邏輯和關鍵代碼,發(fā)現(xiàn)只有一個臨時的替代方案。DistanceToNeighbors 的意圖是將 TargetPoints(input0)投影到 OpitionalSamplePoints(intput1)所代表的空間平面上,然后計算投影點與 OpitionalSamplePoints 間的距離。



*DensityFilter

DensityFilter 篩選并輸出 Density 值為特定區(qū)間的 Points。示例圖片中紅色部分為被篩選的 Points,白色部分為未被篩選的 Points。注意未被篩選的 Points 不會輸出。

FilterByTag 用于二次篩選。假設有這樣一種情況,我們的某個對象都誕生自同一個藍圖類型,但具備不同的 Tag 來區(qū)分彼此,我希望獲取 World 中所有的藍圖對象,然后在 PCGGraph 中分門別類對它們進行不同的處理。這時我需要獲取所有的對象,然后進行二次篩選。

圖片示例中的三個對象屬于同一種藍圖,但右側(cè)一個具有“TagA”標簽,于是可以使用 FilterByTag 過濾“TagA”將它篩選出來。

IntersectWithTaggedActorsGeometry 計算給定 Points 中的 Point 是否在一 TaggedActors 內(nèi)部或外部。

PointFilter 根據(jù)輸入的 Filter 屬性值從給定的 Points 中篩選符合要求的 Points。

SelfPruning 剔除范圍重合的點。

?


*BoundsModifier

BoundsModifier 用于修改 Point 上的 Bounds 屬性。

Bounds 是 PointData 的固有屬性,用于確定 Point 在空間中所占的體積。一些節(jié)點會以 Bounds 為依據(jù)來執(zhí)行邏輯,譬如 SelfPruning。

CreateSpline 將給定的 PointData 轉(zhuǎn)換為 PolyLineData。

Difference 計算 Source 輸入與 Differences 輸入的差集。目前尚只有 Binary 一種 DensityFunction 可以正常使用。

Difference 在進行計算時會參考 Differences 輸入的 Stepness 屬性來決定計算范圍。

Distance 計算從 Source 輸入的 Points 到 Target 輸入 Points 的最小距離和方向。

ExtentsModifier 與 BoundsModifier 都可以修改 Points 上的 Bounds 屬性,它們之間有概念上的區(qū)別。從它們的執(zhí)行模式上也能看出一定的區(qū)別。

Extents 是一個三維向量。表示空間數(shù)據(jù)的尺寸,也就是寬度、高度和深度。Extents 的中心坐標永遠處于 Extents 所表示范圍的中心,因此定義 Extents 只需要一個三維向量即可。
Bounds 是一個軸對齊的包圍盒。表示空間數(shù)據(jù)的位置和大小。Bounds 的中心坐標可以不在 Bounds 所表示范圍的中心,因此定義 Bounds 需要兩個三維向量。

Extents 和 Bounds 之間有一定的關系,但不一定相等。比如,如果空間數(shù)據(jù)的原點是(0, 0, 0),那么它的Bounds 就等于它的 Extents(在 PCGPointData 概念中)。但是,如果空間數(shù)據(jù)的原點不是(0, 0, 0),那么它的 Bounds 就要根據(jù)原點的偏移來計算。

三個節(jié)點功能相似,都用于合并或分離數(shù)據(jù)。

Merge 與 Union 功能相似,用于合并 MultipleData,Merge 只能合并 PointData 類型的數(shù)據(jù),而 Union 沒有限制。

Gather 節(jié)點用于分離 MultipleData,但還沒有開發(fā)完全。

GetData 是一個系列。GetActorData 是父對象,其他幾個都繼承自 GetActorData 是子對象,它們與父對象的區(qū)別在于將父對象提供的數(shù)據(jù)過濾為了某個特定的類別。

以 GetLandscapeData 為例,它判斷 InDataType 是否包含 EPCGDataType::PolyLine 這個枚舉值,以決定是否輸出到 FPCGDataCollection。

因此,你會發(fā)現(xiàn)有時下面的用法也是可以正確執(zhí)行的。

目前 EPCGDataType 有以下一些類別。

GetTextureData 是較為特殊的 GetData,它采樣一個 Texture,作用范圍是當前 PCGVolume,值為 0 的部分不會產(chǎn)生 Points。

GetTextureData 會將 Texture 的通道值輸出到 Density,就像下面這樣。

Intersection 計算輸入數(shù)據(jù)之間的交集。

NormalToDensity 將 Points 朝向轉(zhuǎn)換為 Density 參數(shù),用于識別 NormalToDensity 所處的坡度。

Projection 用于將 Source Points 投影到 Target 表面之上。Target 輸入需要 SurfaceData 類型的數(shù)據(jù),因此經(jīng)常需要與 WorldRayHitQuery 節(jié)點聯(lián)用。

WorldRayHitQuery 用于場景的射線追蹤,可以精確捕獲場景中的 SurfaceData 數(shù)據(jù)。

WorldVolumetricQuery 用于場景的體積查詢,可以精確捕獲場景中的 VolumeData 數(shù)據(jù)。此處捕獲了一個外部 StaticMesh 的體積數(shù)據(jù)。

ToPoint 將一個 SpatialData 數(shù)據(jù)轉(zhuǎn)換為特定的 PointData 類型數(shù)據(jù)。

TransformPoints 可以改變 Points 上的 Transform 的相關屬性。它還可以用來隨機化 Transform 屬性。

[ Metadata ]

關于 Metadata

Metadata 節(jié)點大多與 Attributes 有關,Attributes 是每個 Data 元素上具有的數(shù)據(jù),在 AttributesList 中代表一整行。

0號元素上的 Attributes

在 PCGGraph 中,GraphData 攜帶的原生數(shù)據(jù)被稱為 Property,例如 PointData 上的 Position 和 Rotation。由用戶或節(jié)點在后期附加的數(shù)據(jù)被稱為 Attribute。Property 與 Attribute 的不同是在調(diào)用時,需要在名稱前加上“$”符號。

在 PCGGraph 中,會看到很多不同類別的數(shù)據(jù)端口,從圖標的樣式上可以將它們歸納為三種類別。

第一類是下面這種只有一個圈和縱向排列多個圈的形式,表明這個端口表示單對象概念還是多對象概念。

在 PCGGraph 中,所謂“PCGData”,通常表示的是一個數(shù)據(jù)的合集。
例如“PCGPointData”表示的不是“一個點”,而是“一個對象上的所有點”。

PCGData 在節(jié)點間通常以 PCGData 數(shù)組的形式輸出傳遞,如果是多對象的類型輸入,則標志這個輸入有能力處理 PCGData 數(shù)組,而不是僅處理 PCGData 數(shù)組中的第一個元素。

第二類是下面這種無縱深和有縱深的形式,表明這個端口可否接受多個輸入。這方面目前做得還不夠完善,理論上,我們應該可以通過 Gather 節(jié)點來自由地選擇多輸出中的單個輸出。

還有一種白色的端口,在概念上有些不同,它是 SpatialData 類型?;旧希猩亩丝谝话愦碇澳撤N”數(shù)據(jù)類型,而白色的端口就像一個大籃子,它可以裝幾乎所有 PCGGraph 中的數(shù)據(jù)類型,因為大部分數(shù)據(jù)都是誕生自它的子類。SpatialData 端口無法通過樣式來識別 MutipleData 或 MutipleInput,需要通過鼠標提示來仔細甄別。

第三類就是我們開頭提到的 Attribute,你可以看到它沒有縱深,也沒有縱向排列,它看上去像一個“條目”。

一個 Attribute (注意此處不同于 Attributes)代表某一個單獨的數(shù)據(jù),如果我們要將這個單獨的數(shù)據(jù)賦予給“成組”的數(shù)據(jù)要將如何呢?那就要給這個組里的每個數(shù)據(jù)各分一個,于是在 AttributesList 中,一個 Attribute 占有一列。

一個 Attribute 存在于每個數(shù)據(jù)元素上

*CreateAttribute?/?*AddAttribute

CreateAttribute 用于創(chuàng)建一個屬性,AddAttribute 用于向目標數(shù)據(jù)中添加一個屬性。

AppendAttributeSet 用于將多個 Attribute 合并為 AttributeSet。

AttributeBitwiseOp 用于屬性之間的位運算,支持 int32 或 int64 類型的屬性。

AttributeBooleanOp 用于屬性之間的布爾運算,輸出 bool 值,支持 bool 類型的屬性。

AttributeCompareOp 用于屬性之間的比較運算,輸出 bool 值。InputSurceA 和 InputSurceB 的類型不一定需要一致,但類型不一致時會遵循一些特殊的規(guī)則。


AttributeMathOp 用于屬性之間的數(shù)學運算。InputSurceA 和 InputSurceB 的類型不一定需要一致,但類型不一致時會遵循一些特殊的規(guī)則。


AttributeOperation 用于將一個來源屬性上的數(shù)據(jù)復制到目標屬性,如果目標屬性不存在則會創(chuàng)建目標屬性。


AttributePartition 根據(jù)一個指定的屬性,將輸入的數(shù)據(jù)元素分組。節(jié)點目前只會輸出與第0號元素屬性相同的有效分組,尚無法輸出其他分組,也沒有節(jié)點來使用分組。圖片示例中,可以看到 AttributePartition 應該輸出兩個分組,但它將每一個 PositionX = -500 的元素都作為一個單獨的分組輸出。

如果進需要按屬性對 Points 進行篩選,可以使用 DensityFilter 或 PointFilter 節(jié)點替代。


AttributeReduce 計算所有元素中某個 Attribute 的最大值,最小值或平均值。


AttributeRename 用于重命名某個 Attribute。


AttributeRename 計算與空間旋轉(zhuǎn)相關的一些操作。根據(jù)不同的執(zhí)行功能,它最多接受三個輸入。


AttributeSelect 從一維或多維 Attribute 中的某個維度中選擇具有最大,最小或中間值的那個元素,并輸出這個元素具有的 Attribute 值或這個元素。


AttributeRename 計算與空間變換相關的一些操作。根據(jù)不同的執(zhí)行功能,它最多接受三個輸入。操作符似乎尚不完全,無法應用矩陣。


AttributeTrigOp 執(zhí)行與三角函數(shù)相關的計算。


AttributeVectorOp 執(zhí)行與向量相關的計算。

MakeTransformAttribute 生成一個 Transform 類型的 Attribute。
BreakTransformAttribute 將一個 Transform 類型轉(zhuǎn)換為 Vector3 類型。


MakeVectorAttribute 生成一個 Vector2 / Vector / Vector4 類型的 Attribute。
BreakVectorAttribute 將一個 Vector2 / Vector / Vector4 類型轉(zhuǎn)換為分量所攜帶的類型。


DataTableRowToAttributeSet 將數(shù)據(jù)表中的某一行轉(zhuǎn)換為 AttributeSet。


FilterAttribute 篩選某一個特定的 Attribute,可以選擇只保留或刪除這個 Attribute。


GetAttributeFromPointInde 輸出某個特定元素及其 AttributeSet。


PointMatchAndSet 對于所有點,如果找到匹配(例如某個屬性等于某個值),則在該點上設置一個值(例如另一個屬性)。圖片示例中,將 TempB 值為 5 的元素的 TempA 屬性值都修改為 0。


TransferAttribute 將 Source 中的屬性傳遞給 Target。


*SetPointColor

SetPointColor 可以設置 Point 上的 Color 屬性。

?

[ Blueprint ]

*ExecuteBlueprint

ExecuteBlueprint 調(diào)用一個 PCGBlueprintElement 類型的藍圖,用于擴展 PCGGraph 中的節(jié)點。

?

[ Param ]

*GetActorProperty

GetActorProperty 用于 PCGGraph 與其他 Actor 類型之間的通信。

?

[ Subgraph ]

*Subgraph

PCGGraph 之間可以相互嵌套,一個 PCGGraph 可以作為另一個 PCGGraph 的子圖參與流程。

?

[ Transform ]

*ResetTransform

ResetTransform 用于重置 Transform 屬性數(shù)據(jù)。


RebuildPointRotationFromNormal 通過 Normal 朝向重新計算 Point 旋轉(zhuǎn),這可能改變原有的 Point 方向。


ApplyScaleToBounds 目前是一個無效節(jié)點。

?

PCG Subgraph

PCGGraph 有相互嵌套的能力,一個 PCGGraph 可以是其他 PCGGraph 的 Subgraph,為 PCGGraph 的復用和復雜 PCGGraph 的構(gòu)建提供了可能性。

圖間數(shù)據(jù)傳遞

圖間數(shù)據(jù)傳遞通過 Input 和 Output 的 CustomPin 實現(xiàn)。

打開一個 PCGGraph,選擇 Input 節(jié)點或者 Output 節(jié)點,可以通過添加節(jié)點上的 CustomPin 來添加自定義輸入和輸出。


有時我們希望從外部向 PCGGraph 內(nèi)部傳遞數(shù)據(jù),就像 PCGVolume 細節(jié)面板里 Setting 參數(shù)做的那樣,通過更改外部的選擇來控制 PCGGraph 的行為。

控制 Input 輸入的內(nèi)容

PCGGraph 提供創(chuàng)建 Parameters 用于與外部交互。打開 GraphSetting,我們可以創(chuàng)建 Parameters,并在外部的細節(jié)面板中設置 Parameters 的值。


?


PCGBlueprintElement 用于創(chuàng)建 PCGGraph 中的自定義節(jié)點。

PCGDataCollection

PCGDataCollection?是 PCGGraphPin 之間的數(shù)據(jù)傳輸類型,也就是 PCGBlueprintElement 的輸入和輸出。
一個 PCGDataCollection 可以包含多個 PCGTaggedData,一個 PCGTaggedData 包含端口名稱(PinLabel),標簽(Tags)和實際數(shù)據(jù)(PCGData)。

當我們需要從 PCGDataCollection 中讀取數(shù)據(jù)時,可以使用它提供的幾種函數(shù)。這些函數(shù)會根據(jù)不同的要求,將符合的 PCGTaggedData 打包為一個 PCGTaggedData 數(shù)組輸出。

PinLabel 指定要獲取哪個端口的數(shù)據(jù),Tags 則為 PCGData 的分組處理提供了可能。要是有 GetTaggedParamsByPin 就更好些了。

獲取 Input 數(shù)據(jù)的方式大略形式如下。

輸出數(shù)據(jù)時,我們首先將帶有 PinLabel 和 Tags 的 PCGTaggedData 全部放入一個數(shù)組中,然后交給 MakePCGDataCollection。


PCGGraph 有 AttributeSet 的概念,但 AttributeSet 是虛幻引擎中的一個已有類型了,所以 PCGGraph 中的 AttributeSet 實際是 PCGParamData 類型。PCGParamData 包裝了一個 PCGMetaData。

PCGMetaData 是一個較為特殊的東西,它在 PCGSpatialData 中就存在,是一個單數(shù)而非數(shù)組。這似乎意味著它的元素(條目)管理與 SpatialData 中的元素管理是分離的。

仔細想一想就能理解為什么要這么麻煩。因為 MetaData 可以不依賴于 SpatialData 而存在,在 PCGGraph 中。MetaData 可以作為 PCGBlueprintElement 的輸入和輸出,因此需要 PCGParamData 來包裝一下。

將 PCGParamData 轉(zhuǎn)換為 PCGDataCollection

剛剛接觸 PCGBlueprintElement 時就頗為困惑,為什么有些地方僅使用 PCGMetaData 就可以,而有些地方非要使用 PCGParamData 通過 MultableMetaData 節(jié)點轉(zhuǎn)換一下。

因為如果要將 MetaData 輸出,就必須使用 PCGParamData,如果只是局部使用,就可以直接使用 PCGMetaData。

下面的示例將 PCGBlueprintElement 的第一個 Input 和 Output 端口名字分別輸出到名為 InputName 和 OutputName 的單一條目屬性中。


當新建一個 PCGBlueprintElement 時,有一些虛函數(shù)可以被我們重寫。

除了一些能夠讓我們改變外觀的函數(shù),還有一些事比較重要的。

?

Execute() / ExecuteWithContext()

Execute() 和 ExecuteWithContext() 是同一處調(diào)用,ExecuteWithContext() 默認直接調(diào)用一次 Execute()。這里是實際的執(zhí)行函數(shù),我們的邏輯入口一般都寫在這里。觸發(fā)函數(shù)會被自動調(diào)用,不需要再手動調(diào)用。

?

PointLoopBody()

PointLoopBody() 是非常常用的需要重寫的函數(shù),當使用 PointLoop 節(jié)點時,默認會執(zhí)行這個函數(shù)中的邏輯。它是特殊的,會做異步處理。

下面的示例在 PCGGraph 中創(chuàng)建了一個值為“Hello”名為“CustomAttribute”的屬性,并在名為“InputSample”的 PCGBlueprintElement 中讀取 CustomAttribute,將每個 Point 的 Seed 與其合并儲存在名為“Copy”的屬性中輸出。

?

PCG Blueprint

向圖傳遞數(shù)據(jù)(藍圖)

向圖傳遞數(shù)據(jù)可以使用 GetActorProperty 節(jié)點,搜索本文“*GetActorProperty”可以找到相關的方法。如果是在運行時改變數(shù)據(jù),可以配合 NotifyPropertiesChangedFromBlueprint 節(jié)點使用。

從圖獲取數(shù)據(jù)

能夠從 PCGGraph 中獲取的數(shù)據(jù)是該圖的 Output,可以使用 GetGeneratedGraphOutput 節(jié)點。

GetGeneratedGraphOutput 獲取到的是我們的老朋友 PCGDataCollection。

示例中,我們在 PCGGraph 中創(chuàng)建了兩個自定義輸出,并分別輸出了一個 PCGParamData 和一個 PCGPointData。接著將該 PCGGraph 添加到藍圖中,藍圖里執(zhí)行兩條路線,分別獲取 PCGParamData 的數(shù)據(jù)和 PCGPointData 中的 Transform 屬性。

運行關卡,打印如下數(shù)據(jù)。

?


UE5程序化內(nèi)容生成框架(PCG)的評論 (共 條)

分享到微博請遵守國家法律
手机| 屏边| 萨迦县| 阳朔县| 合山市| 济南市| 宁夏| 若尔盖县| 卫辉市| 汕尾市| 青铜峡市| 双柏县| 呼玛县| 民丰县| 吉木萨尔县| 安宁市| 岢岚县| 浏阳市| 新河县| 武城县| 秭归县| 丹巴县| 乌苏市| 威宁| 巴南区| 萨嘎县| 筠连县| 梁河县| 冷水江市| 比如县| 成武县| 高密市| 宜丰县| 双鸭山市| 福州市| 习水县| 安丘市| 东莞市| 嘉禾县| 松潘县| 莫力|