1.绘制带有光照效果的场景;
2.场景包含3个茶壶,通过键盘1,2,3可以分别选中三个茶壶,然后用鼠标对每个茶壶进行分别的旋转;
3.使用点光源,点光源为白色,以白色的球体表示;
4.使用3个不同的点光源

i.      光源1的坐标设置在世界坐标系中,并围绕着三个茶壶的中心进行圆周运动;

ii.     光源2 的坐标 设置在观察坐标系,不发生变化;

iii.    光源3的坐标设置在茶壶1的物体坐标系中,当茶壶1被选中进行旋转时,光源3要跟随茶壶1 做相同的旋转;

  1. #include <windows.h>
  2. #include <GL/glut.h>
  3. #include <GL/glext.h>
  4. #include <GL/SOIL.h>
  5. #include <cstdio>
  6. GLfloat r1 = 0.0f;
  7. GLfloat r2 = 0.0f;
  8. GLfloat r3 = 0.0f;
  9. GLfloat rlight1 = 0.0f;
  10. GLfloat mat_specular[] = {1.0f,1.0f,1.0f,1.0f};
  11. GLfloat low_shiniess[] = {5.0}; // 镜面反射
  12. GLfloat material1[] = {1.0f,0.0f,0.0f,1.0f};
  13. GLfloat material2[] = {0.0f,1.0f,0.0f,1.0f};
  14. GLfloat material3[] = {0.0f,0.0f,1.0f,1.0f};
  15. GLfloat light_position1[] = {0.0f,0.0f,4.0f,1.0f};
  16. GLfloat light_diffuse1[] = {1.0f,1.0f,1.0f,1.0f}; //白光
  17. GLfloat light_position2[] = {1.0f,-2.0f,1.0f,1.0f}; //红光
  18. GLfloat light_diffuse2[] = {1.0f,0.0f,0.0f,1.0f};
  19. GLfloat light_position3[] = {0.0f,0.0f,2.0f,1.0f};
  20. GLfloat light_diffuse3[] = {0.0f,0.0f,1.0f,1.0f};// 蓝光
  21. GLfloat light_specular3[] = {1.0f,1.0f,1.0f,1.0f};
  22. //漫射光
  23. void init ()
  24. {
  25. glShadeModel(GL_SMOOTH);
  26. glClearColor(0.0,0.0,0.0,0.0);
  27. glClearDepth(1.0);
  28. glEnable(GL_DEPTH_TEST);
  29. glDepthFunc(GL_LEQUAL);
  30. glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
  31. glEnable(GL_LIGHTING);
  32. //glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
  33. //glMaterialfv(GL_FRONT,GL_SHININESS,low_shiniess);
  34. }
  35. void reshape(int w,int h)
  36. {
  37. glViewport(0,0,(GLsizei)w,(GLsizei)h);
  38. glMatrixMode(GL_PROJECTION);
  39. glLoadIdentity();
  40. gluPerspective(45.0,(GLfloat)w/(GLfloat)h,0.1,100.0);
  41. glMatrixMode(GL_MODELVIEW);
  42. glLoadIdentity();
  43. gluLookAt(0.0f,0.0f,10.0f,
  44. 0.0f,0.0f,0.0f,
  45. 0.0f,1.0f,0.0f);
  46. }
  47. void display()
  48. {
  49. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  50. glPushMatrix();
  51. glRotated(rlight1,0.0f,1.0f,0.0f);
  52. glLightfv(GL_LIGHT0,GL_POSITION,light_position1);
  53. glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse1); //世界坐标系光源
  54. glPopMatrix();
  55. glPushMatrix();
  56. glDisable(GL_LIGHTING);
  57. glRotated(rlight1,0.0f,1.0f,0.0f);
  58. glTranslatef(0.0f,0.0f,4.0f);
  59. glColor3f(1.0f,1.0f,1.0f); //光源1 白光 的小球
  60. glutSolidSphere(0.05,10,10);
  61. glEnable(GL_LIGHTING);
  62. glPopMatrix();
  63. glLightfv(GL_LIGHT1,GL_POSITION,light_position2);
  64. glLightfv(GL_LIGHT1,GL_DIFFUSE,light_diffuse2); //观察坐标系光源
  65. glPushMatrix();
  66. glDisable(GL_LIGHTING);
  67. glTranslatef(1.0f,-2.0f,1.0f); //光源2 红光的小球
  68. glColor3f(1.0f,0.0f,0.0f);
  69. glutSolidSphere(0.05,10,10);
  70. glEnable(GL_LIGHTING);
  71. glPopMatrix();
  72. //teapot1
  73. glPushMatrix();
  74. glTranslatef(0.0f,2.0f,0.0f);
  75. glRotatef(r1,0.0f,1.0f,0.0f);
  76. //glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,material1);
  77. glLightfv(GL_LIGHT2,GL_POSITION,light_position3);
  78. glLightfv(GL_LIGHT2,GL_DIFFUSE,light_diffuse3);
  79. glLightfv(GL_LIGHT2,GL_SPECULAR,light_specular3); //
  80. glLightf(GL_LIGHT2,GL_SPOT_CUTOFF,45.0f);
  81. glPushMatrix();
  82. glDisable(GL_LIGHTING);
  83. glTranslated(0.0f,0.0f,2.0f);
  84. glRotatef(r1,0.0f,1.0f,0.0f);
  85. glColor3f(0.0f,0.0f,1.0f); //蓝色光源的小球
  86. glutSolidSphere(0.05,10,10);
  87. glEnable(GL_LIGHTING);
  88. glPopMatrix();
  89. glutSolidTeapot(1.0f);
  90. glPopMatrix();
  91. //teapot2
  92. glPushMatrix();
  93. glTranslatef(-2.5f,-1.0f,0.0f);
  94. glRotatef(r2,1.0f,0.0f,0.0f);
  95. //glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,material2);
  96. //glColor3f(1.0f,0.0f,0.0f);
  97. glutSolidTeapot(1.0f);
  98. glPopMatrix();
  99. //teapot3
  100. glPushMatrix();
  101. glTranslatef(2.5f,-1.0f,0.0f);
  102. glRotatef(r3,0.0f,0.0f,1.0f);
  103. //glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,material3);
  104. //glColor3f(1.0f,1.0f,0.0f);
  105. glutSolidTeapot(1.0f);
  106. glPopMatrix();
  107. glFlush();
  108. }
  109. void mouse_move1(int x,int y)
  110. {
  111. r1+=10.0f;
  112. glutPostRedisplay();
  113. }
  114. void mouse_move2(int x,int y)
  115. {
  116. r2+=10.0f;
  117. glutPostRedisplay();
  118. }
  119. void mouse_move3(int x,int y)
  120. {
  121. r3+=10.0f;
  122. glutPostRedisplay();
  123. }
  124. void rotate1()
  125. {
  126. rlight1+=1.0f;
  127. if(rlight1>360.0)
  128. rlight1 = rlight1-360;
  129. glutPostRedisplay();
  130. }
  131. void keyboard(unsigned char key,int x,int y)
  132. {
  133. switch(key)
  134. {
  135. case '1':
  136. glutMotionFunc(mouse_move1);
  137. break;
  138. case '2':
  139. glutMotionFunc(mouse_move2);
  140. break;
  141. case '3':
  142. glutMotionFunc(mouse_move3);
  143. break;
  144. case 'r':
  145. glutIdleFunc(rotate1);
  146. break;
  147. case 's':
  148. glutIdleFunc(NULL);
  149. break;
  150. case 'a': // light1
  151. glDisable(GL_LIGHT1);
  152. glDisable(GL_LIGHT2);
  153. glEnable(GL_LIGHT0);
  154. glutPostRedisplay();
  155. break;
  156. case 'b': //light2
  157. glDisable(GL_LIGHT0);
  158. glDisable(GL_LIGHT2);
  159. glEnable(GL_LIGHT1);
  160. glutPostRedisplay();
  161. break;
  162. case 'c': //light2
  163. glDisable(GL_LIGHT1);
  164. glDisable(GL_LIGHT0);
  165. glEnable(GL_LIGHT2);
  166. glutPostRedisplay();
  167. break;
  168. }
  169. }
  170. /*void mouse(int button,int state,int x,int y)
  171. {
  172. switch(button){
  173. case GLUT_LEFT_BUTTON:
  174. if(state == GLUT_DOWN)
  175. break;
  176. case GLUT_RIGHT_BUTTON:
  177. if(state == GLUT_DOWN)
  178. break;
  179. }
  180. }*/
  181. int main(int argc,char **argv)
  182. {
  183. printf("keyboard 1,2,3 choose the teapot mousemove control\n");
  184. printf("keyboard r light1 rotated, s stop");
  185. glutInit(&argc,argv);
  186. glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
  187. glutInitWindowSize(900,600);
  188. glutInitWindowPosition(400,100);
  189. glutCreateWindow("hello world");
  190. init();
  191. glutDisplayFunc(display);
  192. glutReshapeFunc(reshape);
  193. glutKeyboardFunc(keyboard);
  194. //glutMouseFunc(mouse);
  195. glutMainLoop();
  196. return 0;
  197. }

