我正在使用我从中得到的水流算法 http://www.gamedev.net/reference/articles/article915.asp
似乎当我创建一个wave时,它从一个圆圈开始。随着时间的推移,圆消散并具有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
答案 0 :(得分:1)
你正在使用整数作为职位。这引入了各种量化问题(对于顶点位置,即。)
我会说你可能想让它保持浮点状态以使事情顺利进行。
答案 1 :(得分:0)
我从第一次波纹模拟中知道了这种效果。解决方案:使用更详细的卷积内核。您可能还需要添加阻尼因子来消除涟漪,因此没有数值误差累积到失控积分中。这是我早期游戏引擎中的一个相关部分(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