#include <GL/glut.h>
#include<math.h>
#include<stdio.h>
#include<stdlib.h>
#include <iostream.h>
#include <time.h>
#define PI 3.1415926
#define GLfloat float
#define GLdouble double
#define GLint int
double c=PI/180.0;
double radius=100.0;//球半径
int w=500.0,h=500.0;//窗口的宽和高
int angleX=10,angleY=10;//角度
double oldcenterx,oldcentery,centerx,centery,centerz;
int num=1;
int fill_mode=GL_LINE;//显示面只用线表示
double step=10;
long timeStart=0;
time_t t;
int style=GL_QUAD_STRIP;//四边形带
int color;
color=1;
float theta,phir,phi,thetar,phir20;
float x,y,z;
double c80;
int i;
void drawSphere(int centerx,int centery,int centerz){
//选择当前操作的矩阵。GL_MODELVIEW为模型视图矩阵
glMatrixMode(GL_MODELVIEW);
//将当前矩阵设置为4乘4单位矩阵
glLoadIdentity();
//平移变换
glTranslated(centerx,centery,centerz);
//旋转变换从(0,0,0)到(0,1,0)逆时针方向旋转45°
glRotated(45,0,1,0);
glRotated(angleY,1,0,0);
glRotated(angleX,0,0,1);
c80=c*80;
//定义视口,前两个0为左下角坐标,w和h为视口的宽度和高度
glViewport(0,0,(GLdouble)w,(GLdouble)h);
for(phi=-90;phi<=90;phi+=step){
phir = c*phi;
phir20 = c*(phi+20);
//glPolygonMode函数用于控制多边形的显示方式。
glPolygonMode(GL_FRONT,fill_mode);//GL_FRONT表示显示模式将适用于物体的前向面(也就是物体能看到的面)
glPolygonMode(GL_BACK,fill_mode);//GL_FILL表示显示面(GL_POINT表示只显示顶点,GL_LINE表示显示线段)
//设置CCW方向为“正面”,
glFrontFace(GL_CCW);
glBegin(style);
for(theta=-180;theta<=180;theta+=step){
thetar = c*theta;
x=radius*sin(thetar)*cos(phir);
y=radius*cos(thetar)*cos(phir);
z=radius*sin(phir);
//随机分配颜色。
if(color)
glColor3f((rand()%101*1.0)/100,(rand()%101*1.0)/100,(rand()%101*1.0)/100);
glVertex3d(x,y,z);
x=radius*sin(thetar)*cos(phir20);
y=radius*cos(thetar)*cos(phir20);
z=radius*sin(phir20);
glVertex3d(x,y,z);
}
glEnd();
}
if(style==GL_TRIANGLES || style==GL_QUADS){
for(phi=-90;phi<=90;phi+=step){
phir = c*phi;
glPolygonMode(GL_FRONT,fill_mode);
glPolygonMode(GL_BACK,fill_mode);
glFrontFace(GL_CCW);
glBegin(GL_POLYGON);
for(theta=-180;theta<=180;theta+=step){
thetar = c*theta;
x=radius*sin(thetar)*cos(phir);
y=radius*cos(thetar)*cos(phir);
z=radius*sin(phir);
//随机分配颜色。
if(color)
glColor3f((rand()%101*1.0)/100,(rand()%101*1.0)/100,(rand()%101*1.0)/100);
glVertex3d(x,y,z);
}
glEnd();
}
}
glPolygonMode(GL_FRONT,fill_mode);
glPolygonMode(GL_BACK,fill_mode);
glFrontFace(GL_CCW);
glBegin(GL_TRIANGLE_FAN);//画扇形
glVertex3d(0,0,radius);
z = radius*sin(c80);
for(theta=-180;theta<=180;theta+=step){
thetar = c*theta;
x=radius*sin(thetar)*cos(c80);
y=radius*cos(thetar)*cos(c80);
if(color)
glColor3f((rand()%101*1.0)/100,(rand()%101*1.0)/100,(rand()%101*1.0)/100);
glVertex3d(x,y,z);
}
glEnd();
glBegin(GL_TRIANGLE_FAN);
glVertex3d(0,0,-radius);
z=-radius*sin(c80);
for(theta=-180.0;theta<=180.0;theta+=step){
thetar = c*theta;
x=radius*sin(thetar)*cos(c80);
y=radius*cos(thetar)*cos(c80);
if(color)
glColor3f((rand()%101*1.0)/100,(rand()%101*1.0)/100,(rand()%101*1.0)/100);
glVertex3d(x,y,z);
}
glEnd();
glFlush();//将GL命令队列中的命令发送给显卡并清空命令队列,发送完立即返回
}
int wd=10;
void submenu(int id){
switch(id){
case 1:
exit(0);
break;
case 2:
radius=radius+50.0;
break;
case 3:
if(radius>1) radius-=50;
break;
case 4:
num++;
break;
case 5:
if(num<=1)
return;
num--;
break;
case 6:
num=1;
break;
case 7:
wd++;
step=50/wd;
break;
case 8:
wd--;
step=100/wd;
break;
case 9:
step=10;
break;
case 10:
fill_mode=GL_FILL;
break;
case 11:
fill_mode=GL_LINE;
break;
case 12:
style=GL_TRIANGLES;
break;
case 13:
style=GL_TRIANGLE_STRIP;
break;
case 14:
style=GL_QUADS;
break;
case 15:
style=GL_QUAD_STRIP;
break;
case 16:
color=1;
break;
case 17:
color=0;
break;
}
glutPostRedisplay();//标记当前窗口需要重新绘制
}
void reshape(GLsizei ww,GLsizei hh){
//定义视口,前两个0为左下角坐标,w和h为视口的宽度和高度
glViewport(0,0,(GLsizei)ww,(GLsizei)hh);
glMatrixMode(GL_PROJECTION);//投影变换矩阵
glLoadIdentity();//将当前矩阵设置为4×4矩阵
glOrtho(0.0,(GLdouble)ww,0.0,(GLdouble)hh,-ww,hh);//平行投影变换,取景体为一个四棱柱
glMatrixMode(GL_MODELVIEW);//模型视图矩阵
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT);//清除颜色缓存
glFlush();
w=ww;
h=hh;
}
void init(void){
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glClearColor(0.0,0.0,0.0,1.0);
glColor3f(1.0,1.0,1.0);//先初始化,后来颜色状态量被修改了。
//time函数来获得系统时间,它的返回值为从 00:00:00 GMT, January 1, 1970 到现在所持续的秒数,然后将time_t型数据转化为(unsigned)型在传给srand函数,
srand((unsigned) time(&t));//随机数发生器的初始化函数
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT);
}
int offsetx=0,offsety=0;
void display(void){
int numOfOneLine=(int)((1.00*w)/(radius*2));//numOfOneLine=2
if(numOfOneLine<1)
numOfOneLine=1;
timeStart = glutGet(GLUT_ELAPSED_TIME);//返回两次调用glutGet(GLUT_ELAPSED_TIME)的时间间隔,单位为毫秒
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
//增加一个球或减少一个球
for(i=0;i<num;i++)
drawSphere(radius+2*(i%numOfOneLine)*radius+offsetx,h-radius-2*radius*(i/numOfOneLine)+offsety,radius);
glutSwapBuffers();//交换当前窗口使用层的缓存
printf("绘图时间:%d\n",glutGet(GLUT_ELAPSED_TIME)-timeStart);//显示绘图时间
}
/*鼠标拖动产生的事件,即,球在动*/
void mouse(int which,int state,int x,int y){
y=h-y;//h为窗口高度
centerx=x;
centery=y;
oldcenterx=x;
oldcentery=y;
glutPostRedisplay();//标记当前窗口需要重新绘制
}
void mouseMotion(int x,int y){
if(x>oldcenterx)
angleX=(angleX++)%360;
else if(x<oldcenterx)
angleX=(angleX+359)%360;
if(y>oldcentery)
angleY=(angleY++)%360;
else if(y<oldcentery)
angleY=(angleY+359)%360;
oldcenterx=x;
oldcentery=y;
glutPostRedisplay();
}
void keyPress(unsigned char key, int x, int y){
if(key=='a' || key=='A'){
if(radius<w/2 && radius<h/2)
radius+=50;
}
else if(key=='d' || key=='D'){
if(radius>5)
radius-=50;
}
if(key=='4'){
offsetx-=3;
}else if(key=='8'){
offsety+=3;
}else if(key=='2'){
offsety-=3;
}else if(key=='6'){
offsetx+=3;
}
glutPostRedisplay();
}
int main(int argc,char** argv){
/*初始化*/
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);//确定所创建窗口的显示模式(GLUT_DOUBLE 双缓存窗口。GLUT_RGB指定颜色RGBA模式)
glutInitWindowSize(w,h);//初始化窗口的大小,w为窗口的宽度,h为窗口的高度(int w=500.0,h=500.0;)
glutInitWindowPosition(0,0);//窗口的设置初始位置,左上角的坐标
/*创建窗口*/
glutCreateWindow("sphere-window");
glutCreateMenu(submenu);//创建一个新的弹出式菜单
//在当前菜单底部增加一个菜单条目.数字表示指定当选择该菜单条目时传递到菜单回调函数中的数值。
glutAddMenuEntry("变大",2);
glutAddMenuEntry("变小",3);
glutAddMenuEntry("*************",100);
glutAddMenuEntry("加上一个球",4);
glutAddMenuEntry("去掉一个球",5);
glutAddMenuEntry("只有一个球",6);
glutAddMenuEntry("*************",100);
glutAddMenuEntry("更密",7);
glutAddMenuEntry("更疏",8);
glutAddMenuEntry("还原疏密",9);
glutAddMenuEntry("*************",100);
glutAddMenuEntry("填充",10);
glutAddMenuEntry("线条",11);
glutAddMenuEntry("*************",100);
glutAddMenuEntry("三角形",12);
glutAddMenuEntry("三角形带",13);
glutAddMenuEntry("四边形",14);
glutAddMenuEntry("四边形带",15);
glutAddMenuEntry("*************",100);
glutAddMenuEntry("颜色随机",16);
glutAddMenuEntry("单色",17);
glutAddMenuEntry("退出",1);
gl
没有合适的资源?快使用搜索试试~ 我知道了~
绘制若干OpenGL基本体素(三角形、三角形带、四边形、四边形带)构成的球体
共13个文件
pdb:2个
exe:1个
dsw:1个
5星 · 超过95%的资源 需积分: 10 211 下载量 177 浏览量
2010-11-30
21:04:28
上传
评论 6
收藏 252KB RAR 举报
温馨提示
绘制若干OpenGL基本体素(三角形、三角形带、四边形、四边形带)构成的球体,注意球体绘制与球体划分的区别。 可以控制改变球的数量和球的体积,来改变基本体素的数量以及顶点的数量。 可以通过改变glPolygonMode,切换是否填充所绘制的基本体素。 利用函数glutGet(GLUT_ELAPSED_TIME)(returns the time in milliseconds since glutInit or the first invocation of the function)统计绘制时间
资源推荐
资源详情
资源评论
收起资源包目录
lab1.rar (13个子文件)
lab1
lab1.dsp 4KB
lab1.plg 2KB
lab1.opt 53KB
Debug
ss.obj 28KB
vc60.pdb 44KB
lab1.pdb 409KB
vc60.idb 33KB
lab1.ilk 261KB
lab1.pch 322KB
lab1.exe 216KB
lab1.dsw 533B
lab1.ncb 41KB
ss.c 8KB
共 13 条
- 1
zbcyx
- 粉丝: 11
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
- 5
- 6
前往页