我已经按照这个Gerstner波纹着色器图教程这里进行了跟随。
现在,我正在尝试通过将以下脚本附加到游戏对象上来实现浮力(取自这个教程)。
在这段代码中,你使用
以下截图展示了我目前使用的Gerstner波着色器图设置。
要澄清的是,有4个单独的Gerstner波叠加在一起,以使其更加逼真,因此需要将其纳入公式中。 频率子图
现在,我正在尝试通过将以下脚本附加到游戏对象上来实现浮力(取自这个教程)。
using UnityEngine;
public class Floater : MonoBehaviour
{
public Rigidbody rigidBody;
public float depthBeforeSubmerged = 1f;
public float displacementAmount = 3f;
public int floaterCount = 1;
public float waterDrag = 0.99f;
public float waterAngularDrag = 0.5f;
private void FixedUpdate()
{
rigidBody.AddForceAtPosition(Physics.gravity / floaterCount, transform.position, ForceMode.Acceleration);
float waveHeight = WaveManager.instance.GetWaveHeight();
if (transform.position.y < waveHeight)
{
float displacementMultiplier = Mathf.Clamp01((waveHeight - transform.position.y) / depthBeforeSubmerged) * displacementAmount;
rigidBody.AddForceAtPosition(new Vector3(0f, Mathf.Abs(Physics.gravity.y) * displacementMultiplier, 0f), transform.position, ForceMode.Acceleration);
rigidBody.AddForce(displacementMultiplier * -rigidBody.velocity * waterDrag * Time.fixedDeltaTime, ForceMode.VelocityChange);
rigidBody.AddTorque(displacementMultiplier * -rigidBody.angularVelocity * waterAngularDrag * Time.fixedDeltaTime, ForceMode.VelocityChange);
}
}
}
在这段代码中,你使用
float waveHeight = WaveManager.instance.GetWaveHeight();
来从下面的WaveManager脚本中获取波浪高度,该脚本附加在Gerstner Wave游戏对象上(只是一个应用了着色器图形材质的细分平面)。public class WaveManager : MonoBehaviour
{
public static WaveManager instance;
private void Awake()
{
if (instance == null)
{
instance = this;
}
else if (instance != this)
{
Debug.Log("Instance already exists, destroying object!");
Destroy(this);
}
}
public float GetWaveHeight()
{
// The formula will go here.
}
}
你应该在GetWaveHeight()函数中使用与着色器图中相同的公式。
问题是我不知道如何实现这一点。以下截图展示了我目前使用的Gerstner波着色器图设置。
要澄清的是,有4个单独的Gerstner波叠加在一起,以使其更加逼真,因此需要将其纳入公式中。 频率子图
Theta子图
位移子图
GerstnerWave子图
新常态子图
Gerstner Shader Graph(分为3个部分:顶部、中部和底部,因为它太大了)欢迎任何建议。我知道这可能是一个复杂的问题,如果需要澄清任何事情,请告诉我。
项目在GitHub上这里可用。
我正在使用一艘船模型来测试浮力,它有4个附加了Floater脚本的游戏对象。
谢谢!
GetHeight(Vector2)
函数的方法,因为着色器通过在网格中的x、z位置和y方向上移动点来工作,所以很难从给定的(x,z)位置"查找"高度。要么你需要一个更简单的波浪系统,只进行垂直位移,或者可以将波浪渲染到表示波浪高度的RenderTexture
中,并读取纹理值来获取波浪高度。 - John