// 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;
}
opengl 球
最新推荐文章于 2019-11-17 00:27:04 发布