Opengl超级宝典笔记——空间绘图画点
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> </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>
轉載于:https://my.oschina.net/sweetdark/blog/160230
總結
以上是生活随笔為你收集整理的Opengl超级宝典笔记——空间绘图画点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android布局中涉及的一些属性
- 下一篇: 20130909