1.剛體、柔體系統
剛體系統的典型節點連接方法如下:
物體的變換節點、形狀節點連接rigidBody節點,剛體節點輸出力到解算器節點,解算器輸出新的變換到變換節點
值得注意的是柔體系統實際上是用粒子實現的,通過給每個網格頂點賦予一個粒子,再讓粒子反過來操縱網格,實現網格的變形。
通過在粒子之間創建大量彈簧,實現粒子之間的相互影響,於是物體看上去就像發生了彈性變形一樣。
彈簧的節點連接方法如下:
2.普通粒子系統
普通粒子系統可以同網格物體發生碰撞。典型節點連接方法:
網格的形狀節點輸出到geoConnector節點,這個節點輸出一個sweptGeometry,粒子根據sweptGeometry數據計算自身是否應該反彈。
sweptGeometry表示一個幾何體一幀之內每個三角形掃過的區域。其存放幾何體每個三角形在此幀前后的位置。
可以發現此種連接方式沒有影響形狀節點的輸入,也就是影響是
單向的,物體影響粒子系統,但是粒子系統不影響物體。
3.n粒子系統、n布料系統
默認情況下,n粒子系統可以同n布料系統發生碰撞。
n布料系統通過調整物體的剛性參數,可以模擬布料,也可以模擬柔體、剛體,是一個多功能的系統。
n粒子系統的節點連接方式是:
n粒子的形狀節點的current state、start state輸出分別連到nucleus解算器節點的inputActive、inputActiveStart輸入中,解算器節點的outputObjects屬性連到形狀節點的nextState屬性中。這幾個屬性都是Nobject類型。
n布料的連接方式與此相同。
還有一種稱為Passive Object,也就是會影響n粒子、n布料,但是自身我行我素不受影響的物體。這種物體的連接方式如下:
nRigid物體的輸出連入nucleus解算器,但解算器無輸出連到物體本身。
值得注意的是nRigid物體在模擬過程中是允許變形的,但是網格拓撲不能變。
可見n系統工作方式是:
把所有n物體都輸入nucleus節點,再把節點的解算結果傳回給對應的n物體。
n粒子可以實現粒子之間的堆疊(因為粒子之間可以存在作用力)
幾個與粒子有關的mel命令:
| 命令 | 功能 | 典型用法 |
| event | 插入一個碰撞事件,可以是粒子分裂、粒子出生,或者調用外部函數 | event -proc myProc myCloud;
// Call the MEL proc // "myProc(name, id, name) each time a particle// of myCloud collides with anything. |
| getParticleAttr | 獲得粒子系統的屬性,返回平均值,或者是數組 | getParticleAttr -at velocity particle1;
// This will return the average velocity for the entire particle
// object as well as the maximum offset from the average.
|
| particle | 創建粒子、編輯、修改粒子屬性 | particle -attribute velocity -order 7 -q;
|
| nParticle | 與particle命令類似 | nParticle -attribute velocity -order 7 -q;
|
發現n粒子可以用以下方法查詢碰撞的力:
1.首先在粒子形狀節點添加以下屬性:
2. 然后用以下命令
nParticle -attribute collisionForce -id 1 -q nParticle1;
可以返回特定粒子的屬性
若用getAttr nParticleShape1.collisionForce,則可以返回所有粒子的屬性
也就是說,粒子自定義屬性是一些由用戶添加上去的屬性,用戶添加了之后,
粒子系統每一幀會根據自身情況,設置這些屬性的值。
下面是碰撞相關屬性的含義。其中World表示世界空間(但似乎仍然是局部空間……)
| 名稱 | 大小 | 含義 |
| collision(World)Force | 粒子數*3 | 碰撞過程中粒子所受的力 |
| collision(World)Position | 粒子數*3 |
碰撞位置 |
| collision(World)IncomingVelocity | 粒子數*3 |
碰撞前速度 |
| collision(World)OutgoingVelocity | 粒子數*3 |
碰撞后速度 |
| collision(World)Normal | 粒子數*3 |
碰撞地點法線 |
| collisionTime | 粒子數 | 碰撞發生時間 |
| collisionGeometryIndex | 粒子數 | 一個位圖,每一元素表示一個粒子,若該粒子發生碰撞,對應元素為0,否則為碰撞的幾何體序號,可以通過以下方法獲得幾何體 int $idx = particleShape1.collisionGeometryIndex; if( $idx != -1 ) { string $geoC[] = `listConnections particleShape1.collisionGeometry[$idx]`...} |
| collisionComponentId | 粒子數 | 一個位圖,每一元素表示與粒子發生碰撞的多邊形面(face)序號,注意這些序號可能來自不同物體。此時可以通過為碰撞事件綁定一個回調函數(見前述event命令),通過回調函數的參數獲得碰撞物體名稱 |
值得注意的是前面幾個關於碰撞點數據的屬性,只有在碰撞發生的粒子對應的數組位置才會被設置,其余位置為未知值,一般為-999.99之類。使用時應該先查詢
collisionGeometryIndex,再對確實發生碰撞的粒子處理。
