试图创造水波纹效果,但涟漪在OpenGL中变成了正方形

时间:2011-01-05 22:12:16

标签: opengl

我正在使用我从中得到的水流算法 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

2 个答案:

答案 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