oepngl飘动的旗帜(正弦)

飘动的旗帜:

要使旗帜(即要贴的纹理)达到飘动的效果,可把纹理分成很多微小的部分,且纹理要贴的位置发生变化.下面的例子是把纹理分成64个小单位,按序贴在目标位置,并可改变目标位置,以达到飘动效果,此处是正弦,ZX的正弦函数,Y轴固定为01.

下图中,1表示某时刻纹理贴的位置,2表示下一时刻纹理贴的位置,可看到x不变,y值发生了变化.即可产生动态效果.

 

 oepngl飘动的旗帜(正弦)_第1张图片

显示的代码如下:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  // 清除屏幕和深度缓存

    glLoadIdentity();                             // 重置当前的模型观察矩阵

 

    glBindTexture( GL_TEXTURE_2D, g_uTexture[ 0]);//选择纹理

 

    /***************************************/

    glTranslatef( 0.0f,  0.0f,  -5.0f);

   

    static int sit= 0;//计数器,每次加,以记录下一次要纹理贴的位置,产生动态效果.

    int k, i;

    double dLeng= 2, dSin= 4;

 

    for (   i= 0; i< NUM_XY; ++i)

    {

       k= i;

       k += sit;//k

      

 

       glBegin( GL_QUADS );//四边形,贴图(纹理)

 

       //正弦(纹理坐标不变,但纹理贴的位置发生变化,即产生飘动的效果;如果纹理坐标变化,而贴的位置不变,则产生流动的效果)

       glTexCoord2f( i/ (NUM_XY* 1.0), 0.0f); glVertex3f( dLeng/ (NUM_XY* 1.0) * (i - NUM_XY/ 2),    -dLeng,    sin(dSin*  dLeng/ (NUM_XY* 1.0) * (k - NUM_XY/ 2)));//左下

       glTexCoord2f( (i + 1)/ (NUM_XY* 1.0),  0.0f); glVertex3f(  dLeng/ (NUM_XY* 1.0) * (i - NUM_XY/ 2 + 1),   -dLeng, sin( dSin*dLeng/ (NUM_XY* 1.0) * (k - NUM_XY/ 2 + 1)));//右下

       glTexCoord2f( (i + 1)/ (NUM_XY* 1.0),  1.0f); glVertex3f(  dLeng/ (NUM_XY* 1.0) * (i - NUM_XY/ 2 + 1),   dLeng,    sin(dSin* dLeng/ (NUM_XY* 1.0) * (k - NUM_XY/ 2 + 1)));//右上

       glTexCoord2f( i/ (NUM_XY* 1.0), 1.0f); glVertex3f( dLeng/ (NUM_XY* 1.0) * (i - NUM_XY/ 2),    dLeng,    sin( dSin* dLeng/ (NUM_XY* 1.0) * (k - NUM_XY/ 2)));//左上

      

       glEnd();

 

 

    }

 

    static int iDelay= 0;//延迟,以防旗帜飘动过快

    if ( ++iDelay > 4)

    {

       iDelay= 0;

       ++sit;

    }

 

    if ( sit >= 10000)

    {

       sit= 0;

    }

 

 

你可能感兴趣的:(oepngl飘动的旗帜(正弦))