openGL是一个强大的底层图形库,其命令最初的时候使用C语言实现的。openGL定义了一个图形程序接口,常用于制作处理三维图像,功能强大,调用方便,在图像处理十分受欢迎。

  实现图形主要使用的是openGL的一个工具包:GLUT。

  GLUT (pronounced like the glut in gluttony) is the OpenGL Utility Toolkit, a window system independent toolkit for writing OpenGL programs. It implements a simple windowing application programming interface (API) for OpenGL.

  GLUT is designed for constructing small to medium sized OpenGL programs. While GLUT is well-suited to learning OpenGL and developing simple OpenGL applications, GLUT is not a full-featured toolkit so large applications requiring sophisticated user interfaces are better off using native window system toolkits like Motif. GLUT is simple, easy, and small.

  GLUT对于大型的项目来说可能功能不全,它主要针对一些中小型的openGL项目而设计。

  1.实现二维图像相对简单些,直接下代码:

  1. #include <GL/glut.h>
  2.  
  3. void Rectangle(void) {
  4. //gl开头的函数为openGL的标准函数
  5.  
  6. //(使用当前缓冲区的值来)清除指定的缓冲区
  7. glClear(GL_COLOR_BUFFER_BIT);

  8.      //画矩形
  9. //glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
  10.  
  11. //画直线
  12. glBegin(GL_LINES);
  13. glVertex2f(0.5f, 0.5f);
  14. glVertex2f(-0.5f, -0.5f);
  15. glEnd();
  16.  
  17. //刷新缓冲,保证绘图命令能被执行
  18. glFlush();
  19. }
  20.  
  21. int main(int argc, char *argv[]) {
  22.  
  23. //初始化GLUT library
  24. glutInit(&argc, argv);
  25. //对窗口的大小进行初始化
  26. glutInitWindowSize(300, 300);
  27. // 设置窗口出现的位置
  28. //glutInitWindowPosition(int x, int y);
  29. //初始化程序展示模式
  30. glutInitDisplayMode(GLUT_RGBA);
  31. glutCreateWindow("project of openGL");
  32. //win: 指定子窗口的父窗口
  33. //glutCreateSubWindow(int win, int x, int y, int width, int height);
  34. //为当前窗口设置函数回调,用于画图
  35. glutDisplayFunc(&Rectangle);
  36. //进行glut事件循环,否则看不到图形效果(一闪而过)
  37. glutMainLoop();
  38.  
  39. return 0;
  40. }

  实现效果:

        

  也可以在窗口中画一个圆:

  1. #include <math.h>
    GLfloat r = 0.5f;
  2. GLfloat PI = 3.141592653f;
  3. int pre = 30;
  4. glBegin(GL_POLYGON);//画多边形
  5. for (int i = 0; i < pre; i++) {
  6. glVertex2f(r * cos(2 * PI*i / pre), r * sin(2 * PI*i / pre));
  7. }
  8. glEnd();

  实际上这个圆并不是圆,而是多边形的近似。GL_POLYGON用于绘制多边形,边数达到一定程度,显示出来的形状近似于圆。

  

  2.接下来来实现三维图像Cube。

  三维变换:  

  模型视图变换(GL_MODELVIEW):从“相对移动”的观点来看,改变观察点的位置与方向和改变物体本身的位置与方向具有等效性。

  透视投影变换(GL_PROJECTION):定义一个可视空间,可视空间以外的物体不会被绘制到屏幕上。

  视口变换(glViewPort):通常情况下,程序默认像素填充整个窗口,通过视口变换设置像素在窗口上的填充情况。

  每次对物体进行变换的时候,都需要先设置当前操作的矩阵为某种变换的矩阵,在进行变换之前还需要将矩阵转换为单位矩阵才能进行操作。

  1. glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

  完整代码:

  1. #include <GL/glut.h>
  2. #include <math.h>
  3.  
  4. void setCube(void) {
  5. glClearColor(1.0, 1.0, 1.0, 0.0);
  6. glClear(GL_COLOR_BUFFER_BIT);
  7. glColor3f(0, 0, 0);//设置黑色
  8. glLoadIdentity();//加载单位矩阵
  9. gluLookAt(6, 0, 2.5, 0, 0, 0, 1, 1, 0);
  10. //前三个参数设置观察者的观察位置,中三个参数设置观察点的位置,后三个参数设置观察者的观察方向
  11. glLineWidth(2.0f);//设置边的像素宽,默认为1.0f
  12. glutWireCube(2.0);
  13. glFlush();
  14. }
  15.  
  16. void drawCube(void) {
  17. glClearColor(1.0, 1.0, 1.0, 0.0);
  18. glClear(GL_COLOR_BUFFER_BIT);
  19. glLoadIdentity();
  20. gluLookAt(4, 0, 1.5, 0, 0, 0, 1, 1, 0);
  21.  
  22. //绘制正方体的面
  23. glColor3f(0, 1, 0);
  24. glBegin(GL_QUADS);
  25. //---1---
  26. glNormal3f(-1, 0, 0);//设置点的法向量
  27. glVertex3f(0.5, 0.5, 0.5);
  28. glVertex3f(0.5, -0.5, 0.5);
  29. glVertex3f(0.5, -0.5, -0.5);
  30. glVertex3f(0.5, 0.5, -0.5);
  31. //---2---
  32. glNormal3f(-1, 0, 0);
  33. glVertex3f(-0.5, 0.5, 0.5);
  34. glVertex3f(-0.5, -0.5, 0.5);
  35. glVertex3f(-0.5, -0.5, -0.5);
  36. glVertex3f(-0.5, 0.5, -0.5);
  37. //---3---
  38. glNormal3f(0, 1, 0);
  39. glVertex3f(0.5, 0.5, 0.5);
  40. glVertex3f(-0.5, 0.5, 0.5);
  41. glVertex3f(-0.5, 0.5, -0.5);
  42. glVertex3f(0.5, 0.5, -0.5);
  43. //---4---
  44. glNormal3f(0, -1, 0);
  45. glVertex3f(0.5, -0.5, 0.5);
  46. glVertex3f(-0.5, -0.5, 0.5);
  47. glVertex3f(-0.5, -0.5, -0.5);
  48. glVertex3f(0.5, -0.5, -0.5);
  49. //---5---
  50. glNormal3f(0, 0, 1);
  51. glVertex3f(0.5, 0.5, 0.5);
  52. glVertex3f(-0.5, 0.5, 0.5);
  53. glVertex3f(-0.5, -0.5, 0.5);
  54. glVertex3f(0.5, -0.5, 0.5);
  55. //---6---
  56. glNormal3f(0, 0, -1);
  57. glVertex3f(0.5, 0.5, 0.5);
  58. glVertex3f(-0.5, 0.5, 0.5);
  59. glVertex3f(-0.5, -0.5, 0.5);
  60. glVertex3f(0.5, -0.5, 0.5);
  61. glEnd();
  62.  
  63. //draw
  64. glColor3f(0, 0, 0);
  65. glLineWidth(2.0f);
  66. //绘制正方体的边
  67. glBegin(GL_LINES);
  68. //---1---
  69. glVertex3f(0.5, 0.5, 0.5);
  70. glVertex3f(-0.5, 0.5, 0.5);
  71. glVertex3f(-0.5, 0.5, 0.5);
  72. glVertex3f(-0.5, -0.5, 0.5);
  73. glVertex3f(-0.5, -0.5, 0.5);
  74. glVertex3f(0.5, -0.5, 0.5);
  75. glVertex3f(0.5, -0.5, 0.5);
  76. glVertex3f(0.5, 0.5, 0.5);
  77. //---2---
  78. glVertex3f(0.5, 0.5, -0.5);
  79. glVertex3f(-0.5, 0.5, -0.5);
  80. glVertex3f(-0.5, 0.5, -0.5);
  81. glVertex3f(-0.5, -0.5, -0.5);
  82. glVertex3f(-0.5, -0.5, -0.5);
  83. glVertex3f(0.5, -0.5, -0.5);
  84. glVertex3f(0.5, -0.5, -0.5);
  85. glVertex3f(0.5, 0.5, -0.5);
  86. //---3---
  87. glVertex3f(0.5, 0.5, 0.5);
  88. glVertex3f(0.5, -0.5, 0.5);
  89. glVertex3f(0.5, -0.5, 0.5);
  90. glVertex3f(0.5, -0.5, -0.5);
  91. glVertex3f(0.5, -0.5, -0.5);
  92. glVertex3f(0.5, 0.5, -0.5);
  93. glVertex3f(0.5, 0.5, -0.5);
  94. glVertex3f(0.5, 0.5, 0.5);
  95. //---4---
  96. glVertex3f(-0.5, 0.5, 0.5);
  97. glVertex3f(-0.5, -0.5, 0.5);
  98. glVertex3f(-0.5, -0.5, 0.5);
  99. glVertex3f(-0.5, -0.5, -0.5);
  100. glVertex3f(-0.5, -0.5, -0.5);
  101. glVertex3f(-0.5, 0.5, -0.5);
  102. glVertex3f(-0.5, 0.5, -0.5);
  103. glVertex3f(-0.5, 0.5, 0.5);
  104. glEnd();
  105. glFlush();
  106. }
  107.  
  108. void threeD(int w, int h) {
  109. glViewport(0, 0, (GLsizei)w, (GLsizei)h);//调整视图窗口大小
  110. glMatrixMode(GL_PROJECTION);
  111. glLoadIdentity();
  112. glFrustum(-1.0, 1.0, -1.0, 1.0, 2.0, 10.0);
  113. glMatrixMode(GL_MODELVIEW);
  114.  
  115. }
  116.  
  117. int main(int argc, char *argv[]) {
  118.  
  119. //初始化GLUT library
  120. glutInit(&argc, argv);
  121. //对窗口的大小进行初始化
  122. glutInitWindowSize(500, 500);
  123. // 设置窗口出现的位置
  124. //glutInitWindowPosition(int x, int y);
  125. //初始化程序展示模式
  126. glutInitDisplayMode(GLUT_RGBA);
  127. glutCreateWindow("project of openGL");
  128. //为当前窗口设置函数回调,用于画图
  129. glutDisplayFunc(drawCube);
  130. //窗口改变时的函数
  131. glutReshapeFunc(threeD);
  132. glutMainLoop();
  133.  
  134. return 0;
  135. }

  可以调用openGL的glutWireCube(GLFloat size)来绘制立体正方形,如setCube函数。

  我想要实现带有黑色边缘的绿色正方体,必须对正方体进行绘制,如drawCube函数。

  实现效果:

  

  

