我使用的是我从http://www.gamedev.net/reference/articles/article915.asp得到的水流算法
似乎当我创建一个wave时,它从一个圆圈开始。随着时间的推移,圆圈逐渐消散,并在45度、-45度、45度和-45度处形成线条。因此,它看起来不再像一个波浪,而是一个方形的形状。
这是启动wave的代码:
WaveMapPingc(int x,int y,int rd, int str)
{
for(float a=0; a<3.14159*2; a+=.1)
{
for(int r=1; r<rd;r++)
{
// LowWaveMapPingca(x+(int)((float)r*cos(a)+.5) ,y+(int)((float)r*sin(a)+.5),str );
WaveMap[CT]
[x+(int)((float)r*cos(a)+.5)]
[y+(int)((float)r*sin(a)+.5)]=str;
}
}
}这是生成高度图的代码:
UpdateWaveMap()
{
int x,y,n;
int Temporary_Value = CT;
CT = NW;
NW = Temporary_Value;
// { Skip the edges to allow area sampling }
for(y= 1; y<MAXY-1; y++)
{
for(x= 1;x< MAXX-1; x++)
{
n = ( WaveMap[CT][x-1][y] +
WaveMap[CT][x+1][y] +
WaveMap[CT][x][y-1] +
WaveMap[CT][x][y+1] ) / 2 -
WaveMap[NW][x][y];
float sub=(float)n / DAMP;
int isub=sub;
if (n<1 && isub==0)
n++;
else
if (n>1 && isub==0)
n--;
else
n = n-isub;
WaveMap[NW][x][y] = n;
} // x
} // y
} // function发布于 2011-01-06 07:42:48
您使用的是整数的位置。这引入了各种量化问题(即顶点位置)。
我想说的是,你可能希望将它保持在浮点数中,以使事情变得平滑。
发布于 2011-01-06 08:16:08
我从我的第一次涟漪模拟中就知道了这种效果。解决方案:使用更详细的卷积内核。您可能还想添加一个阻尼因子,以消除波动,这样就不会有数值误差累积到失控积分中。这是我早期的一个游戏引擎( 10年前写的)中的相关部分:
*value_at(Next, x, y)=(
(
(*value_at(Current, x-1, y-1)+
*value_at(Current, x+1, y-1)+
*value_at(Current, x+1, y+1)+
*value_at(Current, x-1, y+1))+
(*value_at(Current, x-1, y)+
*value_at(Current, x+1, y)+
*value_at(Current, x, y-1)+
*value_at(Current, x, y+1))
)/4
-( *value_at(Previous, x, y) )
)*0.98;这实际上是使用卷积计算离散波函数。内核的分辨率越高,质量越好。在这里使用SIMD优化真的很有帮助。然而,由于卷积是傅立叶空间中的简单乘法,如果你对高质量的波纹和波感兴趣,使用傅立叶方法做这件事是一个非常好的想法。使用一些调整可以产生很好的重力波(不要与广义相对论中的引力波混淆) http://en.wikipedia.org/wiki/Gravity_wave
https://stackoverflow.com/questions/4609734
复制相似问题