/*  reference http://nehe.gamedev.net/article/using_gluunproject/16013/
*/#include <windows.h>   // windows系统要加这个。因为下面2个头文件的一些宏是在这个文件中定义的
#include <gl/Gl.h>
#include <gl/glut.h>    //这两个头文件在OpenGL程序中几乎必加。

#include <cstdio>    //标准输入输出,用来打印坐标
//<<<<<<<<<<<<<<<<<<<<<<< myInit >>>>>>>>>>>>>>>>>>>>    初始化
void myInit(void)
{glClearColor(0.0,0.0,0.0,0.0);       // 设置背景色:黑色。 glShadeModel(GL_SMOOTH);                // 设置着色模式,可选GL_SMOOTH(默认)或GL_FLAT。采用恒定着色时(即GL_FLAT),使用图元中某个顶点的颜色来渲染整个图元。

}
//<<<<<<<<<<<<<<<<<<<<<<<< myDisplay >>>>>>>>>>>>>>>>> 绘制
void myDisplay(void)
{glEnable(GL_DEPTH_TEST);        //开启深度测试glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT);     // 将屏幕清除为背景色glColor3f(1.0f, 0.0f, 0.0f);    // 绘制颜色:红色
    glLoadIdentity();gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0 ,1.0, 0.0);        //设置eye,相机位置,和向上up向量,可调不同参数来观察会有什么变化glScalef(1.0, 2.0, 1.0);        //表示y坐标值扩大两倍,这样原本方的物体就变成长的了。 glutSolidSphere(1.0, 30, 50);            //cube的边长
glFlush();                         // send all output to display 把数据从缓冲区弄到屏幕上
}//<<<<<<<<<<<<<<<<<<<<<<<< reshape >>>>>>>>>>>>>>>>>    视图变换
void myReshape(int w, int h)
{glViewport(0, 0, (GLsizei) w, (GLsizei) h);        //设置视口大小
    glMatrixMode(GL_PROJECTION);glLoadIdentity();glFrustum(-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);        //将当前矩阵与一个透视矩阵相乘,把当前矩阵转变成透视矩阵
    glMatrixMode(GL_MODELVIEW);
}//<<<<<<<<<<<<<<<<<<<<<<<< GetOGLPos >>>>>>>>>>>>>>>>>    由屏幕坐标得到OpenGL坐标
void GetOGLPos(int x, int y)
{GLint viewport[4];GLdouble modelview[16];GLdouble projection[16];GLfloat winX, winY, winZ;GLdouble posX, posY, posZ;glGetDoublev( GL_MODELVIEW_MATRIX, modelview );glGetDoublev( GL_PROJECTION_MATRIX, projection );glGetIntegerv( GL_VIEWPORT, viewport );winX = (float)x;winY = (float)viewport[3] - (float)y;glReadPixels( x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );gluUnProject( winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);//return CVector3(posX, posY, posZ);printf("x:%f y:%f z:%f\n",posX, posY, posZ);return;}//<<<<<<<<<<<<<<<<<<<<<<<< reshape >>>>>>>>>>>>>>>>>    鼠标点击
void myMouse(int button, int state, int x, int y)
{if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)GetOGLPos(x,y);}//<<<<<<<<<<<<<<<<<<<<<<<< main >>>>>>>>>>>>>>>>>>>>>>
void main(int argc, char** argv)
{glutInit(&argc, argv);          // ***对GLUT进行初始化glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA |GLUT_DEPTH); // ***set display mode,单缓冲/双缓冲,颜色索引模式,深度等glutInitWindowSize(480,480);     // ***设置窗口大小glutInitWindowPosition(100, 150); // ***设置窗口位置glutCreateWindow("my cube attempt"); // ***创建窗口
    myInit();  glutDisplayFunc(myDisplay);     // 显示事件回调函数glutReshapeFunc(myReshape);        //当窗口改变时的回调函数glutMouseFunc(myMouse);            //当鼠标交互时的回调函数glutMainLoop();              // ***启动程序,检测事件并进行处理
}

转载于:https://www.cnblogs.com/difei/p/3718966.html

