關於maya動力學系統的一些總結


maya動力學有以下幾套系統:

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.

getParticleAttr -at velocity 
particleShape1.pt[0:7] 
particleShape1.pt[11];

// This will return the average velocity for particles 0-7 and 11
// as well as the maximum offset from the average.
particle 創建粒子、編輯、修改粒子屬性
particle -attribute velocity -order 7 -q;
// Returns the velocity of the 7th particle in the currently selected
// particle object

particle -e -attribute velocity -order 7 -vectorValue 0.0 1.0 0.0;
// Edits the velocity of the 7th particle in the currently selected
// particle object to be 0.0, 1.0, 0.0
nParticle 與particle命令類似
nParticle -attribute velocity -order 7 -q;
// Returns the velocity of the 7th particle in the currently selected
// particle object

nParticle -e -attribute velocity -order 7 -vectorValue 0.0 1.0 0.0;
// Edits the velocity of the 7th particle in the currently selected
// particle object to be 0.0, 1.0, 0.0

發現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,再對確實發生碰撞的粒子處理。





免責聲明!

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



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