飘动的旗帜:
要使旗帜(即要贴的纹理)达到飘动的效果,可把纹理分成很多微小的部分,且纹理要贴的位置发生变化.下面的例子是把纹理分成64个小单位,按序贴在目标位置,并可改变目标位置,以达到飘动效果,此处是正弦,且Z是X的正弦函数,Y轴固定为0或1.
下图中,图1表示某时刻纹理贴的位置,图2表示下一时刻纹理贴的位置,可看到x不变,但y值发生了变化.即可产生动态效果.
显示的代码如下:
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;
}