#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代表窗口中视口的左下角坐标,w,h代表像素
void ChangeSize(int w,int h)
{
glViewport(0, 0, w, h);
}
//球心坐标为(x,y,z),球的半径为radius,M,N分别表示球体的横纵向被分成多少份
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();
//将在后台缓冲区进行渲染,然后在结束时交换到前台
//球心坐标为(x,y,z),球的半径为radius,M,N分别表示球体的横纵向被分成多少份
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;
}