您的位置:首页 > 运维架构

opengl圆环的绘制

2013-08-19 17:20 253 查看
#include "stdafx.h"

#include <GL/glut.h>  

#include <stdio.h>  

#include <math.h>  

#include <stdlib.h>  

  

#define PI_ 3.14159265358979323846  

  

GLuint theTorus;  

  

/* Draw a torus */  

static void torus(int numc, int numt)  

{  

   int i, j, k;  

   double s, t, x, y, z, twopi;  

  

   twopi = 2 * PI_;  

   for (i = 0; i < numc; i++) {  

      glBegin(GL_QUAD_STRIP);  

      for (j = 0; j <= numt; j++) {  

         for (k = 1; k >= 0; k--) {  

            s = (i + k) % numc + 0.5;  

            t = j % numt;  

  

            x = (1+.1*cos(s*twopi/numc))*cos(t*twopi/numt);  

            y = (1+.1*cos(s*twopi/numc))*sin(t*twopi/numt);//圆环的公式  

            z = .1 * sin(s * twopi / numc);  

            glVertex3f(x, y, z);  

         }  

      }  

      glEnd();  

   }  

}  

  

/* Create display list with Torus and initialize state */  

static void init(void)  

{  

   theTorus = glGenLists (1);  //建立显示列表空间

   glNewList(theTorus, GL_COMPILE);  //创建一个显示列表

   torus(8, 25);  

   glEndList();  //现实列表完成

  

   glShadeModel(GL_FLAT);  //设置着色模式,GL_FLAT表示采用恒定着色,使用图元中某个顶点的颜色来渲染整个图元。

   glClearColor(0.0, 0.0, 0.0, 0.0);  

}  

  

/* Clear window and draw torus */  

void display(void)  

{  

   glClear(GL_COLOR_BUFFER_BIT);  

   glColor3f (1.0, 0.0, 0.0);  

   glCallList(theTorus);  //执行显示列表

   glFlush();  

}  

  

/* Handle window resize */  

void reshape(int w, int h)  

{  

   glViewport(0, 0, (GLsizei) w, (GLsizei) h);  

   glMatrixMode(GL_PROJECTION);  

   glLoadIdentity();  

   gluPerspective(30, (GLfloat) w/(GLfloat) h, 1.0, 100.0);  //透视投影

   glMatrixMode(GL_MODELVIEW);  

   glLoadIdentity();  

   gluLookAt(0, 0, 10, 0, 0, 0, 0, 1, 0);  

}  

  

/* Rotate about x-axis when "yx" typed; rotate about y-axis 

   when "y" typed; "i" returns torus to original view */  

void keyboard(unsigned char key, int x, int y)  

{  

   switch (key) {  

   case 'x':  

   case 'X':  

      glRotatef(30.,1.0,0.0,0.0);  

      glutPostRedisplay();  //重绘窗口

      break;  

   case 'y':  

   case 'Y':  

      glRotatef(30.,0.0,1.0,0.0);  

      glutPostRedisplay();  

      break;  

   case 'i':  

   case 'I':  

      glLoadIdentity();  

      gluLookAt(0, 0, 10, 0, 0, 0, 0, 1, 0);  

      glutPostRedisplay();  

      break;  

   case 27:  

      exit(0);  

      break;  

   }  

}  

  

int main(int argc, char **argv)  

{  

   glutInitWindowSize(200, 200);  

   glutInit(&argc, argv);  

   glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);  

   glutCreateWindow("yuanhuan");  

   init();  

   glutReshapeFunc(reshape);  

   glutKeyboardFunc(keyboard);  

   glutDisplayFunc(display);  

   glutMainLoop();  

   return 0;  
}  

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  OpenGL 图形 3D