OpenGL画圆_skybeauty_新浪博客

//本类主要是用opengl画圆,并让圆运动

#include

#include

#ifdef __APPLE__

#include

#else

#define FREEGLUT_STATIC

#endif


//#define M_PI 3.14159

GLBatch triangleBatch;

GLShaderManager shaderManager;

GLfloat xxx = -0.9;

GLfloat yyy = 0;

GLfloat zzz = 0.0f;

GLfloat xStep =0.1f;

GLfloat yStep = 0.1f;

GLfloat zStep = 0.1f;

GLfloat r = 0.1;

GLfloat XM = 50;

GLfloat YM = 50;

GLfloat xFlag =1,yFlag =1,zFlag =1,rFlag =1;;

int time = 1000;


//窗口大小改变时接受新的宽度和高度,其中0,0代表窗口中视口的左下角坐标,wh代表像素

void ChangeSize(int w,int h)

{

   glViewport(0, 0, w, h);

}


//球心坐标为(xyz),球的半径为radiusMN分别表示球体的横纵向被分成多少份

void drawSphere(GLfloat xx, GLfloat yy, GLfloat zz, GLfloat radius, GLfloat M, GLfloat N)

{

   float step_z = M_PI/M;

   float step_xy = 2*M_PI/N;

   float x[4],y[4],z[4];

    

   float angle_z = 0.0;

   float angle_xy = 0.0;

   int i=0, j=0;

    glBegin(GL_QUADS);

   for(i=0; i

    {

        angle_z = i * step_z;

        

       for(j=0; j

        {

            angle_xy = j * step_xy;

            

            x[0] = radius * sin(angle_z) * cos(angle_xy);

            y[0] = radius * sin(angle_z) * sin(angle_xy);

            z[0] = radius * cos(angle_z);

            

            x[1] = radius * sin(angle_z + step_z) * cos(angle_xy);

            y[1] = radius * sin(angle_z + step_z) * sin(angle_xy);

            z[1] = radius * cos(angle_z + step_z);

            

            x[2] = radius*sin(angle_z + step_z)*cos(angle_xy + step_xy);

            y[2] = radius*sin(angle_z + step_z)*sin(angle_xy + step_xy);

            z[2] = radius*cos(angle_z + step_z);

            

            x[3] = radius * sin(angle_z) * cos(angle_xy + step_xy);

            y[3] = radius * sin(angle_z) * sin(angle_xy + step_xy);

            z[3] = radius * cos(angle_z);  

            

           for(int k=0; k<<span style="font-variant-ligatures: no-common-ligatures; color: #272ad8">4; k++)  

            {  

               glVertex3f(xx+x[k], yy+y[k],zz+z[k]);  

            }  

        }  

    }  

   glEnd();  

}



 

void drawColorSphere(float r, int segs) {

   int i, j;

   float x, y, z, z1, z2, R, R1, R2;

    

    // Top cap: a triangle fan

    glBegin(GL_TRIANGLE_FAN);

    glNormal3f(0,0,1);

   glColor3f(0.5,0.5,1);

   glVertex3f(0,0,r);

    z = cos(M_PI/segs);

    R = sin(M_PI/segs);

   for(i = 0; i <= 2*segs; i++) {

        x = R*cos(i*2.0*M_PI/(2*segs));

        y = R*sin(i*2.0*M_PI/(2*segs));

       glNormal3f(x, y, z);

       glColor3f(0.5*(x+1), 0.5*(y+1), 0.5*(z+1));

       glVertex3f(r*x, r*y, r*z);

    }

   glEnd();

    

    // Height segments: each a triangle strip

   for(j = 1; j < segs-1; j++) {

        z1 = cos(j*M_PI/segs);

        R1 = sin(j*M_PI/segs);

        z2 = cos((j+1)*M_PI/segs);

        R2 = sin((j+1)*M_PI/segs);

        glBegin(GL_TRIANGLE_STRIP);

       for(i = 0; i <= 2*segs; i++) {

            x = R1*cos(i*2.0*M_PI/(2*segs));

            y = R1*sin(i*2.0*M_PI/(2*segs));

           glNormal3f(x, y, z1);

           glColor3f(0.5*(x+1), 0.5*(y+1), 0.5*(z1+1));

           glVertex3f(r*x, r*y, r*z1);

            x = R2*cos(i*2.0*M_PI/(2*segs));

            y = R2*sin(i*2.0*M_PI/(2*segs));

           glNormal3f(x, y, z2);

           glColor3f(0.5*(x+1), 0.5*(y+1), 0.5*(z2+1));

           glVertex3f(r*x, r*y, r*z2);

        }

       glEnd();

    }

    

    // Bottom cap: a triangle fan

    glBegin(GL_TRIANGLE_FAN);

   glNormal3f(0,0,-1);

   glColor3f(0.5,0.5,0);

   glVertex3f(0,0,-r);

    z = -cos(M_PI/segs);

    R = sin(M_PI/segs);

   for(i = 2*segs; i >= 0; i--) {

        x = R*cos(i*2.0*M_PI/(2*segs));

        y = R*sin(i*2.0*M_PI/(2*segs));

       glNormal3f(x, y, z);

       glColor3f(0.5*(x+1), 0.5*(y+1), 0.5*(z+1));

       glVertex3f(r*x, r*y, r*z);

    }

   glEnd();

}



//为程序作一次性的设置

void SetupRC()

{

    //设置背影颜色

    glClearColor(1.0f, 1.0f, 0.0f, 1.0f);

    //初始化着色管理器

    shaderManager.InitializeStockShaders();

    //设置三角形,其中数组vVert包含所有3个顶点的x,y,笛卡尔坐标对。

   GLfloat vVerts[] = {

        -0.5f,0.0f,0.0f,

        0.5f,0.0f,0.0f,

        -0.5f,0.5f,0.0f,

        0.5f,0.5f,0.0f,

    };

       //批次处理

    triangleBatch.Begin(GL_QUADS,4);

    triangleBatch.CopyVertexData3f(vVerts);

    triangleBatch.End();

    

}


//开始渲染

void RenderScene(void)

{

    //清除一个或一组特定的缓冲区

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

    //设置一组浮点数来表示红色

   GLfloat vRed[] = {0.0f,0.0f,1.0f,1.0f};

    //传递到存储着色器,即GLT_SHADER_IDENTITY着色器,这个着色器只是使用指定颜色以默认笛卡尔坐标第在屏幕上渲染几何图形

    shaderManager.UseStockShader(GLT_SHADER_IDENTITY,vRed);

    //提交着色器

//    triangleBatch.Draw();

    //将在后台缓冲区进行渲染,然后在结束时交换到前台

    

    //球心坐标为(xyz),球的半径为radiusMN分别表示球体的横纵向被分成多少份

   drawSphere(xxx,yyy, zzz, r, XM, YM);

    glutSwapBuffers();

}


GLfloat Handler(GLfloat value,GLfloat tempFlag)

{

   GLfloat flag = tempFlag ;

   if(value>=1.0f)

    {

        flag = -1;

    }

   else if (value<=-1.0f)

    {

        flag =1;

    }

//    printf("value=%f\n,tempFlag=%f\n,flag=%f\n",value,tempFlag,flag);


   return flag;

}


void TimerFunc(int value)

{

    xxx += xStep*xFlag;

    yyy += yStep*yFlag;

    zzz += zStep*zFlag;

    r += zStep*rFlag;

    

    xFlag = Handler(xxx,xFlag);

    yFlag = Handler(yyy,yFlag);

    zFlag = Handler(zzz,zFlag);

   rFlag = Handler(r,rFlag);

    

    

    

   if(time<=0)

    {

       time +=value;

    }

   else

    {

       time -=value;

    }

   while (time<=0) {

       time +=value;

    }

    printf("value=%d\n,time=%d\n",value,time);

    glutPostRedisplay();

    glutTimerFunc(time, TimerFunc, 100);

}


int main(int argc,char* argv[])

{

    //设置当前工作目录,针对MAC OS X

    gltSetWorkingDirectory(argv[0]);

    //初始化GLUT

   glutInit(&argc, argv);

   

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);

    //GLUT窗口大小,标题窗口

    glutInitWindowSize(960, 640);

    glutCreateWindow("helloWorld");

    //注册回调函数

    glutReshapeFunc(ChangeSize);

    glutDisplayFunc(RenderScene);

    glutTimerFunc(1000, TimerFunc, 1);

    //驱动程序的初始化中没有出现任何问题。

   GLenum err = glewInit();

   if (GLEW_OK != err) {

       fprintf(stderr, "glew error:%s\n",glewGetErrorString(err));

       return 1;

    }

    

    //调用SetupRC

   SetupRC();

    glutMainLoop();

   return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值