OpenGL学习笔记3 —— 绘制3D物体、鼠标交互、反向变换相关推荐

  1. OpenGL 学习笔记(3)绘制几何物体

    几何物体可以用点来描述,我们可以通过OpenGL的api来了解一下 几何图形类型 其中以glBegin开始,glEnd结束 下图是采用不同类型的图形效果 为了熟悉上诉图形,下面来对每种图形进行测试 建 ...

  2. 计算机图形学——OpenGL学习系列之绘制3D下的小桌子

    计算机图形学--OpenGL学习系列之绘制3D下的小桌子 做的一个小练习,主要用到了几何变换还有gl自带的一个绘制立方体的函数,顺便体会一下glPush和glPop的用法.另外,从2D到3D,开心到飞 ...

  3. OpenGL学习笔记(八):进一步理解VAO、VBO和SHADER,并使用VAO、VBO和SHADER绘制一个三角形

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7888 ...

  4. OpenGL学习笔记(一)绘制点线面及多面体

    OpenGL学习笔记(一)绘制点线面及多面体 绘制点线面 #include <iostream> #include <GL/GLUT.h> #define PI 3.14159 ...

  5. 【OpenGL学习笔记⑥】——3D变换【旋转的正方体 实现地月系统 旋转+平移+缩放】

    ✈️ 文章目录 零. 成果预览图 一.3D立方体的顶点数组 二.纹理旋转 三.纹理缩放 四.画n个3D图形 五.轨道的数学公式 六.深度缓冲(Z 缓冲) 七.完整代码 八.参考附录: 神器的正方体 ☁ ...

  6. 【OpenGL学习笔记⑧】——键盘控制正方体+光源【冯氏光照模型 光照原理 环境光照+漫反射光照+镜面光照】

    ✅ 重点参考了 LearnOpenGL CN 的内容,但大部分知识内容,小编已作改写,以方便读者理解. 文章目录 零. 成果预览图 一. 光照原理与投光物的配置 1.1 光照原理 1.2 投光物 二. ...

  7. Unity学习笔记:Unity 3D 飞机大战

    Unity学习笔记:Unity 3D 飞机大战 1.打开unity软件后,首先新建Quad作为背景,导入飞机模型,并为其添加刚体 然后创建C#脚本,挂载到飞机上. 2.给飞机创建子弹,让子弹成为预制体 ...

  8. OPENGL学习笔记之八

    OPENGL学习笔记之八 2017/11/15 阅读材料来自learnopengl.com以及learnopengl-cn.github.io 我们通常会自己设定一个坐标的范围,之后再在顶点着色器中将 ...

  9. OpenGL学习笔记:矩阵变换

    文章目录 缩放 glm矩阵表示 glm缩放矩阵实现 位移 齐次坐标 glm位移矩阵实现 旋转 沿x轴旋转 沿y轴旋转 沿z轴旋转 沿任意轴旋转 glm旋转矩阵实现 矩阵的组合 glm矩阵组合使用 接上 ...

最新文章

  1. CAMB输出保留小数位数问题
  2. 计算机科学家 成就,25年来的最高成就!MIT科学家让计算机提供创意,可自动设计机器人形态...
  3. matplotlib 横坐标少了一个点_比 matplotlib 效率高十倍的数据可视化神器
  4. 机器学习入门02-朴素贝叶斯原理和java实现
  5. 串口数据字节位的理解
  6. 何恺明一作,刷新7项检测分割任务,无监督预训练完胜有监督
  7. 软件工程:可行性研究
  8. 全国统计用区划代码和城乡划分代码-70w数据
  9. 微信apk微信直接用手机默认浏览器打开 IOS跳转App Store(苹果商店)打开
  10. 智能电子后视镜MFC01-LCD 高配版规格书(AI-CMS)
  11. CSS 边框四个角效果
  12. 阿里云账号注册流程(新手教程)
  13. JavaWeb:HTML
  14. vue 给某个div设置回到顶部
  15. 《Wireshark数据包分析实战(第2版)》目录—导读
  16. [PyQt5]基本控件24 - 时间日期编辑框QDateTimeEdit
  17. VBA多条件选择及自动填表及计算汇报
  18. 静默升级linux,Firefox 10 正式发布 支持静默升级功能
  19. 产品经理相关资源整理
  20. ITSM流程管理:如何有效实施

热门文章

  1. SAP MM T-code MD04的使用,是有前提的!
  2. 领英2017报告:机器学习、大数据工程师成为最热门的新兴职业
  3. 国拨经费约31.48亿!科技部发布科技创新2030 —“脑科学与类脑研究”重大项目2021年度项目申报指南...
  4. 《中国基础研究竞争力报告2020》发布,6图表速览报告核心结论
  5. AI产业链分布图曝光:1040个玩家,BAT率先步入应用
  6. 2019与下一个十年:我们将要放弃的和将要拥抱的
  7. 清华发布《人工智能AI芯片研究报告》,一文读懂人才技术趋势
  8. 生物科技发展与人类命运共同体塑造
  9. 去了两家外包公司,颠覆了我的认知!
  10. 漫画:什么是 “抽象工厂模式” ?