《OpenGL编程指南》示例笔记(2)--独立地移动光源

//=====================================================================
//TITLE:
// 《OpenGL编程指南》示例笔记(2)--独立地移动光源
//AUTHOR:
// norains
//DATE:
// Monday 21-June-2010
//Environment:
// Windows XP
//=====================================================================

示例概述

例名:独立地移动光源

序号:5-6

页码:P135

源代码:

#include ".//glut//glut.h" #include "windows.h" static int spin = 0; void Init() { glClearColor(0.0, 0.0, 0.0, 0.0); glShadeModel(GL_SMOOTH); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_DEPTH_TEST); } void Display() { GLfloat position[] = {0.0, 0.0, 1.5, 1.0}; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glTranslatef(0.0, 0.0, -5.0); glPushMatrix(); glRotated((GLdouble)spin, 1.0, 0.0, 0.0); glLightfv(GL_LIGHT0,GL_POSITION,position); glTranslated(0.0, 0.0, 1.5); glDisable(GL_LIGHTING); glutWireCube(0.1); glEnable(GL_LIGHTING); glPopMatrix(); glutSolidTorus(0.275, 0.85, 8, 15); glPopMatrix(); glFlush(); } void Reshape(int w, int h) { glViewport(0,0,(GLsizei)w,(GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(40.0, (GLfloat)w/(GLfloat)h, 1.0, 20.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void Mouse(int button,int status,int x,int y) { switch(button) { case GLUT_LEFT_BUTTON: { if(status == GLUT_DOWN) { spin = (spin + 30) % 360; glutPostRedisplay(); } break; } default: break; } } int main(int argc,char **argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(500,500); glutInitWindowPosition(200,200); glutCreateWindow(argv[0]); Init(); glutDisplayFunc(Display); glutMouseFunc(Mouse); glutReshapeFunc(Reshape); glutMainLoop(); return 0; }

程序运行后的图像确实有点丑:


  不知道为啥,源代码特别不喜欢很圆的圆,莫非是作者的机器配置不够?在做实验之前,还是老样子,将圆变得圆滑点。我们将glutSolidTorus的最后一个形参的数值更改为60,即:glutSolidTorus(0.275, 0.85, 8, 60);
  
  这时候程序跑起来的圆环就圆滑多了:
  
  
  
  
  点击两下鼠标,移动一下光源,看看效果:
  
  
  呵呵,有点像手镯。
  
  
  
  不过,原程序的渐进梯度太广了,只是点击几次就绕了一圈。其实可以更改代码中的spin = (spin + 30) % 360这句。我们将30改成5,那么渐进的梯度就小了。
  
  如图所示:
  
  
  光源移动到了之前原代码没有能到达的区域。
  
  
  
  不过,用鼠标移动光源实在没啥意思,不如让程序自动来移动光源吧!
  
  我们先定义一个Idle函数:
void Idle() { spin = (spin + 5) % 360; glutPostRedisplay(); Sleep(20); }
  
  然后在glutMainLoop之前添加这么一段代码:
  glutIdleFunc(Idle);
  
  那么,我们现在的光源就可以自动移动啦。只不过,我所用的电脑的显卡可能性能不是很好,以代码所执行的速度,有破碎的现象:
  
  
  
  
  其实我们也可以用5.1示例中的圆球,也能测试到不一样的光源效果。我们将代码中的glutSolidTorus(0.275, 0.85, 8, 60)以glutSolidSphere(1.0, 300, 16)替换,则显示效果如下:
  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值