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