几何物体可以用点来描述,我们可以通过OpenGL的api来了解一下

几何图形类型

其中以glBegin开始,glEnd结束

下图是采用不同类型的图形效果

为了熟悉上诉图形,下面来对每种图形进行测试

建立基础坐标系

在画图之前,首先要先建立坐标系,将以左下角为(0,0)点,如下图

窗体的大小则作为修剪的范围

void reshape (int w, int h)
{glViewport (0, 0, (GLsizei) w, (GLsizei) h);glMatrixMode (GL_PROJECTION);glLoadIdentity ();gluOrtho2D (0.0, (GLdouble) w, 0.0, (GLdouble) h);
}int main(int argc, char** argv)
{glutInit(&argc, argv);glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);glutInitWindowSize (400, 150); glutInitWindowPosition (100, 100);glutCreateWindow (argv[0]);init ();glutDisplayFunc(display); glutReshapeFunc(reshape);glutMainLoop();return 0;
}

GL_POINTS

Draws a point at each of the n vertices.
画7个点
示例1

void drawPoint1(void)
{int i;glColor3f (0.0, 0.0, 0.0);glBegin(GL_POINTS);for (i = 0; i < 7; i++)glVertex2f (20.0 + ((GLfloat) i * 20.0), 50.0);glEnd ();
}

点很小,几乎看不见
可以用glPointSize调整point的大小,如下。现在看起来清晰多了
示例2

void drawPoint2(void)
{int i;glColor3f (0.0, 0.0, 0.0);glPointSize(5);glBegin(GL_POINTS);for (i = 0; i < 7; i++)glVertex2f (20.0 + ((GLfloat) i * 20.0), 60.0);glEnd ();
}

GL_LINES

Draws a series of unconnected line segments.Segments are drawn between v0 and v1,between v2 and v3, and so on. If n is odd, the last segment is drawn between vn–3 and vn–2,and vn–1 is ignored.
如果将示例1的GL_POINTS更改为GL_LINES,那么将会有三条线,如下
示例3

void drawLine1(void)
{int i;glColor3f (0.0, 0.0, 0.0);glBegin(GL_LINES);for (i = 0; i < 7; i++)glVertex2f (20.0 + ((GLfloat) i * 20.0), 60.0);glEnd ();
}

注意:直线的绘制必须成对,一个点无法画一条线,上面第7个点无法画一条线

用glLineWidth设置线的宽度,如将上面的直线的宽度改为5

画点线(虚线,破折线)

上面画的直线可以称之为实线,除此之外还可以画虚线,

glLineStipple用于设置直线的点线模式,其有两个参数

第二个参数PATTERN是一个16进制的数,或者是转换为二进制的16位序列(若不足16位,以0补完)

如glLineStipple (1, 0x0101);  /*  dotted  */

从低位开始(即右侧的1开始),如果是1则绘制像素,0则留空
第一个参数是扩展因子,如上factor设置为2的话,那么将绘制2个像素,14个留空,可以观察下面效果以了解扩展因子,效果如下

如下示例4

   glEnable (GL_LINE_STIPPLE);glColor3f (0.0, 0.0, 0.0);glLineStipple (1, 0x0101);  /*  dotted  */drawOneLine (50.0, 125.0, 150.0, 125.0);glLineStipple (1, 0x00FF);  /*  dashed  */drawOneLine (150.0, 125.0, 250.0, 125.0);glLineStipple (1, 0x1C47);  /*  dash/dot/dash  */drawOneLine (250.0, 125.0, 350.0, 125.0);///* in 2nd row, 3 wide lines, each with different stipple */glLineWidth (5.0);glLineStipple (1, 0x0101);  /*  dotted  */drawOneLine (50.0, 100.0, 150.0, 100.0);glLineStipple (1, 0x00FF);  /*  dashed  */drawOneLine (150.0, 100.0, 250.0, 100.0);glLineStipple (1, 0x1C47);  /*  dash/dot/dash  */drawOneLine (250.0, 100.0, 350.0, 100.0);glLineWidth (1.0);
///* in 4th row, 6 independent lines with same stipple  */for (i = 0; i < 6; i++) {drawOneLine (50.0 + ((GLfloat) i * 50.0), 50.0,50.0 + ((GLfloat)(i+1) * 50.0), 50.0);}
//
///* in 5th row, 1 line, with dash/dot/dash stipple    */
///* and a stipple repeat factor of 5                  */glLineStipple (5, 0x1C47);  /*  dash/dot/dash  */drawOneLine (50.0, 25.0, 350.0, 25.0);glDisable (GL_LINE_STIPPLE);

效果如下

状态管理

在绘制点画线时,必须先开启其效果(glEnable),在使用完毕后关闭效果(glDisable )

如上面代码,在最开始的时候则调用glEnable (GL_LINE_STIPPLE)方法,结束后则调用glDisable (GL_LINE_STIPPLE);

GL_LINE_STRIP和GL_LINE_LOOP

