opengl 球

来源:互联网 发布:黑暗的中世纪 知乎 编辑:程序博客网 时间:2024/04/27 20:29
// Study001.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <malloc.h>#include <math.h>#include "glut.h"#define SOLID 3000#define WIRE  3001#define pi 3.1415926typedef int SPHERE_MODE;typedef struct Point3f{GLfloat x;GLfloat y;GLfloat z;}point;void init (void){// 清除颜色缓冲区glClearColor (0.0, 0.0, 0.0, 0.0);// 它给深度缓冲指定了一个初始值,缓冲中的每个像素的深度值都是这个, // 比如1,这个时候你往里面画一个物体, // 由于物体的每个像素的深度值都小于等于1, 所以整个物体都被显示了出来。 // 如果初始值指定为0, 物体的每个像素的深度值都大于等于0, 所以整个物体都不可见。 // 如果初始值指定为0.5, 那么物体就只有深度小于0.5的那部分才是可见的glClearDepth(1);// 设置着色模式: 光滑着色,独立的处理图元中各个顶点的颜色。// 对于线段图元,线段上各点的颜色将根据两个顶点的颜色通过差值得到。// 对于多边形图元,多边形内部区域的颜色将根据所有顶点的颜色差值得到。glShadeModel(GL_SMOOTH);}void reshape(int w, int h){// 视口的左下角,宽度和高度。glViewport (0, 0, (GLsizei) w, (GLsizei) h);// 投影矩阵glMatrixMode(GL_PROJECTION);glLoadIdentity();// 将当前的可视空间设置为正投影空间glOrtho(0.0, 500, 0.0, 500, -500, 500);// 模型视景矩阵glMatrixMode(GL_MODELVIEW);glLoadIdentity();}void drawSlice(point &p1, point &p2, SPHERE_MODE mode){switch(mode){case SOLID:glBegin(GL_QUADS);break;case WIRE:glBegin(GL_LINE_LOOP);break;}glColor3f(1, 1, 1);glVertex3f(p1.x, p1.y, p1.z);glVertex3f(p2.x, p2.y, p2.z);glEnd();}int getPoint(GLfloat radius, GLfloat jin, GLfloat wei, point & p){p.x = radius * sin(wei * pi / 180.0) * sin(jin * pi / 180.0);p.y = radius * sin(wei * pi / 180.0) * cos(jin * pi / 180.0);p.z = radius * cos(wei * pi / 180.0);return 1;}point* getPointMatrix(GLfloat radius, GLint slicesJin, GLint slicesWei){int i = 0, j = 0, jin = slicesJin, wei = slicesWei + 1;float a = 0.f, b = 0.f;float jinStep = 360.f / slicesJin;float weiStep = 180.f / slicesWei;int length = jin * wei;point * matrix;matrix=(point *)malloc(length * sizeof(point));if (!matrix) return NULL;for(a=0.0, i=0; i<jin; i++, a += jinStep){for(b=0.0, j=0; j<wei; j++, b += weiStep)  {getPoint(radius, a, b, matrix[j * jin + i]); }}return matrix;}int drawSphere(GLfloat radius, GLint slicesJin, GLint slicesWei, SPHERE_MODE mode){int i = 0, j = 0, jin = slicesJin, wei = slicesWei;point * mx;// 参数方程mx = getPointMatrix(radius, slicesJin, slicesWei);if(!mx)return 0;for(i=0; i<wei; i++){for(j=0; j<jin; j++){drawSlice(mx[i * slicesJin + j], mx[(i+1) * slicesWei + j], mode);}for (j=0; j<jin; j++){int nStart = i * slicesJin + j;int nStop = i * slicesWei + j + 1;if (j == jin - 1)nStop = i * slicesJin;drawSlice(mx[nStart], mx[nStop], mode);}}free(mx);return 1;}void myDisplay(void){// 模型视景矩阵glMatrixMode(GL_MODELVIEW);glLoadIdentity();// 清除颜色缓冲以及深度缓冲glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// 移动当前绘图原点glTranslated(250, 250, 0);// 旋转glRotated(0, 1, 0, 0);glRotated(0, 0, 1, 0);glRotated(0, 0, 0, 1);// 颜色glColor3f(1.0, 1.0, 1.0);// 球drawSphere(200, 30, 30, WIRE); // 强制刷新缓冲,保证绘图命令将被执行glFlush();}int _tmain(int argc, _TCHAR* argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH);glutInitWindowPosition(100, 100);glutInitWindowSize(600, 600);glutCreateWindow("第一个OpenGL程序");init();// 窗口大小发生改变的时候会调用该函数glutReshapeFunc(reshape);glutDisplayFunc(&myDisplay);glutMainLoop();return 0;}

0 0