OpenG: 单模型旋转相关推荐

  1. 科大讯飞2020脑PET图像分析和疾病预测---单模型进决赛前五

    图像分类比赛 科大讯飞2020脑PET图像分析和疾病预测---单模型进决赛前五 目录 1 前言 2 算法名称 3 创新点 4 算法描述 4.1 算法思想 4.1.1对数据进行裁剪处理 4.1.2 数据 ...

  2. 滴滴KDD2017论文:基于组合优化的出租车分单模型 By 机器之心2017年8月14日 10:29 数据挖掘顶会 KDD 2017 已经开幕,国内有众多来自产业界的论文被 KDD 2017 接收。

    滴滴KDD2017论文:基于组合优化的出租车分单模型 By 机器之心2017年8月14日 10:29 数据挖掘顶会 KDD 2017 已经开幕,国内有众多来自产业界的论文被 KDD 2017 接收.本 ...

  3. 智能城市dqn算法交通信号灯调度_博客 | 滴滴 KDD 2018 论文详解:基于强化学习技术的智能派单模型...

    原标题:博客 | 滴滴 KDD 2018 论文详解:基于强化学习技术的智能派单模型 国际数据挖掘领域的顶级会议 KDD 2018 在伦敦举行,今年 KDD 吸引了全球范围内共 1480 篇论文投递,共 ...

  4. 文本分类(一)EWECT微博情绪分类大赛第三名Bert-Last_3embedding_concat最优单模型复现

    tensorflow2.0 + transformers EWECT微博情绪分类大赛第三名Bert-Last_3embedding_concat最优单模型复现 前言 代码部分 训练结果 总结 迭代优化 ...

  5. AVL树的单双旋转解析

    [0]README 0.0) 本文部分idea 转自:http://blog.csdn.net/collonn/article/details/20128205 0.1) 本文专注于 解析 AVL 树 ...

  6. 搭建基于飞桨的OCR工具库,总模型仅8.6M的超轻量级中文OCR,单模型支持中英文数字组合识别、竖排文本识别、长文本识别的PaddleOCR

    介绍 基于飞桨的OCR工具库,包含总模型仅8.6M的超轻量级中文OCR,单模型支持中英文数字组合识别.竖排文本识别.长文本识别.同时支持多种文本检测.文本识别的训练算法. 相关链接 PaddleOCR ...

  7. 谷歌、CMU发文:别压榨单模型了!集成+级联上分效率更高!

    文 |  Sherry 不是小哀 集成模型(Ensemble)可以提升模型的精度,但往往面临提升计算量的困境,用级联模型(Cascade)在预测时提前中断则可解决计算量的问题.最近,谷歌和CMU的研究 ...

  8. 百度飞桨开源Open Images Dataset V5目标检测比赛最好单模型MSF-DET

    目标检测是计算机视觉领域中的核心任务.Open Images Dataset V5(OIDV5)是目前规模最大的目标检测公开数据集[1].基于飞桨(PaddlePaddle)的PaddleDetect ...

  9. 斩获VCR竞赛榜第一,腾讯微视推出BLENDer单模型,超越多模型最好效果

    出品 | CSDN(ID:CSDNnews) 视觉常识推理VCR (Visual Commonsense Reasoning )是人工智能领域的前沿热点问题,我国<新一代人工智能发展规划> ...

  10. (8)VTK 鼠标左右键控制模型旋转

    1. 前言 在一个项目中,需要用鼠标和键盘完成对模型旋转操作和移动操作. 实现中,对鼠标的操作虚函数进行了重写,完成左右键点击,对模型正负方向旋转. 2.代码 #include "InitI ...

