OpenG: 单模型旋转
1.绘制带有光照效果的场景;
2.场景包含3个茶壶,通过键盘1,2,3可以分别选中三个茶壶,然后用鼠标对每个茶壶进行分别的旋转;
3.使用点光源,点光源为白色,以白色的球体表示;
4.使用3个不同的点光源
i. 光源1的坐标设置在世界坐标系中,并围绕着三个茶壶的中心进行圆周运动;
ii. 光源2 的坐标 设置在观察坐标系,不发生变化;
iii. 光源3的坐标设置在茶壶1的物体坐标系中,当茶壶1被选中进行旋转时,光源3要跟随茶壶1 做相同的旋转;
- #include <windows.h>
- #include <GL/glut.h>
- #include <GL/glext.h>
- #include <GL/SOIL.h>
- #include <cstdio>
- GLfloat r1 = 0.0f;
- GLfloat r2 = 0.0f;
- GLfloat r3 = 0.0f;
- GLfloat rlight1 = 0.0f;
- GLfloat mat_specular[] = {1.0f,1.0f,1.0f,1.0f};
- GLfloat low_shiniess[] = {5.0}; // 镜面反射
- GLfloat material1[] = {1.0f,0.0f,0.0f,1.0f};
- GLfloat material2[] = {0.0f,1.0f,0.0f,1.0f};
- GLfloat material3[] = {0.0f,0.0f,1.0f,1.0f};
- GLfloat light_position1[] = {0.0f,0.0f,4.0f,1.0f};
- GLfloat light_diffuse1[] = {1.0f,1.0f,1.0f,1.0f}; //白光
- GLfloat light_position2[] = {1.0f,-2.0f,1.0f,1.0f}; //红光
- GLfloat light_diffuse2[] = {1.0f,0.0f,0.0f,1.0f};
- GLfloat light_position3[] = {0.0f,0.0f,2.0f,1.0f};
- GLfloat light_diffuse3[] = {0.0f,0.0f,1.0f,1.0f};// 蓝光
- GLfloat light_specular3[] = {1.0f,1.0f,1.0f,1.0f};
- //漫射光
- void init ()
- {
- glShadeModel(GL_SMOOTH);
- glClearColor(0.0,0.0,0.0,0.0);
- glClearDepth(1.0);
- glEnable(GL_DEPTH_TEST);
- glDepthFunc(GL_LEQUAL);
- glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
- glEnable(GL_LIGHTING);
- //glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
- //glMaterialfv(GL_FRONT,GL_SHININESS,low_shiniess);
- }
- void reshape(int w,int h)
- {
- glViewport(0,0,(GLsizei)w,(GLsizei)h);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(45.0,(GLfloat)w/(GLfloat)h,0.1,100.0);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- gluLookAt(0.0f,0.0f,10.0f,
- 0.0f,0.0f,0.0f,
- 0.0f,1.0f,0.0f);
- }
- void display()
- {
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glPushMatrix();
- glRotated(rlight1,0.0f,1.0f,0.0f);
- glLightfv(GL_LIGHT0,GL_POSITION,light_position1);
- glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse1); //世界坐标系光源
- glPopMatrix();
- glPushMatrix();
- glDisable(GL_LIGHTING);
- glRotated(rlight1,0.0f,1.0f,0.0f);
- glTranslatef(0.0f,0.0f,4.0f);
- glColor3f(1.0f,1.0f,1.0f); //光源1 白光 的小球
- glutSolidSphere(0.05,10,10);
- glEnable(GL_LIGHTING);
- glPopMatrix();
- glLightfv(GL_LIGHT1,GL_POSITION,light_position2);
- glLightfv(GL_LIGHT1,GL_DIFFUSE,light_diffuse2); //观察坐标系光源
- glPushMatrix();
- glDisable(GL_LIGHTING);
- glTranslatef(1.0f,-2.0f,1.0f); //光源2 红光的小球
- glColor3f(1.0f,0.0f,0.0f);
- glutSolidSphere(0.05,10,10);
- glEnable(GL_LIGHTING);
- glPopMatrix();
- //teapot1
- glPushMatrix();
- glTranslatef(0.0f,2.0f,0.0f);
- glRotatef(r1,0.0f,1.0f,0.0f);
- //glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,material1);
- glLightfv(GL_LIGHT2,GL_POSITION,light_position3);
- glLightfv(GL_LIGHT2,GL_DIFFUSE,light_diffuse3);
- glLightfv(GL_LIGHT2,GL_SPECULAR,light_specular3); //
- glLightf(GL_LIGHT2,GL_SPOT_CUTOFF,45.0f);
- glPushMatrix();
- glDisable(GL_LIGHTING);
- glTranslated(0.0f,0.0f,2.0f);
- glRotatef(r1,0.0f,1.0f,0.0f);
- glColor3f(0.0f,0.0f,1.0f); //蓝色光源的小球
- glutSolidSphere(0.05,10,10);
- glEnable(GL_LIGHTING);
- glPopMatrix();
- glutSolidTeapot(1.0f);
- glPopMatrix();
- //teapot2
- glPushMatrix();
- glTranslatef(-2.5f,-1.0f,0.0f);
- glRotatef(r2,1.0f,0.0f,0.0f);
- //glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,material2);
- //glColor3f(1.0f,0.0f,0.0f);
- glutSolidTeapot(1.0f);
- glPopMatrix();
- //teapot3
- glPushMatrix();
- glTranslatef(2.5f,-1.0f,0.0f);
- glRotatef(r3,0.0f,0.0f,1.0f);
- //glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,material3);
- //glColor3f(1.0f,1.0f,0.0f);
- glutSolidTeapot(1.0f);
- glPopMatrix();
- glFlush();
- }
- void mouse_move1(int x,int y)
- {
- r1+=10.0f;
- glutPostRedisplay();
- }
- void mouse_move2(int x,int y)
- {
- r2+=10.0f;
- glutPostRedisplay();
- }
- void mouse_move3(int x,int y)
- {
- r3+=10.0f;
- glutPostRedisplay();
- }
- void rotate1()
- {
- rlight1+=1.0f;
- if(rlight1>360.0)
- rlight1 = rlight1-360;
- glutPostRedisplay();
- }
- void keyboard(unsigned char key,int x,int y)
- {
- switch(key)
- {
- case '1':
- glutMotionFunc(mouse_move1);
- break;
- case '2':
- glutMotionFunc(mouse_move2);
- break;
- case '3':
- glutMotionFunc(mouse_move3);
- break;
- case 'r':
- glutIdleFunc(rotate1);
- break;
- case 's':
- glutIdleFunc(NULL);
- break;
- case 'a': // light1
- glDisable(GL_LIGHT1);
- glDisable(GL_LIGHT2);
- glEnable(GL_LIGHT0);
- glutPostRedisplay();
- break;
- case 'b': //light2
- glDisable(GL_LIGHT0);
- glDisable(GL_LIGHT2);
- glEnable(GL_LIGHT1);
- glutPostRedisplay();
- break;
- case 'c': //light2
- glDisable(GL_LIGHT1);
- glDisable(GL_LIGHT0);
- glEnable(GL_LIGHT2);
- glutPostRedisplay();
- break;
- }
- }
- /*void mouse(int button,int state,int x,int y)
- {
- switch(button){
- case GLUT_LEFT_BUTTON:
- if(state == GLUT_DOWN)
- break;
- case GLUT_RIGHT_BUTTON:
- if(state == GLUT_DOWN)
- break;
- }
- }*/
- int main(int argc,char **argv)
- {
- printf("keyboard 1,2,3 choose the teapot mousemove control\n");
- printf("keyboard r light1 rotated, s stop");
- glutInit(&argc,argv);
- glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
- glutInitWindowSize(900,600);
- glutInitWindowPosition(400,100);
- glutCreateWindow("hello world");
- init();
- glutDisplayFunc(display);
- glutReshapeFunc(reshape);
- glutKeyboardFunc(keyboard);
- //glutMouseFunc(mouse);
- glutMainLoop();
- return 0;
- }
OpenG: 单模型旋转相关推荐
- 科大讯飞2020脑PET图像分析和疾病预测---单模型进决赛前五
图像分类比赛 科大讯飞2020脑PET图像分析和疾病预测---单模型进决赛前五 目录 1 前言 2 算法名称 3 创新点 4 算法描述 4.1 算法思想 4.1.1对数据进行裁剪处理 4.1.2 数据 ...
- 滴滴KDD2017论文:基于组合优化的出租车分单模型 By 机器之心2017年8月14日 10:29 数据挖掘顶会 KDD 2017 已经开幕,国内有众多来自产业界的论文被 KDD 2017 接收。
滴滴KDD2017论文:基于组合优化的出租车分单模型 By 机器之心2017年8月14日 10:29 数据挖掘顶会 KDD 2017 已经开幕,国内有众多来自产业界的论文被 KDD 2017 接收.本 ...
- 智能城市dqn算法交通信号灯调度_博客 | 滴滴 KDD 2018 论文详解:基于强化学习技术的智能派单模型...
原标题:博客 | 滴滴 KDD 2018 论文详解:基于强化学习技术的智能派单模型 国际数据挖掘领域的顶级会议 KDD 2018 在伦敦举行,今年 KDD 吸引了全球范围内共 1480 篇论文投递,共 ...
- 文本分类(一)EWECT微博情绪分类大赛第三名Bert-Last_3embedding_concat最优单模型复现
tensorflow2.0 + transformers EWECT微博情绪分类大赛第三名Bert-Last_3embedding_concat最优单模型复现 前言 代码部分 训练结果 总结 迭代优化 ...
- AVL树的单双旋转解析
[0]README 0.0) 本文部分idea 转自:http://blog.csdn.net/collonn/article/details/20128205 0.1) 本文专注于 解析 AVL 树 ...
- 搭建基于飞桨的OCR工具库,总模型仅8.6M的超轻量级中文OCR,单模型支持中英文数字组合识别、竖排文本识别、长文本识别的PaddleOCR
介绍 基于飞桨的OCR工具库,包含总模型仅8.6M的超轻量级中文OCR,单模型支持中英文数字组合识别.竖排文本识别.长文本识别.同时支持多种文本检测.文本识别的训练算法. 相关链接 PaddleOCR ...
- 谷歌、CMU发文:别压榨单模型了!集成+级联上分效率更高!
文 | Sherry 不是小哀 集成模型(Ensemble)可以提升模型的精度,但往往面临提升计算量的困境,用级联模型(Cascade)在预测时提前中断则可解决计算量的问题.最近,谷歌和CMU的研究 ...
- 百度飞桨开源Open Images Dataset V5目标检测比赛最好单模型MSF-DET
目标检测是计算机视觉领域中的核心任务.Open Images Dataset V5(OIDV5)是目前规模最大的目标检测公开数据集[1].基于飞桨(PaddlePaddle)的PaddleDetect ...
- 斩获VCR竞赛榜第一,腾讯微视推出BLENDer单模型,超越多模型最好效果
出品 | CSDN(ID:CSDNnews) 视觉常识推理VCR (Visual Commonsense Reasoning )是人工智能领域的前沿热点问题,我国<新一代人工智能发展规划> ...
- (8)VTK 鼠标左右键控制模型旋转
1. 前言 在一个项目中,需要用鼠标和键盘完成对模型旋转操作和移动操作. 实现中,对鼠标的操作虚函数进行了重写,完成左右键点击,对模型正负方向旋转. 2.代码 #include "InitI ...
最新文章
- ribbon 默认负载均衡 是什么_面试官:说说Ribbon是如何实现负载均衡的?
- 简单读懂微生物基因组的泛基因组学
- exp导oracle数据库,使用exp/imp 在oracle数据库间导数据
- Spring MVC使用拦截器实现权限控制
- 数据结构(二)算法基础与复杂度
- hdu 1392 Surround the Trees
- 【华为云技术分享】Docker容器+Phoronix-Test-Suite测试X86和ARM的ffmpeg转码性能
- 0x06 MySQL 单表查询
- linux定时备份文件到指定文件夹,Linux定时备份数据库到指定邮箱的方法
- rk3399_android7.1关于看门狗驱动的实现原理说明
- Vue源码解析系列——响应式原理篇:理解Dep类和Watcher类
- R数据分析:样本量计算的底层逻辑与实操,pwr包
- 微信收到消息很慢无法连接服务器,微信消息总是延迟接收怎么办?
- 南京大学计算机专业复试面试,南京大学计算机CS专业复试超全PPT及真题、面试内部资料(离散编译上机面试)...
- 暗月内网渗透实战——项目七
- XUPT第三届新生算法赛
- bapi sap 创建物料_SAP调用BAPI创建物料主数据
- C语言实验题目[01]
- SXOI2018 游记
- xml在u3d的使用[u3d_rpg游戏开发之物品管理(四)]
热门文章
- APP 自动化框架设计思路分享
- 同文输入法 android,同文输入法app下载-同文输入法手机版-同文输入法最新版_易玩网...
- 深海迷航坐标传送代码_深海迷航代码输入方法
- 我是如何次次《头脑王者》获得满分的
- 核心期刊为什么难发?
- linux中静态库和动态库的区别,Linux下静态库和动态库的区别
- 那些年我们一起追过的ILSVRC冠军
- 印象笔记,为知笔记和 Effie 哪个更适合影评人呢?
- cx_Oracle.DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client libr....
- 【考研经验】2018普通人跨考浙江大学计科的教训和方法论