3D Graph

即時的衣服變形

衣服的點比較特別 就像下面那張圖 點就會像小球一樣
每個小球跟小球之間都有個彈簧
會受到變形 但又不會分的很開  一般的點中間距離都不會變 
衣服算是比較特別的 
其實演算法很簡單 下面會介紹  而這張圖 也常被稱作"粒子彈簧"(Spring mass)

小球的受力分析(設P(x,y)表示處於網格x,y處小球的3D坐標,L為彈簧的原始長度,C為彈簧的虎克係數):

1、重力。恆定等於mg,方向垂直向下。

2、前、後、左、右四根彈簧的拉力(或推力)。可以用簡單的虎克定律來求,即力的大小與彈簧的伸長量成正比,例如右邊彈簧對小球的拉力的大小 |F_right| = ( |P(x+1,y) – P(x,y)| – L) × C,方向在P(x+1,y)和P(x,y)的連線上(注意F_right是一個向量)。

小球的運動分析:

假設一小球在某一時刻t0的坐標為P(x,y),速度為V(x,y),那麼在△t時間後,它的新坐標可以很容易的用下式求得(注意,以下運算均為向量運算):

小球所受合力 F = mg + F_left + F_right + F_top + F_bottom

小球的速度 V’ = V(x,y) + F/m

小球在△t後的新坐標 P(x,y)’ = P(x,y) + V’ × △t

ps.在這裡,我們假設了在△t的時間內,小球以恆定的速度運動,而並沒有顧及這段時間內小球的受力、速度都在變化,這是spring mass算法中最重要的假設,因為如果你企圖用精確的微積分方法來計算網格中每個球的運動速度和軌跡,即使是10*10的網格,也是一件幾乎不可能的事情。所以△t的選取非常重要,△t越小,則計算越準確,但是顯示出來就會成為慢動作回放;△t太大的話,整個網格則會很容易失穩,你會親眼看到你的布變成一團亂

來放一下虛擬碼 
cloth1 (0 to 31, 0 to 31)
cloth2 (0 to 31, 0 to 31)     

Variables:

VECTOR: MovementVector
VECTOR: SpringVector
VECTOR: ForceVector
VECTOR: Gravity  (initialised to (0, 0, g) where g is gravity, 0.02 is a good number)
NUMBER: Length
NUMBER: ForceScaler
NUMBER: NormalLength

For every point (p,q) on the cloth:

    MovementVector = Gravity

    For each of the 24 neighbouring points (NB obviously less at edges)
       SpringVector = (position in space of neighbour) – (position in space of point (p,q))
       Length       = length of SpringVector
      NormalLength = The length SpringVector would be if the cloth were unstretched
      ForceScaler  = (Length – NormalLength) / NormalLength
      SpringVector = SpringVector * (1/Length)
      ForceVector  = SpringVector * ForceScaler
      ForceVector  = ForceVector * SmallAmount
      add ForceVector to MovementVector
    end of loop

    Add MovementVector to cloth1(p,q) and store it in cloth2(p,q)

    make sure this point does not move inside an object
end of loop

Copy all the values in cloth2 to cloth1

 

以上只是彈簧網格在最簡單情況下的運動分析 並沒有考慮以下一些因素 而這些是讓布顯得更加真實的必要條件

1.彈簧的彎曲應力(Bend stress)沒有這個 布在彎曲時不會形成圓弧形的彎角

2.自己碰撞檢測(Self collision)沒有這個 布會穿透自己

3.其他物體碰撞檢測(Hit detection)沒有這個 布會穿透其它物體

4.空氣的阻力(Air resistance)沒有這個 自由落體時 布會像石頭一樣砸向地面

5.被風吹動(Affected by wind)沒有這個 你永遠不可能模擬出一塊真實而飄逸的布

 

 
   

 

發表留言