最新文章

  1. ribbon 默认负载均衡 是什么_面试官:说说Ribbon是如何实现负载均衡的?
  2. 简单读懂微生物基因组的泛基因组学
  3. exp导oracle数据库,使用exp/imp 在oracle数据库间导数据
  4. Spring MVC使用拦截器实现权限控制
  5. 数据结构(二)算法基础与复杂度
  6. hdu 1392 Surround the Trees
  7. 【华为云技术分享】Docker容器+Phoronix-Test-Suite测试X86和ARM的ffmpeg转码性能
  8. 0x06 MySQL 单表查询
  9. linux定时备份文件到指定文件夹,Linux定时备份数据库到指定邮箱的方法
  10. rk3399_android7.1关于看门狗驱动的实现原理说明
  11. Vue源码解析系列——响应式原理篇:理解Dep类和Watcher类
  12. R数据分析:样本量计算的底层逻辑与实操,pwr包
  13. 微信收到消息很慢无法连接服务器,微信消息总是延迟接收怎么办?
  14. 南京大学计算机专业复试面试,南京大学计算机CS专业复试超全PPT及真题、面试内部资料(离散编译上机面试)...
  15. 暗月内网渗透实战——项目七
  16. XUPT第三届新生算法赛
  17. bapi sap 创建物料_SAP调用BAPI创建物料主数据
  18. C语言实验题目[01]
  19. SXOI2018 游记
  20. xml在u3d的使用[u3d_rpg游戏开发之物品管理(四)]

热门文章

  1. APP 自动化框架设计思路分享
  2. 同文输入法 android,同文输入法app下载-同文输入法手机版-同文输入法最新版_易玩网...
  3. 深海迷航坐标传送代码_深海迷航代码输入方法
  4. 我是如何次次《头脑王者》获得满分的
  5. 核心期刊为什么难发?
  6. linux中静态库和动态库的区别,Linux下静态库和动态库的区别
  7. 那些年我们一起追过的ILSVRC冠军
  8. 印象笔记,为知笔记和 Effie 哪个更适合影评人呢?
  9. cx_Oracle.DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client libr....
  10. 【考研经验】2018普通人跨考浙江大学计科的教训和方法论