一、案例效果图:
二、源代码下载地址:http://download.csdn.net/detail/sh15285118586/8571025#comment
三、核心代码部分:
BOOL CMyRainsView::RenderScene()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(250, 250, 250, 0, 0, 0, 0, 1, 0);
glColor3f(1, 1, 1);
DrawModel();
if ((rand() % 2) == 0)
{
wavemap[nmap][(rand() % (MAPY-2))+1][(rand() % (MAPX-2))+1] = 50;
wavemap[cmap][(rand() % (MAPY-2))+1][(rand() % (MAPX-2))+1] = 50;
}
glTranslatef(-128, 0, -128);
ProcessWave();
DrawWave();
InvertWaveMap();
glLoadIdentity();
::SwapBuffers(m_pDC->GetSafeHdc()); //交互缓冲区
return TRUE;
}
void CMyRainsView::ProcessWave()
{
float temp;
for (int i=1; i<MAPY-1; i++)
for (int j=1; j<MAPX-1; j++)
{
temp = ((wavemap[cmap][i-1][j] +
wavemap[cmap][i+1][j] +
wavemap[cmap][i][j-1] +
wavemap[cmap][i][j+1] +
wavemap[cmap][i-1][j+1] +
wavemap[cmap][i+1][j+1] +
wavemap[cmap][i-1][j-1] +
wavemap[cmap][i+1][j-1]) / 4)-wavemap[nmap][i][j];
temp = temp - (temp / damp);
if (temp < 0.01) temp = 0;
wavemap[nmap][i][j] = temp;
}
}
void CMyRainsView::InvertWaveMap()
{
int temp = cmap;
cmap = nmap;
nmap = temp;
}
void CMyRainsView::DrawWave()
{
int i, j;
glDisable(GL_TEXTURE_2D);
glColor4f(1, 1, 1, 0.1);
glBegin(GL_TRIANGLES);
for (i=0; i<MAPY-1; i++)
{
for (j=0; j<MAPX-1; j++)
{
glVertex3f(j*2, wavemap[cmap][i][j], i*2);
glVertex3f((j+1)*2, wavemap[cmap][i+1][j+1], (i+1)*2);
glVertex3f(j*2, wavemap[cmap][i+1][j], (i+1)*2);
glVertex3f(j*2, wavemap[cmap][i][j], i*2);
glVertex3f((j+1)*2, wavemap[cmap][i][j+1], i*2);
glVertex3f((j+1)*2, wavemap[cmap][i+1][j+1], (i+1)*2);
}
}
glEnd();
glEnable(GL_TEXTURE_2D);
}
很遗憾,关键的算法我没看懂!!!!