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)替换,则显示效果如下:
  

           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 1
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 1

打赏作者

小树林后面

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值