2011/05/23

Thinking Particles碰撞偵測注意事項


如果你正在製作有鐵鍊的案子, 在試過Rayfire, Reactor, NVidia PhysX等方案後, 最後發現只有Thinking Particles能夠模擬鐵鍊動畫的話, 那你應該要讀這篇文章.

既然是注意事項, 就直接跳到重點. 所有剛體都要給予重力才會有物理寫實的結果. 在TP裡面你可以用max標準的gravity或是用一個向量做出重力的效果.

如上圖:方法一 你可以用stdForce, activate場景中的gravity; 方法二是先做一個Force oprator再接上一個往下的向量. 第二個方法似乎比較笨, 比較明顯的優點是不需要在場景中拉一個gravity force, 另一個優點是重力可以是對速度增加數值, 或是相乘數值(如果初速度等於零, 計算就會錯誤)但是其實用向量的方法的優點會比你預期的還要更重要!


首先是可以控制strength強度, 這沒有什麼. 可以有variation變化度, 這就厲害了, 一條直挺挺的鐵鍊每個鐵鍊可以對重力有不同反應, 模擬結果會更加自然.

綠色的小點表示voxel

第二個優點就非常重要了, 那就是關於collision leak 剛體間沒有正確的碰撞導致鐵鍊斷掉. 若是忽略重力這件事, 要避免collision leak, 1)可以增加sub-frame的數目 (讓快速移動的物件可以計算更多的內差位置, 增加碰撞的成功機會 2)增加voxel數值, 同樣可以讓鐵鍊更容易碰撞 3)修改模型的密度, 讓網格分布更加平均更加緊密.

答案揭曉, subframe, voxel與模型這三個因子都沒有重力的影響要重要. 而重力的設定務必要使用向量加Force Operator的串法, 這裡引用Bobo在CGTALK的一句話

請記住, 外力要影響粒子需要花費一點時間 (因為外力影響的是速度, 速度進而影響粒子的位置). 預設值的狀況, 外力的強度往往對那些速度很小的物件影響力不足.

我通常會把Influence %設為10000.0 另外加一個Wind將其Turbulence設為1.0 Frequency 0.01 and Scale 1.0 外加 Drag with 5% for X,Y and Z 最後的結果就會很隨機.
換句話說當鐵鍊物件起始速度為零時, 標準的gravity根本就對鐵鍊沒有影響力 (這時候你會以為重力的強度不夠, 或是認為模擬的結果不夠真實), 問題就在用標準的gravity的串法有根本上的問題, 它可能是把重力與速度相乘, 而不是真正把重力作用到鐵鍊本身. 因此場景中已經有設key的鐵鍊本身有初速度, 它會拖著沒有速度的鐵鍊, 而沒有速度的鐵鍊是在被拖動的時候才真正被重力所影響, 造成鐵鍊之間的模型交錯, 最後就發生collision leak的問題了.

[相關文章]

No comments: