2019独角兽企业重金招聘Python工程师标准>>>

<h2>3D概念</h2> <ol> <li>像素,计算机显示器中的最小元素。 <li>3D画布,把可视区域看成一个3维的画布,可以用OpenGL命令在上面进行绘图。例如:glOrtho可以设置一个长方体的可视区域。谨记第二章说的:glOrtho是对之前的矩阵进行运算,所以一般都会在此函数之前调用glMatrixMode(GL_PROJECTION); glLoadIdentity(); </li></ol> <p><a href="http://static.oschina.net/uploads/img/201309/09220450_J4Gz.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201309/09220450_IXMV.png" width="793" height="422"></a></p> <h3>3D空间中的顶点</h3> <p>我们可以通过glVertex这个函数来设置多个参数多个类型的点。例如:glVertex2f(0.0f, 1.0f); glVertex3f(1.0f, 0.5f, 0.0f);</p> <p>在图形学中点不仅仅是一个点, OpenGL如何解释一个点,决定了根据这个点画出的几何图元。这里的点一般是图元中的顶点,比如矩形的顶点,曲线的顶点,线段的端点等。我们可以通过glBegin(GLenum mode); glEnd(); 来说明这两个函数之间顶点应当如何被解释。glBegin,glEnd像似{} 在此区域内的点将被解释。例如:</p> <p>&nbsp;</p> <div class="csharpcode-wrapper"><pre id="codeSnippet" class="csharpcode"><span class="rem">//画点</span><br>glBegin(GL_POINTS);<br> glVertex2f(3.0f, 4.0f);<br> glVertex2f(5.0f, 8.0f);<br>glEnd()<br><span class="rem">//画线,偶数2n个点画成 n条直线 2n+1奇数个的话,最后一个将被忽略</span><br>glBegin(GL_LINES);<br> glVertex2f(3.0f, 4.0f);<br> glVertex2f(5.0f, 8.0f);<br> glVertex2f(7.0f, 12.0f);<span class="rem">//此点将被忽略</span><br>glEnd();</pre></div> <div class="csharpcode-wrapper">注意glBegin()和glEnd()之间的缩进,这样是为了更容易寻找顶点源。是不成文的约定。</div> <div class="csharpcode-wrapper"><a href="http://static.oschina.net/uploads/img/201309/09220451_QVt5.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201309/09220451_zYHI.png" width="764" height="349"></a></div> <div class="csharpcode-wrapper"><br>&nbsp;</div> <h3>绘制图形</h3> <p>我们知道如何在OpenGL中指定一个点,并且告诉OpenGL如何对它进行操作。顶点的几何定义不仅仅是空间中的一个点,而是两条直线或曲线的交点。这就是图元的本质。</p> <p>图元是顶点的集合,它们构成了在屏幕上所绘制的形状。</p> <p>例子:</p> <p>用简单的三角方法绘制一些点,使它们绕着z轴呈现螺旋状。</p> <div id="codeSnippetWrapper"><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"><span style="color: #cc6633">#include</span> &lt;gl/glut.h&gt;<br><span style="color: #cc6633">#include</span> &lt;gl/gl.h&gt;<br><span style="color: #cc6633">#include</span> &lt;math.h&gt;<br><br><span style="color: #0000ff">static</span> GLfloat GL_PI = 3.14159f;<br><br><span style="color: #008000">//绘制场景</span><br><span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span> RenderSences()<br>{<br> GLfloat z = -50.0f; <br> <span style="color: #008000">//清空画布</span><br> glClear(GL_COLOR_BUFFER_BIT);<br> <span style="color: #008000">//设置画图使用的颜色</span><br> glColor3f(1.0f, 0.0f, 0.0f);<br> <span style="color: #008000">//保存矩阵</span><br> glPushMatrix();<br> <span style="color: #008000">//旋转, 如果不旋转,那些不同层次的点都重叠在一起,看不出3D效果了。</span><br> glRotatef(200.0f, 1.0f, 0.0f, 0.0f);<br> glRotatef(120.5f, 0.0f, 1.0f, 0.0f);<br> <span style="color: #008000">//获取点的大小的范围,以及增长的步长</span><br> GLfloat size[2];<br> GLfloat sizeStep;<br> glGetFloatv(GL_POINT_SIZE_RANGE, size);<br> glGetFloatv(GL_POINT_SIZE_GRANULARITY, &amp;sizeStep);<br> GLfloat curStep = size[0];<br> <span style="color: #0000ff">for</span> (GLfloat a = 0.0; a &lt; GL_PI * 3.0f; a += 0.1f)<br> {<br> GLfloat x = 50.0f * cos(a);<br> GLfloat y = 50.0f * sin(a);<br> <span style="color: #008000">//设置点的大小</span><br> glPointSize(curStep);<br> curStep += sizeStep;<br> <span style="color: #008000">//设置顶点</span><br> glBegin(GL_POINTS);<br> glVertex3f(x, y, z);<br> glEnd();<br> <span style="color: #008000">//调整z值</span><br> z += 0.5f;<br> }<br> glPopMatrix(); <br> glFlush();<br>}<br><br><span style="color: #0000ff">void</span> ChangeSize(GLsizei w, GLsizei h)<br>{<br> GLfloat nRange = 100.0f;<br> <span style="color: #0000ff">if</span> (h == 0)<br> {<br> h = 1;<br> }<br> <span style="color: #008000">//设置视口</span><br> glViewport(0, 0, w, h);<br> glMatrixMode(GL_PROJECTION);<br> glLoadIdentity();<br><br> <span style="color: #008000">//设置可视区域</span><br> GLfloat aspect = (GLfloat)w / (GLfloat)h;<br> <span style="color: #0000ff">if</span> (w &lt;= h)<br> {<br> glOrtho(-nRange, nRange, -nRange/aspect, nRange/aspect, -nRange, nRange);<br> }<br> <span style="color: #0000ff">else</span><br> {<br> glOrtho(-nRange*aspect, nRange*aspect, -nRange, nRange, -nRange, nRange);<br> }<br><br> glMatrixMode(GL_MODELVIEW);<br> glLoadIdentity();<br>}<br><span style="color: #008000">//初始化工作</span><br><span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span> SetupRC()<br>{<br> glClearColor(0.0f, 1.0f, 0.0f, 1.0f);<br>}<br><span style="color: #008000">//创建窗口</span><br><span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span> CreateWindow() {<br> glutInitWindowSize(200, 200);<br> glutCreateWindow(<span style="color: #006080">"3d Points"</span>);<br>}<br><br><span style="color: #0000ff">int</span> main(<span style="color: #0000ff">int</span> args, <span style="color: #0000ff">char</span> **argv)<br>{<br> glutInit(&amp;args, argv);<br> glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);<br> glutInitWindowSize(200, 200);<br> glutCreateWindow(<span style="color: #006080">"draw points"</span>);<br> SetupRC();<br> glutDisplayFunc(RenderSences); <br> glutReshapeFunc(ChangeSize);<br> glutMainLoop();<br> <span style="color: #0000ff">return</span> 0;<br>}<br></pre><br></div><pre><a href="http://static.oschina.net/uploads/img/201309/09220452_5fah.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201309/09220452_qWTR.png" width="234" height="244"></a></pre><pre><font face="微软雅黑">点的大小如果不指定的画,默认是1。点的大小的设置是存在限制的,不同的实现限制不同。可以通过</font></pre> <p>glGetFloatv(GL_POINT_SIZE_RANGE, size);</p> <p>获得点的大小的范围,size[0]为最小值,size[1]为最大值。</p> <p>通过&nbsp; glGetFloatv(GL_POINT_SIZE_GRANULARITY, &amp;sizeStep); 获得点大小之间的最小间隔。</p> <p><font style="background-color: #ffff00" color="#000000">PS:点和其他的几何图元不同,点不受透视除法的影响,即点离观察点近或远并不影响点最终投影到2d屏幕上的大小。另外点总是正方形的元素。为了获得圆点,必须在抗锯齿模式下绘制点。</font></p> <p><font style="background-color: #ffff00" color="#000000">另外需要注意的是glPointSize必须在glBegin和glEnd之外调用,并不是所有的函数在glBegin和glEnd之间调用都是合法的。 glPointSize所指定的点的大小并不是以像素为单位的,而是一个圆的近似直径,这个圆包含了这个点所使用的像素。</font></p>

