一、Neighbor Grid 3D 的核心作用
NeighborGrid3D
?是一種基于位置的哈希查找結構,將粒子按空間位置劃分到網格單元(Cell)中,實現快速鄰近查詢:
-
空間劃分:將模擬空間劃分為多個三維網格單元(Cell),每個單元可存儲多個粒子(稱為 “Neighbor”)。
-
加速查詢:通過位置→網格索引→粒子索引的映射,避免全局遍歷粒子,極大提升鄰近粒子搜索效率(如查找最近粒子、屬性傳遞)13。
-
典型應用:顏色傳遞、距離檢測、動態碰撞等需粒子交互的場景。
二、“Initialize Neighbor Grid” 的具體功能
該模塊負責初始化網格的基礎參數和變換矩陣,是后續操作的前提:
-
網格參數配置
-
NumCell:定義網格在X/Y/Z軸的分辨率(如?
(10,10,10)
?表示10×10×10的網格)。 -
MaxNeighborsPerCell:限制單個Cell內可存儲的粒子數量(超出時粒子可能注入失敗)1。
-
GridExtents:通過輸入世界空間范圍(如?
WorldGridExtents
)定義網格的物理大小12。
-
-
步驟1:通過位置獲取所在Cell的索引。
-
步驟2:遍歷該Cell內所有Leader粒子,比較距離并記錄最近粒子的Index。
-
步驟3:用?
Attribute Reader
?讀取該粒子的屬性(如顏色)13。
-
Avoid Distance Field Surface?是 Niagara 粒子系統中用于動態規避場景距離場表面的模塊,通過計算粒子與全局距離場(Global Distance Field)的交互力,實現粒子在運動過程中自動繞開靜態網格體表面。其核心原理如下:
-
距離場基礎
距離場(Signed Distance Field, SDF)存儲了空間點到最近物體表面的有向距離:-
正值:點在物體外部,距離表面越遠值越大。
-
負值:點在物體內部,距離表面越近值越接近零37。
-
-
規避力計算
模塊根據粒子當前位置采樣距離場值,生成一個排斥力方向(從表面指向粒子),力的大小隨距離遞減:-
粒子接近表面時排斥力增強,防止穿透。
-
粒子遠離表面時排斥力減弱,避免過度偏移
-
Nearest Surface Avoidance
?(最近表面避免)
-
目的:?讓粒子遠離它當前位置最近的任何場景表面。
Oncoming Surface Avoidance
?(迎面表面避免)
-
目的:?讓粒子避免撞擊到它當前運動方向正前方的表面。
-
工作原理:
-
對于每個粒子,沿著其當前速度方向(Velocity 向量)?發射一條射線(Ray)。
-
使用全局距離場進行高效的射線步進(Ray Marching),檢測射線前方一定距離(由參數控制)?內是否有表面。
-
如果檢測到前方有表面(即射線擊中了距離場),則計算一個排斥力向量。
-
這個力的方向通常是從檢測到的撞擊點指向粒子當前位置的方向(或者基于撞擊點表面法線的某種反射/偏轉方向)。
-
力的強度通常基于粒子到預測撞擊點的距離以及粒子速度的大小進行調節(距離越近、速度越快,力越強)。
-
Populate Neighbor Grid(填充鄰域網格),通過輸入Grid3D,粒子位置信息,本地空間的轉換,來構建
-
輸入粒子位置、變換矩陣、Grid對象。
-
通過HLSL代碼將粒子位置轉換為網格索引(
CellIndex
),并將粒子索引(Particle Index)關聯到對應Cell的Neighbor列表中。
說白了,就是構建粒子的查詢哈希表