升级水插件

This commit is contained in:
2026-01-08 22:30:55 +08:00
parent febff82d24
commit ca68084264
415 changed files with 18138 additions and 7134 deletions

View File

@@ -88,9 +88,10 @@ namespace WaveHarmonic.Crest
/// <param name="wavelength">Wavelength in m</param>
/// <param name="componentsPerOctave">How many waves we're sampling, used to conserve energy for different sampling rates</param>
/// <param name="windSpeed">Wind speed in m/s</param>
/// <param name="gravity">Gravity</param>
/// <param name="power">The energy of the wave in J</param>
/// <returns>The amplitude of the wave in m</returns>
internal float GetAmplitude(float wavelength, float componentsPerOctave, float windSpeed, out float power)
internal float GetAmplitude(float wavelength, float componentsPerOctave, float windSpeed, float gravity, out float power)
{
Debug.AssertFormat(wavelength > 0f, this, "Crest: {0} wavelength must be > 0.", nameof(WaveSpectrum));
@@ -121,15 +122,18 @@ namespace WaveHarmonic.Crest
var hasNextIndex = nextIndex < _PowerLogarithmicScales.Length;
var nextPower = hasNextIndex && !_PowerDisabled[nextIndex] ? _PowerLogarithmicScales[nextIndex] : s_MinimumPowerLog;
// Empirical wind influence based on alpha-beta spectrum that underlies empirical spectra
gravity *= _GravityScale;
// The amplitude calculation follows this nice paper from Frechot:
// https://hal.archives-ouvertes.fr/file/index/docid/307938/filename/frechot_realistic_simulation_of_ocean_surface_using_wave_spectra.pdf
var wl_lo = Mathf.Pow(2f, Mathf.Floor(wl_pow2));
var k_lo = 2f * Mathf.PI / wl_lo;
var c_lo = ComputeWaveSpeed(wl_lo);
var c_lo = ComputeWaveSpeed(wl_lo, gravity);
var omega_lo = k_lo * c_lo;
var wl_hi = 2f * wl_lo;
var k_hi = 2f * Mathf.PI / wl_hi;
var c_hi = ComputeWaveSpeed(wl_hi);
var c_hi = ComputeWaveSpeed(wl_hi, gravity);
var omega_hi = k_hi * c_hi;
var domega = (omega_lo - omega_hi) / componentsPerOctave;
@@ -141,9 +145,6 @@ namespace WaveHarmonic.Crest
power = hasNextIndex ? Mathf.Lerp(thisPower, nextPower, alpha) : thisPower;
power = Mathf.Pow(10f, power);
// Empirical wind influence based on alpha-beta spectrum that underlies empirical spectra
var gravity = _GravityScale * WaterRenderer.Instance.Gravity;
// Zero gravity will cause NaNs, and they have always been flat.
if (gravity <= 0f) return 0f;
@@ -163,11 +164,11 @@ namespace WaveHarmonic.Crest
return a * _Multiplier;
}
static float ComputeWaveSpeed(float wavelength, float gravityMultiplier = 1f)
static float ComputeWaveSpeed(float wavelength, float gravity, float gravityMultiplier = 1f)
{
// wave speed of deep sea water waves: https://en.wikipedia.org/wiki/Wind_wave
// https://en.wikipedia.org/wiki/Dispersion_(water_waves)#Wave_propagation_and_dispersion
var g = WaterRenderer.Instance.Gravity * gravityMultiplier;
var g = gravity * gravityMultiplier;
var k = 2f * Mathf.PI / wavelength;
//float h = max(depth, 0.01);
//float cp = sqrt(abs(tanh_clamped(h * k)) * g / k);
@@ -209,10 +210,8 @@ namespace WaveHarmonic.Crest
}
// This applies the correct PM spectrum powers, validated against a separate implementation
internal void ApplyPiersonMoskowitzSpectrum()
internal void ApplyPiersonMoskowitzSpectrum(float gravity)
{
var gravity = WaterRenderer.Instance != null ? WaterRenderer.Instance.Gravity : Mathf.Abs(Physics.gravity.y);
for (var octave = 0; octave < k_NumberOfOctaves; octave++)
{
var wl = SmallWavelength(octave);