转载于:https://my.oschina.net/sweetdark/blog/160230

Opengl超级宝典笔记——空间绘图画点相关推荐

  1. 【转】OpenGL超级宝典笔记——纹理映射Mipmap

    原文地址 http://my.oschina.net/sweetdark/blog/177812 , 感谢作者,若非法转载请联系本人. 目录[-] Mipmapping Mipmap过滤 构建Mip层 ...

  2. OpenGL 超级宝典笔记 —— 纹理高级(一)

    辅助颜色 一般情况下,我们设置纹理的环境为 GL_MODULATE 模式,在这种情况下,受到光照的几何图形会和纹理的颜色进行结合.正常情况下,OpenGL 进行光照计算,并根据标准的光照模型进行单个片 ...

  3. OpenGL超级宝典笔记——累积缓冲区与其他颜色操作

    2019独角兽企业重金招聘Python工程师标准>>> 累积缓冲区 OpenGL除了颜色缓冲区.深度缓冲区.模板缓冲区之外,还有累积缓冲区.累积缓冲区允许你把渲染到颜色缓冲区的值,拷 ...

  4. OpenGL超级宝典笔记——遮挡查询 [转]

    目录[-] 遮挡查询之前 包围体 遮挡查询 在一个场景中,如果有有些物体被其他物体遮住了不可见.那么我们就不需要绘制它.在复杂的场景中,这可以减少大量的顶点和像素的处理,大幅度的提高帧率.遮挡查询就是 ...

  5. OpenGL超级宝典笔记——光照参数与材料属性

    2019独角兽企业重金招聘Python工程师标准>>> <h3>添加光照</h3> <p>glEnable(GL_LIGHTING);</p ...

  6. OpenGL 超级宝典笔记 —— 雾

    应用雾 雾是 OpenGL 支持的一种易于使用的特殊效果.在使用雾时,OpenGL 把雾的颜色与完成所有其他颜色计算的几何图元进行混合.雾与几何图元的混合程度取决于几何图元离观察者的距离.雾可以使物体 ...

  7. OpenGL超级宝典(第7版)笔记20 统一变量 一致区块 uniform相关内容 清单5.9-5.28

    OpenGL超级宝典(第7版)笔记20 统一变量 一致区块 uniform相关内容 清单5.9-5.28 文章目录 OpenGL超级宝典(第7版)笔记20 统一变量 一致区块 uniform相关内容 ...

  8. OpenGL超级宝典学习笔记——操作矩阵

    为了更强大的功能和灵活性,我们有时需要直接操作矩阵.在OpenGL中4x4的矩阵用包含16个浮点数值的一维数组来表示,而不是用二维的4x4的数组来表示.OpenGL之所以这么做,因为使用一维数组更高效 ...

  9. OpenGL超级宝典(第7版)笔记4 渲染管线介绍 清单2.3-2.7

    OpenGL超级宝典(第7版)笔记4 渲染管线介绍 清单2.3-2.7 文章目录 OpenGL超级宝典(第7版)笔记4 渲染管线介绍 清单2.3-2.7 1 OpenGL简介 2 OpenGL渲染管线 ...

