[译]NeHe教程 - 你的第一个多边形
原文:?Your First Polygon
?
在第一節(jié)中我講解了如何創(chuàng)建OpenGL窗體.本節(jié)我會(huì)講解如何創(chuàng)建三角形和四邊形.我們會(huì)用GL_TRIANGLES來(lái)創(chuàng)建三角形,用GL_GUADS創(chuàng)建四邊形.
我們會(huì)添加到第一節(jié)代碼的DrawGLScene函數(shù)中.我會(huì)下面重新給出該函數(shù)的完整代碼.如果你打算在上一節(jié)的代碼中修改,你可以直接用以下代碼替換,或者增加上一節(jié)代碼沒(méi)有的部分.
int DrawGLScene(GLvoid) // Here's Where We Do All The Drawing {glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth BufferglLoadIdentity(); // Reset The View?
當(dāng)你調(diào)用glLoadIdentity函數(shù)時(shí),前端的動(dòng)作只是把視覺(jué)移回屏幕中間,其實(shí)就是在X軸從左到右,在Y軸從上到下,在Z軸從屏幕外部往內(nèi)部移動(dòng).
屏幕的中間是X,Y軸的0.0f.而左邊就是負(fù)值.右邊是正值.向屏幕的頂部移動(dòng)是正值,向底部移動(dòng)是負(fù)值.向屏幕的深處移動(dòng)是負(fù)值,向觀看者移動(dòng)是正值.
glTranslatef(x, y, z)沿著X, Y和Z軸移動(dòng).下面的是在X軸上向左移動(dòng)了1.5個(gè)單位.它在Y軸上沒(méi)有移動(dòng),并往屏幕內(nèi)部移動(dòng)了6.0個(gè)單位.當(dāng)你執(zhí)行時(shí),你會(huì)發(fā)現(xiàn)并不是從屏幕中間移動(dòng),而是從你當(dāng)前屏幕的位置移動(dòng).
glTranslatef(-1.5f,0.0f,-6.0f); // Move Left 1.5 Units And Into The Screen 6.0?
現(xiàn)在我們需要移動(dòng)到屏幕的左手邊,我們已經(jīng)設(shè)置好足夠深入屏幕(-6.0)的視覺(jué),可以看見(jiàn)創(chuàng)建三角形的整個(gè)場(chǎng)景.
glBegin(GL_TRIANGLES)的意思是我們要開(kāi)始繪制三角形,而glEnt()函數(shù)告知OpenGL我們已經(jīng)創(chuàng)建三角形完畢.通常來(lái)說(shuō),如果你要畫3個(gè)點(diǎn)的話可以用GL_TRIANGLES.大多數(shù)的顯卡畫三角形都是相當(dāng)快的.如果你要畫4個(gè)點(diǎn)可以用GL_QUADS.我聽(tīng)說(shuō)的是,大多數(shù)顯卡在后臺(tái)是以三角形為單位繪制物體的.最后如果你需要繪制超過(guò)4個(gè)點(diǎn)的話,可以用GL_POLYGON.
在我們的簡(jiǎn)單演示程序中,我們只畫了一個(gè)三角形.如果我們需要畫第二個(gè)三角形,我們可以直接追加三行新的位置代碼到原來(lái)的三行代碼后面.這樣6行代碼都嵌套在glBegin(GL_TRIANGLES)和glEnd()函數(shù)之間.不用每次畫3個(gè)點(diǎn)都用這兩個(gè)函數(shù)包含一次.四邊形也同理,如果你已經(jīng)知曉你要?jiǎng)?chuàng)建的所有四邊形的位置,你可以全部嵌套在glBegin(GL_TRIANGLES)和glEnd()函數(shù)之間.另一方面,多邊形(GL_POLYGON)可以由任意個(gè)點(diǎn)組成,所以你嵌套多少行代碼在glBegin(GL_POLYGON)和glEnd()之間都無(wú)所謂.
glBegin函數(shù)后面的第一行,是設(shè)置多邊形的第一個(gè)點(diǎn).頂點(diǎn)(glVertex)的第一個(gè)數(shù)值是X軸的值,第二個(gè)值是Y軸,第三個(gè)值是Z軸.第一個(gè)行中,我們不在X軸和Y軸上移動(dòng),只在Y軸上移動(dòng)一個(gè)單位.這個(gè)是三角形的頂部的點(diǎn).第二個(gè)頂點(diǎn)(glVertex)在X軸向左移動(dòng)了一個(gè)單位,在Y軸向下移動(dòng)了一個(gè)單位.這個(gè)是三角形的左下角的點(diǎn).第三個(gè)頂點(diǎn)(glVertex)向右移動(dòng)了一個(gè)單位,向下移動(dòng)了一個(gè)單位.這個(gè)是三角形右下角的點(diǎn).glEnd()函數(shù)告訴OpenGL已經(jīng)完成畫點(diǎn)了.然后填充的三角形會(huì)被顯示.
glBegin(GL_TRIANGLES); // Drawing Using TrianglesglVertex3f( 0.0f, 1.0f, 0.0f); // TopglVertex3f(-1.0f,-1.0f, 0.0f); // Bottom LeftglVertex3f( 1.0f,-1.0f, 0.0f); // Bottom Right glEnd(); // Finished Drawing The Triangle?
現(xiàn)在已經(jīng)有一個(gè)三角形顯示在屏幕的左邊的,我們要在右邊顯示正方形.為了做這步,要再次調(diào)用glTranslate函數(shù).這回是移動(dòng)到右邊,所以X是正值.之前已經(jīng)向左移動(dòng)了1.5個(gè)單位,這回要向右移動(dòng)1.5個(gè)單位.就是說(shuō)先會(huì)到中間點(diǎn),然后向右移動(dòng)1.5個(gè)單位.所以總共需要向右移動(dòng)3.0個(gè)單位.
glTranslatef(3.0f,0.0f,0.0f); // Move Right 3 Units?
現(xiàn)在來(lái)創(chuàng)建正方形.會(huì)用到GL_QUADS.四邊形顧名思義就是有4條邊的多邊形.四邊形屬性(GL_GUADS)最適合用來(lái)創(chuàng)建正方形.創(chuàng)建正方形的過(guò)程和創(chuàng)建三角形很像.就是用GL_GUADS代替GL_TRIANGLES,并且多了一組數(shù)值表示正方形的第4個(gè)點(diǎn).我們會(huì)以左上,右上,右下,左下(順時(shí)針?lè)较?的順序繪制.以順時(shí)針的順序繪制,正方形會(huì)被畫成一個(gè)背面.意思是,我們見(jiàn)到的四邊形的邊實(shí)際上是背面.逆時(shí)針繪制物體才是面向我們的.不過(guò)這些暫時(shí)不重要,這是遲點(diǎn)才需要注意的事.
glBegin(GL_QUADS); // Draw A QuadglVertex3f(-1.0f, 1.0f, 0.0f); // Top LeftglVertex3f( 1.0f, 1.0f, 0.0f); // Top RightglVertex3f( 1.0f,-1.0f, 0.0f); // Bottom RightglVertex3f(-1.0f,-1.0f, 0.0f); // Bottom LeftglEnd(); // Done Drawing The Quadreturn TRUE; // Keep Going }?
最后添加窗體/全屏模式的切換快捷鍵,順便加上窗體的標(biāo)題.
記得還要改"//Create Our OpenGL Window"注釋那行的代碼中的標(biāo)題.否則"全屏"窗體的標(biāo)題會(huì)和"窗體模式"的標(biāo)題不同.
if (keys[VK_F1]) // Is F1 Being Pressed? {keys[VK_F1]=FALSE; // If So Make Key FALSEKillGLWindow(); // Kill Our Current Windowfullscreen=!fullscreen; // Toggle Fullscreen / Windowed Mode// Recreate Our OpenGL Window ( Modified )if (!CreateGLWindow("NeHe's First Polygon Tutorial",640,480,16,fullscreen)){return 0; // Quit If Window Was Not Created } }?
轉(zhuǎn)載于:https://www.cnblogs.com/live41/p/3454290.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的[译]NeHe教程 - 你的第一个多边形的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 从学生心理入手
- 下一篇: Mac OS X安装之虚拟机环境下的总结