注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

独立观察员·网易

分享万岁

 
 
 

日志

 
 

OpenGl之旋转棱锥  

2013-11-08 23:21:03|  分类: OpenGL |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

杭州电子科技大学2013 OpenGl第一次作业(自选题目)

——旋转棱锥

——独立观察员 2013.11

 (使用Dev C++ 编译运行)

初始界面(旋转):

 

按"w"向后翻转:

(可看到反光)

 

按"s"向前翻转:

 

按"a"增加分割:

 

按"d"减少分割:

 

 

代码:

#include <GL/glut.h>

 

static int slices = 10;

static int stacks = 10;

static int angle = -120;

 

void display(void)

{

/* clear all pixels */

glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除;GL_COLOR_BUFFER_BIT表示清除颜色;

 

const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;

const double a = t*90.0;

 

glPushMatrix();//实心锥;

glColor3f(0,1,0);

glTranslated(0,0,-4); //平移;

glRotated(angle,1,0,0); //绕x轴旋转;

glRotated(a,0,0,1);

glutSolidCone(1,1,slices,stacks);

glRotated(180,1,0,0);

glutSolidCone(1,1,slices,stacks);

glPopMatrix();

 

/* don't wait!

* start processing buffered OpenGL routines

*/

glutSwapBuffers(); //双缓冲使用这一句;

}

 

//const GLfloat light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };

//const GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };

//const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };

const GLfloat light_position[] = { 5.0f, 5.0f, 4.0f, 0.0f };

 

//const GLfloat mat_ambient[] = { 1.0f, 0.0f, 0.0f, 1.0f }; //材料环境颜色;

//const GLfloat mat_diffuse[] = { 0.0f, 0.8f, 0.8f, 1.0f }; //散射颜色;

const GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f }; //镜面颜色;

const GLfloat high_shininess[] = { 100.0f }; //镜面指数;

 

void init (void)

{

glClearColor (0.3, 0.3, 0.3, 0.6);

 

glEnable(GL_CULL_FACE);

glCullFace(GL_BACK); //剔除背面;

 

 

glEnable(GL_DEPTH_TEST); //深度测试;

glDepthFunc(GL_ALWAYS);

 

glShadeModel(GL_FLAT);

 

glEnable(GL_LIGHT0);

glEnable(GL_NORMALIZE);

glEnable(GL_COLOR_MATERIAL);

glEnable(GL_LIGHTING);

 

//glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);

// glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);

// glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);

glLightfv(GL_LIGHT0, GL_POSITION, light_position);

 

//glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);

 

//glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);

// glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);

glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);

glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);

 

 

/* initialize viewing values

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0); */

}

 

void reshape(int width, int height)

{

const float ar = (float) width / (float) height;

 

glViewport(0, 0, width, height);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluPerspective(50,ar, 0.0, 50.0); //通过第一个参数可改变物体大小;

 

glMatrixMode(GL_MODELVIEW);

glLoadIdentity() ;

}

 

static void key(unsigned char key, int x, int y)

{

switch (key)

{

case 27 : //ESC键;

case 'q':

exit(0);

break;

 

case 'a':

slices++;

stacks++;

break;

 

case 'd':

if (slices>2 && stacks>2){

slices--;

stacks--;

}

break;

 

case 'w':

angle = (angle-15)%360;

break;

 

case 's':

angle = (angle+15)%360;

break;

}

 

glutPostRedisplay();

}

 

int main(int argc, char** argv)

{

glutInit(&argc, argv); //对GLUT进行初始化;

glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

glutInitWindowSize (600, 500);

glutInitWindowPosition (400, 150);

glutCreateWindow ("OpenGl 魏刘宏 11054126");

init();//初始化;

glutDisplayFunc(display);

glutReshapeFunc(reshape);

glutIdleFunc(display);

glutKeyboardFunc(key);

glutMainLoop(); //需要调用glutMainLoop才能看到窗口;

return 0; /* ANSI C requires main to return int. */

}

 

  评论这张
 
阅读(102)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018