• 【OpenGL】8字循环体算法


    今天在NEHE粒子效果的基础上写了一个8字循环体,果然算法什么的真是太恶心了。

    关于粒子效果我就不多说了,大家可以参照NEHE的教程,写得很详细,只要有心,肯定能学会。链接如下:

    http://www.owlei.com/DancingWind/

    所谓的8字循环体,就是蜜蜂跳的那种8字舞蹈,上下两个圆圈绕着转。

    因此,要实现8字循环体,首先得要实现如何画圆圈。

    其实很简单,我们先在文件顶头定义一些所需的变量。

    //圆圈的角度
    float	degree;
    //圆周率
    float	pi = 3.14159;
    //圆的半径
    int		r = 5;
    //上下圆圈的判断符
    bool	flg = true;
    

    然后在绘制图像的那个方法里面,找到如果粒子生命<0的这段逻辑,在这段逻辑里面,如果粒子生命<0,那么就将粒子满血复活,并赋予新的坐标。我们要改的就是给新生粒子赋予新坐标的这段代码。

    因为是画圆圈,已知角度、半径的情况下,就可以算出圆圈上某点的坐标,代码如下:

    particle[loop].x=sin(degree*pi/180)*r;
    particle[loop].y=cos(degree*pi/180)*r+ (flg?5.0:-5.0);
    

    这里需要注意的是,sincos这两个方法所用的参数应该是弧度。所以我们还得先将角度算成弧度,公式如下:

    弧度 = 角度*PI/180  

    而算y轴坐标的后面那段代码:

    (flg?5.0:-5.0)

    的作用是区分该圆是上圆还是下圆。

    通过以上代码,可以算是圆的坐标,那么接下来我们要写一段逻辑,来算圆的轨迹。轨迹的示意图如下表示:

    从以上示意图,我们可以得到以下逻辑:

        //步奏一
            if(degree >0 && degree <180 && flg==true)
        {
            flg = true;
        }
            //步奏二
        else if(degree ==180 && flg == true)
        {
            flg = false;
            degree = 360;
        }
            //步奏三
        else if(degree ==0 && flg == false)
        {
            flg = true;
            degree = 181;
        }
            //步奏四
        else if(degree >=360 && flg == true)
        {
            degree = 0;
        }
            
           //根据上下圆,相应的递增或递减
        if(flg)
        {
            degree += 1;
        }
        else
        {
            degree -= 1;
        }    

    最后画面画出来的结果是:

    以下是绘图部分的所有代码,是NEHE教程的基础上略有增减,希望能对你有帮助。

    int DrawGLScene(GLvoid)				
    {
    	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    	glLoadIdentity();		
    
    	for (loop=0;loop<MAX_PARTICLES;loop++)		
    	{
    		if (particle[loop].active)	
    		{
    			float x=particle[loop].x;	
    			float y=particle[loop].y ;	
    			float z=particle[loop].z+zoom;	
    
    			glColor4f(particle[loop].r,particle[loop].g,particle[loop].b,particle[loop].life);
    
    			glBegin(GL_TRIANGLE_STRIP);			
    			    glTexCoord2d(1,1); glVertex3f(x+0.5f,y+0.5f,z); 
    				glTexCoord2d(0,1); glVertex3f(x-0.5f,y+0.5f,z);
    				glTexCoord2d(1,0); glVertex3f(x+0.5f,y-0.5f,z); 
    				glTexCoord2d(0,0); glVertex3f(x-0.5f,y-0.5f,z); 
    			glEnd();								
    
    			particle[loop].x+=particle[loop].xi/(slowdown*1000);
    			particle[loop].y+=particle[loop].yi/(slowdown*1000);
    			particle[loop].z+=particle[loop].zi/(slowdown*1000);
    
    			particle[loop].xi+=particle[loop].xg;		
    			particle[loop].yi+=particle[loop].yg;		
    			particle[loop].zi+=particle[loop].zg;		
    			particle[loop].life-=particle[loop].fade;	
    
    			if (particle[loop].life<0.0f)				
    			{
    				particle[loop].life=1.0f;				
    				particle[loop].fade=float(rand()%100)/1000.0f+0.003f;
    
    				particle[loop].x=sin(degree*pi/180)*r;			
    				particle[loop].y=cos(degree*pi/180)*r+ (flg?5.0:-5.0);	
    				particle[loop].z=0.0f;				
    
    				particle[loop].xi=xspeed+float((rand()%64)-32.0f);
    				particle[loop].yi=yspeed+float((rand()%64)-30.0f);
    				particle[loop].zi=float((rand()%60)-30.0f);
    
    				int colIndex = rand()%12;
    				particle[loop].r = color[colIndex][0];
    				particle[loop].g = color[colIndex][1];
    				particle[loop].b = color[colIndex][2];
    			}
    		}
        }
    
    
    	if(degree >0 && degree <180 && flg==true)
    	{
    		flg = true;
    	}
    	else if(degree ==180 && flg == true)
    	{
    		flg = false;
    		degree = 360;
    	}
    	else if(degree ==0 && flg == false)
    	{
    		flg = true;
    		degree = 181;
    	}
    	else if(degree >=360 && flg == true)
    	{
    		degree = 0;
    	}
    
    	if(flg)
    	{
    		degree += 1;
    	}
    	else
    	{
    		degree -= 1;
    	}
    
    
    	return TRUE;											
    }
    

      

  • 相关阅读:
    洛谷P2504 [HAOI2006]聪明的猴子
    洛谷P1516 青蛙的约会
    洛谷P1991 无线通讯网
    洛谷P1265 公路修建
    可展开的列表组件
    网格视图(GridView)功能和用法
    自动完成文本框的功能和用法
    扩展BaseAdapter实现不存储列表项的ListView
    使用SimpleAdapter创建ListView
    实例:基于ListActivity实现列表
  • 原文地址:https://www.cnblogs.com/nonkicat/p/2989447.html
Copyright © 2020-2023  润新知