GL_LINE_STRIP用于点之间的连线,GL_LINE_LOOP则在STRIP的基础上同时将第1个点和最后一个点连起来

示例5

void drawLineStrip()
{glColor3f (0.0, 0.0, 0.0);glPointSize(5);glBegin(GL_LINE_STRIP);glVertex2i(20,20);glVertex2i(30,50);glVertex2i(100,80);glVertex2i(120,40);glVertex2i(10,40);glEnd ();
}

如果换成GL_LINE_LOOP则效果如下

这篇将没讲完的几个类型讲完

画三角形

画三角形以不同顶点的连接有三种方式,但都是内部填充的方式

  1. GL_TRIANGLES如同GL_LINES一样,第一个三角形的点是V0,V1,V2,第二个则是V3,V4,V5,即是一个3的倍数
  2. GL_TRIANGLE_STRIP的填充方式犹如放弃前一个顶点,如第一个三角形V0,V1,V2,第二个则是V1,V2,V3(舍弃V0)
  3. GL_TRIANGLE_FAN的填充方式将永远以V0为起始点,如第一个三角形为V0,V1,V2,第二个则是V0,V2,V3

这里就不自己画了,上面的例子已经可以充分表达了

画四边形

有两种方式

其区别与画三角形相同,只不过STRIP是隔了2个顶点

画多边形

GL_POLYGON用于画多边形

多边形无法绘制非凸多边形,如下图

但可以用glPolygonMode函数改变多边形绘制的模式,绘制其轮廓

void drawpolygon()
{glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);glColor3f (0.0, 0.0, 0.0);glBegin(GL_POLYGON);glVertex2i(20,20);glVertex2i(30,10);glVertex2i(100,50);glVertex2i(120,100);glVertex2i(50,120);glVertex2i(50,60);glEnd ();
}

效果如下

转载于:https://www.cnblogs.com/Clingingboy/archive/2010/10/16/1853219.html

OpenGL 学习笔记(3)绘制几何物体相关推荐

  1. OpenGL学习笔记3 —— 绘制3D物体、鼠标交互、反向变换

    /* reference http://nehe.gamedev.net/article/using_gluunproject/16013/ */#include <windows.h> ...

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

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

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

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

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

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

  5. OpenGL学习笔记(一):环境搭建、三维空间坐标系理解以及OpenGL的基本使用

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

  6. OPENGL学习笔记之八

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

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

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

  8. OpenGL学习笔记(十三):将纹理贴图应用到四边形上,对VAO/VBO/EBO/纹理/着色器的使用方式进行总结

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

  9. Halcon 学习笔记五:几何定位+仿射变换+测量

    Halcon 学习笔记五:几何定位+仿射变换+测量 定位流程 例子一 例子二(药片的定位) 例子三(充电宝定位) 例子四(车牌定位) 其他 定位流程 blob分析 模板匹配 (仿射变换成标准的形状) ...

最新文章

  1. Sublime Text 提示[Decode error - output not utf-8]的解决方法
  2. spring cloud常用组件介绍
  3. 压测场景下的 TIME_WAIT 处理
  4. php文本数据库 搜索,一个文本数据库的搜索方法_php
  5. Android系统性能优化(56)---APP性能优化
  6. cacti mysql-bin_Cacti环境搭建(LNMP环境)
  7. Jenkins 配置邮箱 530Authentication required ,535 uthentication failed 的解决方法
  8. 【个人笔记】OpenCV4 C++ 快速入门 11课
  9. Photometric Stereo 光度立体三维重建(四)——光源标定
  10. 剪映怎么把无字幕的英文视频翻译成制作成中文字幕?(附教程+剪映字幕翻译工具免费下载)...
  11. 付款方对接银联入网仿真测试系统
  12. IRedMail 邮箱配置
  13. php 使用 谷歌验证器
  14. php过滤微信表情符号的正则表达式方法
  15. 2019暑假集训总结与记录
  16. 连环画教科书,电子版微积分
  17. 安卓开发——在应用中简单调用Android百度地图API SDK
  18. iOS 开发者证书、描述文件等详解
  19. 2002年计算机专业自考课程,全国2002年4月自考(课程代码:02384)计算机原理试题...
  20. R语言使用epiDisplay包的aggregate.plot函数可视化每个子集的汇总统计信息(可视化基于双变量分组下的中位数及其95%置信区间、病例组和对照组的差异)、lwd参数自定义线条的粗细宽度

热门文章

  1. voip 音频采集时间_数字音频基础------从PCM说起
  2. tf报错之raise TypeError(“pred must not be a Python bool“)
  3. 记录 之 tensorflow 常用函数:tf.split(),tf.clip_by_value() 和 tf.cond()
  4. ubuntu安装/查看已安装包的方法
  5. 左值和左值引用、右值和右值引用
  6. 8086汇编_除法指令
  7. Android-NDK-audio-echo
  8. c++11-noexcept
  9. java B锁_Java中15种锁的介绍
  10. 使用 graphviz 形象化有向图