最新文章

  1. 探究oracle clob字段是怎样存储的
  2. spss主成分综合得分_【2020.】这种主成分得分图SPSS能够实现吗?
  3. (转)Python 用hashlib求中文字符串的MD5值
  4. 详细分析JVM内存模型
  5. Eclipse的基本设置
  6. 十招搞定SQL2K安全
  7. 新服务器安装和配置zabbix的playbook
  8. HTTP基本认证(Basic Authentication)的JAVA示例
  9. 时时流量查看工具-ifsta,nload,iftop
  10. 循序渐进Python3(十二) --2--  web框架之django简单实现oracle数据库操作
  11. mysql 的isnull
  12. Java之品优购课程讲义_day03(6)
  13. 苹果鼠标滚轮驱动_双飞燕血手幽灵V8M Max电竞鼠标兼具功能和性价比
  14. SqlServer安装Northwind数据库的通用方法
  15. 雷达动画在地图显示_本周在我们的雷达上:RebeccaPurple,动画等!
  16. matlab eigs 求特征值函数
  17. 3D产品展示程序-古董
  18. Idea--git合并多次commit为一个(合并提交)--实例
  19. mysql如何进行数据透视_使用MySQL的数据透视表
  20. Android 修改音量

热门文章

  1. laydate组件 无法传值_Vue组件通信的几种方式
  2. 自定义Word样式模板,设置为默认模板
  3. PyCharm安装及使用
  4. python 单线程_python的单线程多任务的实现
  5. mysql 重启io线程_MySQL IO线程及相关参数调优
  6. MySQL 笔记2 -- MySQL 基础
  7. python3精要(29)-reduce
  8. 【机器学习】Python机器学习的神器- Scikit-learn使用说明
  9. 开心一刻,你和导师之间有什么有趣的事情?
  10. 强化学习和最优控制的《十个关键点》81页PPT汇总