unity3d教程运行物理机制
首先,我们将把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的教程调整而来的:
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];
}
}
}
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的教程调整而来的:
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];
}
}
}