<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> </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> </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> <gl/glut.h><br><span style="color: #cc6633">#include</span> <gl/gl.h><br><span style="color: #cc6633">#include</span> <math.h><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, &sizeStep);<br> GLfloat curStep = size[0];<br> <span style="color: #0000ff">for</span> (GLfloat a = 0.0; a < 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 <= 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(&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>经过 glGetFloatv(GL_POINT_SIZE_GRANULARITY, &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>app