openGL实现二维图形和三维图形的更多相关文章

  1. OpenGL屏幕二维坐标转化成三维模型坐标

    我们把OpenGL里模型的三维坐标往二维坐标的转化称为投影,则屏幕上的二维坐标往三维坐标转化则可以称为反投影,下面我们来介绍一下反投影的方法. 主要是gluUnProject函数的使用,下面是代码: ...

  2. TurboCAD Pro for Mac(二维绘图和三维建模工具)破解版安装

    1.软件简介    TurboCAD Pro 是 macOS 系统上一款二维绘图和三维建模工具,具备强大的绘图和设计特性,加上强大的创建复杂的三维模型的工具,三维 OpenGL 的渲染,和超过 11, ...

  3. php基础------将二维数组转三维数组

    将二维数组转为三维数组 /** * 二维数组转三维数组(指定键为三维数组的键名) * @param [type] $arr [要排序的数组] * @param [type] $key [指定的键] * ...

  4. UWP开发-二维变换以及三维变换

    在开发中,由于某些需求,我们可能需要做一些平移,缩放,旋转甚至三维变换,所以我来讲讲在UWP中这些变换的实现方法. 一. 二维变换: UIElement.RenderTransform a.Trans ...

  5. SuperMap 二维地图和三维场景弹窗窗口大小控制

    注:此处所说的弹窗窗口,主要指的是那些弹窗窗口中嵌入iframe,包含信息页面的窗口大小控制. 1.首先来了解下 SuperMap 示例中的处理方案 二维的处理方式 //初始化Anchored类 po ...

  6. matlab 画二维图与三维图

    二维图 ezplot('sin(x)');%默认范围 ezplot('sin(x)',[-4 4]);%自己设定范围 三维图 ezmesh('x*x+y*y');%默认范围

  7. 卷积神经网络(CNN)之一维卷积、二维卷积、三维卷积详解

    作者:szx_spark 由于计算机视觉的大红大紫,二维卷积的用处范围最广.因此本文首先介绍二维卷积,之后再介绍一维卷积与三维卷积的具体流程,并描述其各自的具体应用. 1. 二维卷积 图中的输入的数据 ...

  8. 数组(Array),二维数组,三维数组

    数组(Array):相同类型数据的集合就叫做数组. (一)定义数组的方法: A) type[] 变量名 = new type[数组中元素的个数] 例如: int[] a = new int[10] ; ...

  9. MATLAB二维插值和三维插值

    插值问题描述:已知一个函数上的若干点,但函数具体表达式未知,现在要利用已知的若干点求在其他点处的函数值,这个过程就是插值的过程. 1.一维插值 一维插值就是给出y=f(x)上的点(x1,y1),(x2 ...

随机推荐

  1. 提交按钮ajax方式

    function doSubmit2(){ $("#formobj").form("submit", { url : "sjsCorporationC ...

  2. Angular2 组件通信

    1. 组件通信 我们知道Angular2应用程序实际上是有很多父子组价组成的组件树,因此,了解组件之间如何通信,特别是父子组件之间,对编写Angular2应用程序具有十分重要的意义,通常来讲,组件之间 ...

  3. 定时器setInterval 开始、暂停、继续!

    活不多说,最近写这个定时器,,遇到了一些问题.然后上网百度.避免以后朋友遇到类似问题.贴出代码.... 最主要就是定义全局变量. 下面重要的我红色 标注出来. 批注:如 赋值代码,请给出源码地址.O( ...

  4. Java学习笔记__异常机制_try_catch_finally_return执行顺序

    package cn.xiaocangtian.Exception; import java.io.FileInputStream; import java.io.FileNotFoundExcept ...

  5. js原声快速实现选项卡

    var Rea = document.getElementById("rep"); var ReaAll = Rea.querySelectorAll("li" ...

  6. MongoVue中Collections无法显示的问题

    问题描述: 通过Python向MongoDB写入数据后,MongoVue中Collections无法显示的问题 原因: Mongodb 3.0之后默认的 storageEngine为wiredTige ...

  7. MongoDB 安装及其配置

    安装: 安装路径d:MongoDB较短便于后续操作 配置: 1.新建data文件夹并在data文件夹下新建db和log文件夹,路径如下 MongoDB\data\db MongoDB\data\log ...

  8. 【Java并发系列01】Thread及ThreadGroup杂谈

    img { border: solid black 1px } 一.前言 最近开始学习Java并发编程,把学习过程记录下.估计不是那么系统,主要应该是Java API的介绍(不涉及最基础的概念介绍), ...

  9. Linux IPTABLES端口转发

    之前在Linux上用普通用户部署了一个Tomcat,然后将其server.xml中的端口配置为80端口,用普通用户运行就提示绑定端口失败(permission denied),google了一下,原来 ...

  10. python-opencv笔记 图像的读取和简单几何图形绘制