首先,我们将把Hooke定律写Euler方法结合在一起找到新坐标、加速和速度。
Hooke定律是F=kx,这里的F是指由水流产生的力(记住,我们将把水体表面模拟为水流),k是指水流的常量。x则是位移。我们的位移将成为每一个节点的y坐标减去节点的基本高度。
下一步,我们将加入一个与力的速度成比例的阻尼因素来削弱力 unity3d 编写代码例如以下:

for (int i = 0; i < xpositions.Length ; i++) 
  
 { 
  
 float force = springconstant * (ypositions[i] – baseheight) + velocities[i]*damping ; 
  
 accelerations[i] = -force; 
  
 ypositions[i] += velocities[i]; 
  
 velocities[i] += accelerations[i]; 
  
 Body.SetPosition(i, new Vector3(xpositions[i], ypositions[i], z)); 
  
 }


Euler方法非常easy,我们仅仅要向速度加入加速,向每帧坐标添加速度。
注:我仅仅是如果每一个节点的质量为1,但你可能会想用:
1

accelerations[i] = -force/mass;


如今我们将创造波传播。下面节点是依据Michael Hoffman的教程调整而来的:

float[] leftDeltas = new float[xpositions.Length]; 
  
 float[] rightDeltas = new float[xpositions.Length];


在此。我们要创造两个阵列。针对每一个节点,我们将检查之前节点的高度,以及当前节点的高度,并将二者区别放入leftDeltas。
之后。我们将检查兴许节点的高度与当前检查节点的高度,并将二者的区别放入rightDeltas(我们将乘以一个传播常量来添加全部值)。

for (int j = 0; j < 8; j++) 
  
 { 
  
 for (int i = 0; i < xpositions.Length; i++) 
  
 { 
  
 if (i > 0) 
  
 { 
  
 leftDeltas[i] = spread * (ypositions[i] – ypositions[i-1]); 
  
 velocities[i - 1] += leftDeltas[i]; 
  
 } 
  
 if (i < xpositions.Length – 1) 
  
 { 
  
 rightDeltas[i] = spread * (ypositions[i] – ypositions[i + 1]); 
  
 velocities[i + 1] += rightDeltas[i]; 
  
 } 
  
 } 
  
 }