Math 基于时间t的初始谱实时海浪运动生成

Math 基于时间t的初始谱实时海浪运动生成,math,graphics,glsl,fft,ifft,Math,Graphics,Glsl,Fft,Ifft,我花了大约一周的时间使用gerstner waves渲染了一个简单的海洋,但在平铺方面遇到了问题,所以我决定开始正确地渲染它们,并将脚趾浸入使用iFFT渲染高度场的浑浊水域中 有很多文章解释了基本要点- 1计算频谱 2使用此选项创建高度场,使用ifft将频率域转换为空间域-使用时间t设置动画 从这段旅程开始,我就学习了一些东西,比如复平面,复指数方程,更详细的FFT等,但是在创建初始光谱的初始步骤之后,渲染了一个由guassian数组成的纹理,平均值为0,sd为1,经过phillips光谱过滤,

我花了大约一周的时间使用gerstner waves渲染了一个简单的海洋,但在平铺方面遇到了问题,所以我决定开始正确地渲染它们,并将脚趾浸入使用iFFT渲染高度场的浑浊水域中

有很多文章解释了基本要点-

1计算频谱

2使用此选项创建高度场,使用ifft将频率域转换为空间域-使用时间t设置动画

从这段旅程开始,我就学习了一些东西,比如复平面,复指数方程,更详细的FFT等,但是在创建初始光谱的初始步骤之后,渲染了一个由guassian数组成的纹理,平均值为0,sd为1,经过phillips光谱过滤,我仍然完全迷路了

我创建初始数据的代码如下:

float PhillipsSpectrum(vec2 k){
  //kLen is the length of the vector from the centre of the tex
  float kLen = length(k);
  float kSq = kLen * kLen;

  // amp is wave amplitude, passed in as a uniform
  float Amp = amplitude;

  //L = velocity * velcoity / gravity
  float L = (velocity*velocity)/9.81;

  float dir = dot(normalize(waveDir),normalize(k));

  return Amp * (dir*dir) * exp(-1.0/(kSq * L * L))/ (kSq * kSq) ;
}

void main(){

   vec3 sums;

   //get screenpos - center is 0.0 and ranges from -0.5 to 0.5 in both
   //directions
   vec2 screenPos = vec2(gl_FragCoord.x,gl_FragCoord.y)/texSize - vec2(0.5,0.5);

   //get random Guass number
   vec2 randomGuass = vec2(rand(screenPos),rand(screenPos.yx));

   //use phillips spectrum as a filter depending on position in freq domain
   float Phil = sqrt(PhillipsSpectrum(screenPos));
   float coeff = 1.0/sqrt(2.0);

   color = vec3(coeff *randomGuass.x * Phil,coeff * randomGuass.y * Phil,0.0);
}  
这将创建如下纹理:

现在我完全不知道如何: a从初始纹理导出三个方向的光谱

b根据幻灯片5中提到的时间t设置动画


我可能是完全愚蠢的,忽略了一些非常明显的事情——我已经看了一堆文件,甚至在了解了公式的含义之后,也迷失在公式中。请帮助。

您应该阅读一些关于这方面的文章,这些幻灯片没有足够的信息,。。。在我看来,纹理根本不是纹理,但波的波长和振幅的统计分布不确定k和粗体k之间的区别这是一个2D光谱,因此应用2D IDFFT,您将从中获得ω和参数,因此现在只需将时间添加到波方程中,并对每个位置和位置求和应该是这样的,但我第一次看到这一点,所以我也可能在幻灯片上遗漏了一些更新图表。。。你得到了方程,如果我得到正确的话,纹理是H0k,在IDFFT之后,它被称为Hk,所以只要计算两个方程的组合。。。顺便说一句,你的输出纹理与他们的不匹配。你的纹理在两个轴上是对称的。他们的纹理是旋转的,在单轴上是对称的。。。所以你的波浪看起来有点像differently@spektre谢谢你的评论,不过你说的很明显,是的,这实际上是波的统计分布,在应用fft之前更新。它是对称的,因为我使用不同的输入VAL来创建phillips光谱。谢天谢地,我已经找到了演示文稿的源代码,现在正在浏览,不过这是非常疯狂的东西。再次感谢。