opengl 球

// Study001.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include <malloc.h>
#include <math.h>

#include "glut.h"

#define SOLID 3000
#define WIRE  3001

#define pi 3.1415926

typedef 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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值