#include <windows.h>#include <iostream>
#include <gl/gl.h>
#include <gl/GLUT.h>
#include <math.h>#include "maple.h"#pragma comment (lib, "opengl32.lib")
#pragma comment (lib, "glut32.lib")//全局变量定义
enum                              //枚举鼠标变量
{BUTTON_LEFT = 0,BUTTON_RIGHT,
};const int ESC = 27;
int wireframe = 0;    //判断是否填充的变量int mButton = -1;
int mOldY, mOldX;        //鼠标位置的变量
float eye[3] = { 0.0f, 0.0f, 10.0f };   //观察视角
float rot[3] = { 0.0f, 0.0f, 0.0f }; //旋转变量
int bOrbitOn = 0;      //判断是否转动的变量
float f = 1;         //转动速度的变量model_obj m;            //蝴蝶模型
float flyangle = 22.5f; //翅膀之间的角度
bool flyopen = true;    //翅膀开合void glutResize(int width, int height)//重置OpenGL窗口大小
{glViewport(0, 0, width, height);  //重置当前视口glMatrixMode(GL_PROJECTION);     //选择投影矩阵glLoadIdentity();                //重置投影矩阵gluPerspective(55.0, (float)width / (float)height, 1.0, 300.0);//设置视口大小glMatrixMode(GL_MODELVIEW);      //选择模型观察矩阵glLoadIdentity();                //重置模型观察矩阵
}void glutKeyboard(unsigned char key, int x, int y)//键盘控制函数
{switch (key){case ESC://退出程序exit(0);break;case ' '://暂停OR旋转bOrbitOn = !bOrbitOn;glutPostRedisplay();break;case 'a'://加速f++;break;case 'd'://减速f--;break;case 'p'://全屏glutFullScreen();break;case 'q'://非全屏glutReshapeWindow(800, 600);break;}
}void clamp(float *v)//旋转
{int i;for (i = 0; i < 3; i++)//图像旋转一周后回到原地if (v[i] > 360 || v[i] < -360)v[i] = 0;
}void glutMotion(int x, int y)//图像移动函数
{if (mButton == BUTTON_LEFT)//按下左键时可以任意旋转图像{rot[0] -= (mOldY - y);rot[1] -= (mOldX - x);clamp(rot);}else if (mButton == BUTTON_RIGHT)//按右键可缩放图像{eye[2] -= (mOldY - y) * 0.05f;clamp(rot);}mOldX = x;mOldY = y;
}void glutMouse(int button, int state, int x, int y)//鼠标控制函数
{if (state == GLUT_DOWN){mOldX = x;mOldY = y;switch (button){case GLUT_LEFT_BUTTON:mButton = BUTTON_LEFT;break;case GLUT_RIGHT_BUTTON:mButton = BUTTON_RIGHT;break;}}else if (state == GLUT_UP)mButton = -1;
}//改变摄像机
void LookAt()
{glTranslatef(-eye[0], -eye[1], -eye[2]);//视口//控制旋转glRotatef(rot[0], -1.0f, 0.0f, 0.0f);//glRotatef(rot[1], 0.0f, 0.0f, -1.0f);glRotatef(rot[1], 0.0f, 1.0f, 0.0f);glRotatef(rot[2], 0.0f, 1.0f, 0.0f);
}//绘制蝴蝶
//angle 两个翅膀之间的角度
void DrawButterfly(float angle)
{glRotatef(20, 0.0f, 0.0f, 1.0f);//左半块glPushMatrix();//入栈glRotatef(-angle, 0.0f, 1.0f, 0.0f);glRotatef(-45, 0.0f, 0.0f, 1.0f);DrawMaple();    //绘制半个枫叶glTranslatef(0.25f, -0.125f, -0.0125f);   //做一些偏移glRotatef(200.0f, 0.0f, 0.0f, 1.0f);    //两个翅膀的角度glRotatef(175.0f, 0.0f, 1.0f, 0.0f);glRotatef(-80.0f, 0.0f, 0.0f, 1.0f);glScalef(0.75f, 0.75f, 0.75f);DrawMaple();    //绘制半个枫叶glPopMatrix();  //出栈//右半块glPushMatrix();//入栈//旋转glRotatef(angle, 0.0f, 1.0f, 0.0f);glRotatef(-45, 0.0f, 0.0f, 1.0f);DrawMaple();    //绘制半个枫叶glTranslatef(0.25f, -0.125f, 0.0125f);    //做一些偏移glRotatef(200.0f, 0.0f, 0.0f, 1.0f);    //两个翅膀的角度glRotatef(185.0f, 0.0f, 1.0f, 0.0f);glRotatef(-80.0f, 0.0f, 0.0f, 1.0f);glScalef(0.75f, 0.75f, 0.75f);DrawMaple();    //绘制半个枫叶glPopMatrix();  //出栈
}//绘制地面网格
void DrawGrid()
{glColor4f(0.0f, 0.0f, 0.0f, 0.5f);glBegin(GL_LINES);for (int i = -10; i <= 10; ++i) {glVertex3f(-10.0f, 0.0f, i);glVertex3f(10.0f, 0.0f, i);}for (int i = -10; i <= 10; ++i) {glVertex3f(i, 0.0f, -10.0f);glVertex3f(i, 0.0f, 10.0f);}glEnd();
}void glutDisplaytTest(void)//显示函数
{glClearColor(0.5f, 0.5f, 0.5f, 1.0f);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清空颜色和深度缓冲glLoadIdentity();glPushMatrix();//入栈LookAt();//改变摄像头//根据摄像头角度,更改光源位置(太阳)GLfloat first_light_position[] = { -10.0f, 10.0f, -10.0f, 0.0f }; // 光源的位置glLightfv(GL_LIGHT0, GL_POSITION, first_light_position); //指定第0号光源的位置DrawGrid();//绘制网格//蝴蝶的颜色glColor3f(1.0, 0.0, 0.0);if (bOrbitOn) {    //用这个变量做个小动画,空格控制开合if (flyopen) {flyangle += 0.1f;if (flyangle > 80.0f) {flyopen = false;}}else {flyangle -= 0.1f;if (flyangle < 10.0f) {flyopen = true;}}}//绘制蝴蝶DrawButterfly(flyangle);glPopMatrix();  //出栈glFlush();glutSwapBuffers();//if (bOrbitOn)    //判断是否旋转//    rot[1] += f;    //旋转速度
}//做一些初始化操作
void Init()
{//定义光源属性// 定义太阳光源,它是一种白色的光源{GLfloat first_light_position[] = { -10.0f, 10.0f, -10.0f, 0.0f }; // 光源的位置GLfloat first_light_ambient[] = { 0.1f, 0.1f, 0.1f, 1.0f };     //微弱的环境光GLfloat first_light_diffuse[] = { 0.8f, 0.4f, 0.4f, 1.0f };     //稍微发红的漫反射光GLfloat first_light_specular[] = { 1.0f, 0.0f, 0.0f, 1.0f };    //红色的高光glLightfv(GL_LIGHT0, GL_POSITION, first_light_position); //指定第0号光源的位置glLightfv(GL_LIGHT0, GL_AMBIENT, first_light_ambient); //环境glLightfv(GL_LIGHT0, GL_DIFFUSE, first_light_diffuse); //漫反射glLightfv(GL_LIGHT0, GL_SPECULAR, first_light_specular);//镜面反射glEnable(GL_LIGHT0); //使用第0号光照glEnable(GL_LIGHTING); //在后面的渲染中使用光照glEnable(GL_DEPTH_TEST); //启用深度测试glDepthFunc(GL_LEQUAL);//defaultglClearDepth(1.0);//设置清除深度缓冲区所用的值}//定义红色粉笔盒//*GLfloat mat_ambient[] = { 0.1f, 0.1f, 0.1f, 1.0f };GLfloat mat_diffuse[] = { 0.4f, 0.4f, 0.4f, 1.0f };//GLfloat mat_specular[] = { 0.4f, 0.4f, 0.4f, 1.0f};GLfloat mat_specular[] = { 0.60f, 0.60f, 0.60f, 1.0f };GLfloat mat_emission[] = { 0.0f, 0.0f, 0.f, 1.0f };GLfloat mat_shininess = 32.0f; //壳体的粗糙度glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient);//环境光:各种光线照射到该材质上,经过很多次反射后最终遗留在环境中的光线颜色glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse);//漫反射光:光线照射到该材质上,经过漫反射后形成的光线颜色glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);//镜面反射光:光线照射到该材质上,经过镜面反射后形成的光线颜色glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, mat_emission);//辐射光:微微的向外发射光线,眼睛感觉到这样的颜色,又比较微弱,以至于不会影响到其它物体的颜色glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);//“镜面指数”,取值范围是0到128。该值越小,越粗糙,值越大,越类似于镜面,产生较小的亮点。//*/glEnable(GL_COLOR_MATERIAL);//开启颜色追踪glShadeModel(GL_SMOOTH);//投影模式,好像不管用glEnable(GL_CULL_FACE);//剔除背面//glDisable(GL_CULL_FACE);//剔除背面//打开混合glEnable(GL_BLEND);glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);}int main(int argc, char** argv)  //主函数
{glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA);    //设置初始显示模式 双缓存窗口 深度缓存 RGBA颜色模式glutInitWindowPosition(0, 0);  //窗口位置glutInitWindowSize(800, 600);             //窗口大小glutInit(&argc, argv);//初始化GLUTglutCreateWindow("计算机图形学范例");                      //窗口名称//初始化Init();//@@@@@@@@@@@@@@@@@@@@@@@@@glutDisplayFunc(glutDisplaytTest);                                  //注册一个绘图函数,必要时刻就会对窗体进行重新绘制操作glutIdleFunc(glutDisplaytTest);                                     //设置全局的回调函数glutPostRedisplay();//@@@@@@@@@@@@@@@@@@@@@@@@@glutReshapeFunc(glutResize);                                   //根据缩放后的窗口重新设置glutKeyboardFunc(glutKeyboard);                                //处理键盘输入事件的函数名glutMouseFunc(glutMouse);                                      //处理鼠标输入事件的函数名glutMotionFunc(glutMotion);    //当有鼠标键按下的时候,mouse move消息会导致glut调用glutMotionFuncglutMainLoop();                                                //进入GLUT事件处理循环return 0;                                                      //返回
}

蝴蝶绘制代码

https://download.csdn.net/download/sdragonx/14035372

OpenGL显示枫叶蝴蝶,无聊作品相关推荐

  1. Boost:交互式地调整2D图像大小并使用OpenGL显示它

    Boost:交互式地调整2D图像大小并使用OpenGL显示它 实现功能 C++实现代码 实现功能 Boost的compute模块,交互式地调整2D图像大小并使用OpenGL显示它 C++实现代码 #i ...

  2. OpenGL 显示多个外星人实例

    OpenGL 显示多个外星人 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <vmath.h> #include <cmath ...

  3. C++ Opengl 显示列表源码

    C++ Opengl 显示列表源码 项目开发环境 项目功能 项目演示 项目源码传送门 项目开发环境 开发语言:C++和IDE:VS2017,操作系统Windows版本windows SDK8.1,三方 ...

  4. C++ Opengl 显示TGA文件和扩展名源码

    C++ Opengl 显示TGA文件和扩展名源码 项目开发环境 项目功能 项目演示 项目源码传送门 项目开发环境 开发语言:C++和IDE:VS2017,操作系统Windows版本windows SD ...

  5. Android OpenGL显示任意3D模型文件

    转载请注明出处:[huachao1001的专栏:http://blog.csdn.net/huachao1001] *本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 前面两篇文章我 ...

  6. OpenGL显示列表

    OpenGL显示列表(Display List)是由一组预先存储起来的留待以后调用的OpenGL函数语句组成的,当调用这张显示列表时就依次执行表中所列出的函数语句.前面内容所举出的例子都是瞬时给出函数 ...

  7. MFC+OpenGL显示视频流图片

    由于想做一个应用软件,把目前自己的算法应用出去,给给为研究者提供一丢丢便利,需要在MFC中显示视频流文件.我尝试了两种方法:opencv+MFC:openGL+MFC:这两种方法都可行.但是在使用op ...

  8. 转载:OpenGL显示文字

    转载:OpenGL显示文字 2010年07月03日 本课我们来谈谈如何显示文字. OpenGL并没有直接提供显示文字的功能,并且,OpenGL也没有自带专门的字库.因此,要显示文字,就必须依赖操作系统 ...

  9. qt 在qtextedit显示数组_Qt开源作品34-qwt无需插件源码

    一.前言 QWT,全称是Qt Widgets for Technical Applications,是一个基于LGPL版权协议的开源项目,可生成各种统计图.为具有技术专业背景的程序提供GUI组件和一组 ...

最新文章

  1. PCB的EMC设计之PCB叠层结构
  2. Spark入门实战系列--6.SparkSQL(中)--深入了解SparkSQL运行计划及调优
  3. python的time库有哪些方法_Python的time模块中的常用方法整理
  4. js中当等于最小值是让代码不执行_JavaScript中最最基础的知识点
  5. 新国标电动自行车目录库
  6. 三类危险的TXT文件
  7. 【报告分享】2020中国企业数字化转型研究报告-清华大学.pdf(附下载链接)
  8. 企业中MySQL高可用集群架构三部曲之MM+keepalived
  9. focal loss dice loss源码_扒源码:sharding loss in Pytorch
  10. hdu1403(后缀数组模板)
  11. java开发的程序怎么用_java安装后怎么使用?第一次编写java程序
  12. 【平面设计基础】03:绘制—图标到底有多重要
  13. vue视频播放——vue-video-player
  14. Windows10 + Anaconda(python3.6)安装labelling
  15. 2022年二级建造师《建设工程法规及相关知识》试题答案
  16. ”标准答案没出来,我怎么知道我想表达什么?……“这样的话,根本就不仅仅是笑话,而且还是现实
  17. linux 版本号 笔记本_2019 年最佳 Linux 笔记本电脑发行版 top10
  18. 手机副业哪个好?利用手机赚钱并不难
  19. 2019各大互联网公司年会盘点
  20. 抽屉作业之content部分和抽屉作业页码部分

热门文章

  1. 朱松纯团队新作:让AI「读懂」人类价值观!登上Science Robotics
  2. 这篇不讨好任何人的回忆录,记录了我从双非学校到BAT/TMD六offer的原因
  3. 推荐一款我最近爱上的网页版文库(编辑器)——语雀yuque.com
  4. 敏捷迭代燃尽图_3个敏捷燃尽报告以及如何使用它们
  5. curl证书过期_centos7内核升级及curl访问https证书过期处理
  6. 新东方:俞敏洪从台前走入幕后
  7. java 鼠标变成手型_当鼠标放在按钮上时让指针变为手型
  8. 商品订单管理系统java_Javaweb的实例--订单管理系统--设计数据库
  9. 【问链-区块链基础知识系列】 第十二课 区块链产业落地现状分析
  10. 一个开源「知乎日报」Android 客户端