Opengl超級寶典筆記——空間繪圖畫點

<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>app

相關文章
相關標籤/搜索