《計(jì)算機(jī)圖形學(xué)》上機(jī)實(shí)驗(yàn)指導(dǎo)_第1頁(yè)
《計(jì)算機(jī)圖形學(xué)》上機(jī)實(shí)驗(yàn)指導(dǎo)_第2頁(yè)
《計(jì)算機(jī)圖形學(xué)》上機(jī)實(shí)驗(yàn)指導(dǎo)_第3頁(yè)
《計(jì)算機(jī)圖形學(xué)》上機(jī)實(shí)驗(yàn)指導(dǎo)_第4頁(yè)
《計(jì)算機(jī)圖形學(xué)》上機(jī)實(shí)驗(yàn)指導(dǎo)_第5頁(yè)
已閱讀5頁(yè),還剩26頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

KMUSTTeachingRecords昆明理工高?!渡蠙C(jī)實(shí)驗(yàn)指導(dǎo)書(shū)》課程名稱:計(jì)算機(jī)圖形學(xué)所在系(部):國(guó)資院測(cè)繪系學(xué)年學(xué)期:2012—2013學(xué)年第2學(xué)期授課專業(yè)班級(jí):地信101/土管101/測(cè)繪101班級(jí)人數(shù):27/24/56講授老師:李向新教材名稱:計(jì)算機(jī)圖形學(xué)課程總學(xué)時(shí):64;總學(xué)分:理論學(xué)時(shí):38;實(shí)驗(yàn)(或?qū)嵺`)學(xué)時(shí):上機(jī)學(xué)時(shí):32;輔導(dǎo)(或答疑)學(xué)時(shí):系主任簽章:

第1部分計(jì)算機(jī)圖形學(xué)上機(jī)實(shí)驗(yàn)大綱1。1目的與任務(wù)計(jì)算機(jī)圖形學(xué)上機(jī)是計(jì)算機(jī)圖形學(xué)課程的組成部分之一,是掌握計(jì)算機(jī)圖形學(xué)課程內(nèi)容的一個(gè)重要實(shí)踐環(huán)節(jié)。通過(guò)上機(jī)實(shí)驗(yàn),一方面可以讓同學(xué)鞏固課堂所學(xué)的計(jì)算機(jī)圖形學(xué)基礎(chǔ)理論,另一方面能讓同學(xué)掌握基本的OpenGL的編程方法及技能,掌握使用OpenGL繪制基本圖形,進(jìn)行2D及3D維圖形變換,生成曲線曲面及構(gòu)建具有真實(shí)感的3D場(chǎng)景。1.2基本要求1.了解OpenGL在計(jì)算機(jī)圖形學(xué)中的應(yīng)用基礎(chǔ)知識(shí)。2。掌握基本的OpenGL的編程方法及技能.3.學(xué)會(huì)使用OpenGL繪制基本圖形。4.學(xué)會(huì)使用OpenGL進(jìn)行2D及3D維圖形變換、生成曲線曲面及構(gòu)建具有真實(shí)感的3D場(chǎng)景。1.3內(nèi)容及學(xué)時(shí)支配上機(jī)1:glut工具包的安裝及使用2學(xué)時(shí)上機(jī)2:OpenGL編程練習(xí)2學(xué)時(shí)上機(jī)3:OpenGL中基本幾何圖形的繪制2學(xué)時(shí)上機(jī)4:二維圖形變換編程練習(xí)2學(xué)時(shí)上機(jī)5:交互式繪圖技術(shù)編程練習(xí)2學(xué)時(shí)上機(jī)6:三維圖形變換編程練習(xí)2學(xué)時(shí)上機(jī)7:OpenGL三維物體表示編程練習(xí)2學(xué)時(shí)上機(jī)8:真實(shí)感圖形的生成與處理上機(jī)2學(xué)時(shí)合計(jì)16學(xué)時(shí)1。4教學(xué)參考書(shū)(1)成思源等編著:計(jì)算機(jī)圖形學(xué),冶金工業(yè)出版社,2003。(2)(美)安杰爾(EdwardAngel)著;李桂瓊,張文祥譯:OpenGL程序設(shè)計(jì)指南(其次版),北京:清華高校出版社,2005。(3)EdwardAngel:InteractiveComputerGraphics-ATop-DownApproachwithOpenGL,ThirdEdition,PearsonEducation,Inc。,2003.(4)F。S.Hill,JR:ComputerGraphicsUsingOpenGLSecondEdition,PearsonEducation,Inc.,2003。(5)JamesD.Foleyetal.:ComputerGraphics—PrinciplesandPractice,SecondEditioninC,PearsonEducation,Inc。,2002。(6)朱家義:VisualC++程序設(shè)計(jì),機(jī)械工業(yè)出版社,2003。(7)和平鴿工作室編:三維圖形系統(tǒng)—開(kāi)發(fā)與有用技術(shù),清華高校出版社,2003.第2部分上機(jī)實(shí)驗(yàn)指導(dǎo)內(nèi)容及參考代碼2。1上機(jī)1:glut工具包的安裝及使用(2學(xué)時(shí))1.目的要求:熟識(shí)OpenGL的應(yīng)用工具包GLUT的安裝和使用。2。實(shí)驗(yàn)內(nèi)容:在VC++6.0環(huán)境中,編寫(xiě)一程序繪制GLUT中的三維茶壺模型,并上機(jī)運(yùn)行.3。主要儀器設(shè)備及軟件PC計(jì)算機(jī),VC++6.0,GLUT庫(kù)4、內(nèi)容及要求1)下載和安裝GLUT工具。見(jiàn)附注(1)、(2).2)編寫(xiě)一程序繪制GLUT中的三維茶壺模型。目的在于理解和體會(huì)在VC++6。0環(huán)境下OpenGL編程的基本步驟。見(jiàn)附注(3)3)工程名稱和C++源文件名稱為teapot_同學(xué)姓名(中文)(如teapot_徐航)。4)編譯、連接、運(yùn)行完成后將工程文件(擴(kuò)展名為.dsp的文件)和程序源文件(擴(kuò)展名為.cpp的文件)打包壓縮(壓縮包的文件名為你的班級(jí)姓名學(xué)號(hào),如:GIS101徐航200810103106)。將壓縮后的文件發(fā)給學(xué)委,學(xué)委再將全班的收集后打包壓縮,發(fā)送至lxxjpn@qq.com.郵件主題名稱為上機(jī)一班級(jí)姓名(如:上機(jī)1_GIS101)。附注(1):關(guān)于OpenGLOpenGL(“OpenGraphicsLibrary”)是圖形硬件的軟件接口。OpenGL包括大約250個(gè)不同的函數(shù),程序員可以使用這些函數(shù)設(shè)定要繪制的物體和操作,來(lái)制作交互的三維應(yīng)用程序。OpenGL是專業(yè)圖形處理,科學(xué)計(jì)算等高端應(yīng)用領(lǐng)域的標(biāo)準(zhǔn)圖形庫(kù)。它的主要競(jìng)爭(zhēng)對(duì)手是微軟的Direct3D.OpenGL曾長(zhǎng)期處于技術(shù)上的領(lǐng)先地位,但近年來(lái)Direct3D也迎頭趕上。目前這兩種圖形API在性能上可說(shuō)是旗鼓相當(dāng)。不過(guò)OpenGL支持眾多的操作系統(tǒng),而Direct3D只在Windows平臺(tái)上可用.因此OpenGL仍然廣受矚目.你可以在OpenGL的官方網(wǎng)站http://www.OpenGL.org的Documentation中下載到官方教程和例子程序:TheOpenGLProgrammingGuide,這就是聞名的redbook(“紅皮書(shū)")。如果你英語(yǔ)不好,那么推舉你閱讀:《OpenGL超級(jí)寶典》是一本相當(dāng)不錯(cuò)的中文教程。可以在http://www.vrforum.cn/forumdisplay。php?fid=29找到它的例子代碼《OpenGL編程權(quán)威指南》是redbook的中文譯本,它的例子也就是redbook的例子.附注(2):怎樣安裝GLUT庫(kù)?OpenGL的例子大都需要用到OpenGL應(yīng)用工具包:GLUT庫(kù),下面講講怎樣安裝它:Windows下VC++6。0下的安裝:1.下載GLUT庫(kù):http://www。opengl.org/resources/libraries/glut/glutdlls37beta.zip2.將壓縮包內(nèi)的glut。h放到C:\ProgramFiles\MicrosoftVisualStudio\VC98\Include\GL名目下glut32.lib放到C:\ProgramFiles\MicrosoftVisualStudio\VC98\Lib名目下glut32.dll放到C:\windows\systom32名目下。附注(3):Windows下的VC++環(huán)境中創(chuàng)建簡(jiǎn)潔的OpenGL程序基本過(guò)程(設(shè)所要?jiǎng)?chuàng)建的文件名為ex1)完成GLUT庫(kù)的安裝后,在VC++6。0環(huán)境下創(chuàng)建一個(gè)OpenGL程序并運(yùn)行:1)打開(kāi)VC++應(yīng)用程序,在主菜單的“文件(File)”菜單下選擇“新建(New)”選項(xiàng)。這時(shí)會(huì)彈出一個(gè)窗口,在彈出的窗口中選擇“文件(Files)”卡。2)在“文件(Files)”卡的窗口中選擇C++SourceFile。在右邊健入要建立的文件名(如ex1),并選擇存儲(chǔ)路徑,(如D:\),完成后按確定,進(jìn)入源代碼編輯窗口。注意,為了使生成的文件不會(huì)搞亂,最好事先在D盤(pán)下創(chuàng)建一個(gè)文件夾(如D:\EX1),保存exl文件。3)在源代碼窗口內(nèi)寫(xiě)入程序源代碼。4)完成后按Ctrl+F7(Link),這時(shí)VC++會(huì)提示你是否創(chuàng)建工程,請(qǐng)選擇是(yes),則自動(dòng)建立工程文件ex15)在編譯連接之前,先進(jìn)入主菜單的“工程(Project)”菜單,選中Settings,設(shè)置工程的編譯和和連結(jié)選項(xiàng)。6)在ProjectSetting對(duì)話框中,選“連結(jié)(Link)”卡,在改選項(xiàng)卡中的“Objiect\librarymodules”一欄中加入opengl32。lib、glu32.lib、glut32.lib這三個(gè)OpenGL的連接庫(kù)。單擊OK按鈕,此工程文件就可以在OpenGL要求的環(huán)境中進(jìn)行編譯了。7)在Build菜單中選中Compile或Build進(jìn)行編譯連接。8)選中Build菜單中的Execute執(zhí)行。5、參考代碼#include〈windows.h>#include〈gl/glut.h〉/*背景顏色設(shè)置函數(shù)*/voidini(){ glClearColor(1.0,1。0,1。0,1。0);//設(shè)置背景顏色為白色}/*繪制茶壺的線框圖函數(shù)*/voidRenderScene(void){?glClear(GL_COLOR_BUFFER_BIT);//用設(shè)定的顏色來(lái)刷新指定的緩沖區(qū)?glColor4f(0。0,0.0,1.0,1。0);//設(shè)置作圖顏色為藍(lán)色?glutWireTeapot(0。5);//繪制一個(gè)茶壺的線框圖 glFlush();//刷新OpenGL中的命令隊(duì)列和緩沖區(qū),使全部未被執(zhí)行的OpenGL命令得到執(zhí)行}voidmain(intargc,char**argv){?glutInit(&argc,argv);//初始化GLUT庫(kù)?glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//設(shè)置窗口顯示為單緩沖RGB顏色模式?glutInitWindowSize(600,600);//設(shè)置窗口大小為600*600glutInitWindowPosition(100,100);//設(shè)置窗口左上角坐標(biāo)為(100,100)?glutCreat(yī)eWindow("Teapot");//窗口名稱為Teapotini();//調(diào)用函數(shù)ini()設(shè)置背景為白色 glutDisplayFunc(RenderScene);//調(diào)用繪制茶壺的線框圖函數(shù)glutMainLoop();//開(kāi)頭運(yùn)行程序}2.2上機(jī)2:OpenGL編程初步練習(xí)(2學(xué)時(shí))1.目的要求:熟識(shí)OpenGL中基本幾何圖形點(diǎn)和線的繪制方法。2。實(shí)驗(yàn)內(nèi)容:完成綜合練習(xí)三中7題的上機(jī)作業(yè).3.主要儀器設(shè)備及軟件PC計(jì)算機(jī),VC++6.0,GLUT庫(kù)4.上機(jī)內(nèi)容及要求編寫(xiě)一個(gè)程序,在藍(lán)色窗口中繪制一紅色的正方形,且正方形大小可隨窗口尺寸轉(zhuǎn)變而調(diào)整.(代碼可參考教科書(shū)p305的內(nèi)容。)2。3上機(jī)3:OpenGL中基本幾何圖形的繪制(2學(xué)時(shí))1.目的要求:熟識(shí)OpenGL中多邊形的繪制及填充方法。2.實(shí)驗(yàn)內(nèi)容:在VC++6。0環(huán)境中編寫(xiě)一程序,用不同的方式繪制多邊形,并上機(jī)運(yùn)行.3.主要儀器設(shè)備及軟件PC計(jì)算機(jī),VC++6.0,GLUT庫(kù)4.參考代碼#include〈windows.h>#include<GL/glut。h>voidmyinit(void){?/*設(shè)置背景顏色*/?glClearColor(1.0,1.0,1.0,0.0);}voidDrawPolygon(){?glBegin(GL_POLYGON);?glVertex2f(20。0,10.0);?glVertex2f(60.0,30.0);?glVertex2f(70.0,45.0); glVertex2f(40.0,75.0);?glVertex2f(10.0,60.0);?glEnd();}voiddisplay(void){?GLubytefly[]={?0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,?0x03,0x80,0x01,0xC0,0x06,0xC0,0x03,0x60, 0x04,0x60,0x06,0x20,0x04,0x30,0x0C,0x20,?0x04,0x18,0x18,0x20,0x04,0x0C,0x30,0x20,?0x04,0x06,0x60,0x20,0x44,0x03,0xC0,0x22,?0x44,0x01,0x80,0x22,0x44,0x01,0x80,0x22, 0x44,0x01,0x80,0x22,0x44,0x01,0x80,0x22,?0x44,0x01,0x80,0x22,0x44,0x01,0x80,0x22,?0x66,0x01,0x80,0x66,0x33,0x01,0x80,0xCC,?0x19,0x81,0x81,0x98,0x0C,0xC1,0x83,0x30,?0x07,0xe1,0x87,0xe0,0x03,0x3f,0xfc,0xc0, 0x03,0x31,0x8c,0xc0,0x03,0x33,0xcc,0xc0, 0x06,0x64,0x26,0x60,0x0c,0xcc,0x33,0x30,?0x18,0xcc,0x33,0x18,0x10,0xc4,0x23,0x08,?0x10,0x63,0xC6,0x08,0x10,0x30,0x0c,0x08, 0x10,0x18,0x18,0x08,0x10,0x00,0x00,0x08}; glClear(GL_COLOR_BUFFER_BIT); /*設(shè)置線段的顏色*/ glColor3f(0.0,0.0,0。0);?/*第一個(gè)多邊形采納點(diǎn)繪制*/?glPolygonMode(GL_FRONT,GL_POINT);?glTranslatef(20.0,10.0,0。0);//平移?DrawPolygon();?/*其次個(gè)多邊形采納線繪制*/ glPolygonMode(GL_FRONT,GL_LINE);?glTranslatef(90.0,0.0,0。0);//平移?DrawPolygon(); /*第三個(gè)多邊形采納填充模式繪制*/ glPolygonMode(GL_FRONT,GL_FILL);?glTranslat(yī)ef(90.0,0.0,0.0);//平移?DrawPolygon();?/*第四個(gè)多邊形為逆時(shí)針?lè)较?,并舍棄其背面*?glFrontFace(GL_CW);//指定多邊形的正面,GL_CK順時(shí)針正面?glCullFace(GL_BACK);//指明何種多邊形在轉(zhuǎn)換成屏幕坐標(biāo)時(shí)要?jiǎng)h除,GL_BACK背面,cull選擇?glEnable(GL_CULL_FACE);//激活GL_CULL_FACE?glTranslatef(-190.0,80.0,0.0);?DrawPolygon();/*第五個(gè)多邊形采納畫(huà)模式繪制*/ glFrontFace(GL_CCW);//指定多邊形的GL_CCK逆時(shí)針?lè)疵?glEnable(GL_POLYGON_STIPPLE);//激活GL_POLYGON_STIPPLE??glPolygonStipple(fly); glTranslatef(90.0,80。0,0.0);?DrawPolygon(); glFlush();}voidmyreshape(intw,inth){?glViewport(0,0,(GLsizei)w,(GLsizei)h);?glMatrixMode(GL_PROJECTION);?glLoadIdentity();?gluOrtho2D(0.0,(GLdouble)w,0.0,(GLdouble)h);}intmain(intargc,char**argv){ glutInit(&argc,argv);?glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);?glutInitWindowSize(300,300);?glutInitWindowPosition(150,150); glutCreat(yī)eWindow("Polygon”);?myinit();?glutDisplayFunc(display);?glutReshapeFunc(myreshape);?glutMainLoop(); return0;}2.4上機(jī)4:二維圖形變換編程練習(xí)(2學(xué)時(shí))1。目的要求:熟識(shí)OpenGL中多邊形的繪制及填充方法。2.實(shí)驗(yàn)內(nèi)容:在VC++6.0環(huán)境中編寫(xiě)一二維圖形變換程序,并上機(jī)運(yùn)行。3.主要儀器設(shè)備及軟件PC計(jì)算機(jī),VC++6.0,GLUT庫(kù)4.要求:對(duì)頂點(diǎn)為V1V2V3的三角形進(jìn)行平移、旋轉(zhuǎn)、比例、錯(cuò)切等基本變換;并分別用不同的線型繪制變換后的三角形。三角形頂點(diǎn)的坐標(biāo)為:V1(20。0,20.0),V2(80.0,30。0),V3(50.0,70。0).5.參考代碼:#include〈windows.h>#include〈GL/glut。h>voidmyinit(void){glClearColor(1。0,1.0,1。0,0。0);//設(shè)置背景顏色為白色}/*繪制三角形*/voidDrawTriangle(){glBegin(GL_TRIANGLES);glVertex2f(20.0,20。0);glVertex2f(80.0,30.0);glVertex2f(50.0,70.0);glEnd();}voiddisplay(void){glClear(GL_COLOR_BUFFER_BIT);glColor3f(0。0,0.0,1。0);//設(shè)置線段的顏色為黑色/*第一個(gè)三角形用實(shí)線繪制*/glPolygonMode(GL_FRONT,GL_LINE);//正面,線填充DrawTriangle();?glColor3f(1。0,0。0,0.0);//設(shè)置線段的顏色為黑色/*其次個(gè)三角形采納虛線繪制*/glMatrixMode(GL_M(jìn)ODELVIEW);glLoadIdentity();glEnable(GL_LINE_STIPPLE);glLineStipple(1,0xF0F0);glTranslatef(90.0,0.0,0。0);//平移變換DrawTriangle();?glColor3f(0。0,1.0,0.0);//設(shè)置線段的顏色為黑色 ?/*第三個(gè)三角形采納點(diǎn)繪制*/glLoadIdentity();glLineStipple(1,0x8888);glTranslatef(20.0,80.0,0.0);//平移變換glScalef(0.5,1.5,1.0);//比例變換DrawTriangle(); glColor3f(0.5,0。5,0。0);//設(shè)置線段的顏色為黑色/*第四個(gè)三角形采納長(zhǎng)虛線繪制*/glLoadIdentity();glLineStipple(1,0xF00F);glTranslatef(110.0,90.0,0.0);//平移變換glRotat(yī)ef(30,0.0,0.0,1.0);//旋轉(zhuǎn)變換DrawTriangle();glDisable(GL_LINE_(tái)STIPPLE);glFlush();}voidmyreshape(intw,inth){glViewport(0,0,(GLsizei)w,(GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0。0,(GLdouble)w,0。0,(GLdouble)h);}intmain(intargc,char**argv){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(200,200);glutInitWindowPosition(200,200);glutCreateWindow("Transform");myinit();glutDisplayFunc(display);glutReshapeFunc(myreshape);glutMainLoop();return0;}2.5上機(jī)5:交互式繪圖技術(shù)編程練習(xí)(2學(xué)時(shí))1.目的要求:熟識(shí)OpenGL中多邊形的繪制及填充方法。2.實(shí)驗(yàn)內(nèi)容:在VC++6。0環(huán)境中的OpenGL交互式繪圖技術(shù)編程練習(xí),并上機(jī)運(yùn)行。3.主要儀器設(shè)備及軟件PC計(jì)算機(jī),VC++6.0,GLUT庫(kù)4.要求:本上機(jī)實(shí)驗(yàn)由三部分組成.第一部分:是書(shū)中6。4。1中的例題,主要練習(xí)用鼠標(biāo)選擇。在該程序中,drawSphere()分別繪制了四個(gè)圓球,并分別給它們命名為1、2、3和4。然后進(jìn)行選擇模式,并建立鼠標(biāo)回調(diào)函數(shù):glutMouseFunc(MouseCallback);在鼠標(biāo)響應(yīng)函數(shù)MouseCallback()中,通過(guò)按下鼠標(biāo)左鍵,調(diào)用以下語(yǔ)句在鼠標(biāo)位置周圍建立一個(gè)局部的觀察空間:gluPickMatrix(x,Viewport[3]-y,2,2,Viewport);在該空間下,推斷與之相交的球體:drawSphere(GL_SELECT);如某一球體與該觀察空間有相交,則被選中.最后退出選擇模式,并返回選中記錄:hits=glRenderMode(GL_RENDER);其次部分:用鼠標(biāo)選擇的程序Pick第三部分:參照其次部分pick。cpp代碼,修改第一部分的Select。cpp代碼,輸出hits的值,并打印所選球體的顏色.第一部分參考代碼:用鼠標(biāo)選擇的程序(Select)#include<windows.h〉#include〈GL/glut.h>//myinit()的功能為:激活深度比較功能,指定刷新緩沖區(qū)的顏色voidmyinit(){glEnable(GL_DEPTH_TEST);/*激活OpenGL的GL_DEPTH_TEST功能,進(jìn)行深度比較操作并更新深度緩沖區(qū)*/glClearColor(0.0f,0.0f,0.0f,1。0f);/*指定當(dāng)用glClear()清除顏色緩沖區(qū)時(shí)用的R、G、B、alpha值*/}//繪圖函數(shù)voiddrawSphere(GLenummode)/*mode為一GL枚舉類型的變量(如果一個(gè)變量你需要幾種可能//存在的值,就可以被定義成為枚舉類型).mode可以?。海牵蹋逺ENDER渲染模式、GL_SELECT選擇模式、GL_FEEDBACK反饋模式*/{?glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);/*用GL_COLOR_BUFFER_BIT和GL_DEPTH_BUFFER_BIT的二進(jìn)制規(guī)律或操作屏蔽指定的緩沖區(qū),從而用glClearColor()設(shè)定的顏色值清除該緩沖區(qū).*/glMatrixMode(GL_MODELVIEW);/*指定后續(xù)矩陣操作的對(duì)像是模式取景矩陣堆棧。*/ glPushMatrix();/*把當(dāng)前的矩陣棧壓下一層,把當(dāng)前的矩陣復(fù)制后放入當(dāng)前層。*/ //初始化名稱堆棧?glInitNames();/*在選擇模式中,名稱堆棧是區(qū)分繪圖命令集中的命令的唯一標(biāo)志。它由一個(gè)有序的的無(wú)符號(hào)整數(shù)集所構(gòu)成.glInitNames()的作用是將它初始化成其默認(rèn)的空堆棧*/glPushName(0);/*將0壓入名稱堆棧的頂部*/? //將第一個(gè)球體命名為l?glTranslatef(—3.0f,-2。0f,—10.0f);/*把當(dāng)前矩陣乘上一個(gè)平移矩陣,產(chǎn)生x=—3。0,y=-2,z=-10。0的平移*/?glColor3f(1.0,0.0,0。0);/*設(shè)置當(dāng)前顏色*/if(mode==GL_SELECT)glLoadName(1);/*如果是mode=GL_SELECT則載入名稱1到名稱堆棧中,即用1來(lái)替換名稱堆棧棧頂值。否則執(zhí)行下句*/glutSolidSphere(1.0f,35,35);/*繪制一個(gè)半徑為1。0球心在原點(diǎn),經(jīng)線數(shù)35,緯線數(shù)35的球*/??//將其次個(gè)球體命名為2 glColor3f(1.0,0。0,1。0);/*設(shè)置當(dāng)前顏色*/?glPushMatrix();/*把當(dāng)前的矩陣棧壓下一層,把當(dāng)前的矩陣復(fù)制后放入當(dāng)前層.*/glTranslatef(3.0f,2。0f,0.0f);/*把當(dāng)前矩陣乘上一個(gè)平移矩陣,產(chǎn)生x=3.0,y=2,z=0。0的平移*/if(mode==GL_SELECT)glLoadName(2);/*如果是GL_SELECT則執(zhí)行下句,加載2到棧頂.否則跳過(guò)下句執(zhí)行再下句*/glutSolidSphere(1。5f,35,30);/*繪制一個(gè)半徑為1.5,球心在原點(diǎn),經(jīng)線數(shù)35,緯線數(shù)30的球*/ glPopMatrix();??//將第三個(gè)球體命名為3 glPushMatrix(); glColor3f(0。0,1.0,0.0);?glTranslatef(5.0f,5。0f,0。0f);?if(mode==GL_SELECT)glLoadName(3);?glutSolidSphere(0.5f,30,30);?glPopMatrix();?//將第四個(gè)球體命名為4glPushMatrix();glColor3f(0.0,0.0,1。0);glTranslatef(5。0f,0。0f,0。0f);if(mode==GL_SELECT)glLoadName(4);glutSolidSphere(0。4f,30,30);glPopMatrix();}//定義鼠標(biāo)響應(yīng)函數(shù)#defineBUFFER_LENGTH64/*定義宏BUFFER_LENGTH的值為64*/voidMouseCallback(intbutton,intstate,intx,inty)/*鼠標(biāo)響應(yīng)函數(shù)名稱為MouseCallback(),該函數(shù)須包含三個(gè)參數(shù):button--取值為GLUT_LEFT_BUTTON或GLUT_RIGHT_BUTTON;stata-—取值為GLUT_DOWN或GLUT_UP;x,y-—鼠標(biāo)當(dāng)前位置的坐標(biāo)值。*/{GLuintselectBuff[BUFFER_LENGTH];/*定義一個(gè)數(shù)組selectBuff[],類型為無(wú)符號(hào)整型,長(zhǎng)度為BUFFER_LENGTH*/GLinthits,viewport[4];/*定義一個(gè)整型變量hits記錄選中的圖形數(shù),整型數(shù)組viewport[]長(zhǎng)度為4.*/if(button!=GLUT_LEFT_BUTTON&&state?。剑牵蘒T_DOWN)return;/*如果沒(méi)有按下左鍵則return,否則執(zhí)行下句*/?//建立選擇數(shù)組glSelectBuffer(BUFFER_LENGTH,selectBuff);/*為選擇模式產(chǎn)生的值建立一個(gè)緩沖區(qū)。說(shuō)明:函數(shù)glSelectBuffer(GLsizeisize,GLfloat*buffer)的功能—-為選擇模式建立一個(gè)緩沖區(qū),存儲(chǔ)返回選擇數(shù)據(jù).緩沖區(qū)的大小為size,buffer是一個(gè)指向無(wú)符號(hào)整型數(shù)組的指針。selectBuff為指向數(shù)組selectBuffer[]的首地址的指針。*/?? //獲得當(dāng)前觀察邊界坐標(biāo)glGetIntegerv(GL_VIEWPORT,viewport);/*說(shuō)明:函數(shù)GetIntegerv(GLenumpname,Glint*params)當(dāng)pname取GL_VIEWPORT時(shí),參數(shù)params返回4個(gè)值,這些值分別代表視口的x和y窗口坐標(biāo)及它的寬度和高度.*/glMatrixMode(GL_PROJECTION);/*指定后續(xù)矩陣操作的對(duì)象是投影矩陣堆棧。*/?glPushMatrix();/*把當(dāng)前的矩陣棧壓下一層,把當(dāng)前的矩陣復(fù)制后放入當(dāng)前層.*/???//進(jìn)入選擇模式glRenderMode(GL_SELECT);/*函數(shù)glRenderMode(GLenummode)用于設(shè)置光柵化的模式.參數(shù)mode可取GE_SELECT\GL_Render\GL_FEEDBACK三種.GL_SELECT模式下,不產(chǎn)生像素片段,也不轉(zhuǎn)變幀緩存區(qū)中的內(nèi)容。其返回值是由調(diào)用該函數(shù)時(shí)的繪圖模式而不是由參數(shù)mode決定的。三種繪圖模式的返回值如下:GL_Render=0;GL_FEEDBACK=傳送到反饋緩沖區(qū)的值的個(gè)數(shù);GL_SELECT=傳送到選擇緩沖區(qū)的命中記錄個(gè)數(shù)。*/?glLoadIdentity();/*用單位矩陣替換當(dāng)前的矩陣*/ ??//在鼠標(biāo)位置周圍建立一個(gè)局部觀察區(qū)域?gluPickMatrix(x,viewport[4]-y,2,2,viewport);/*函數(shù)gluPickMat(yī)rix(GLdoublex,指定窗口坐標(biāo)中的一個(gè)局部觀察區(qū)域中點(diǎn)的x坐標(biāo)? GLdoubley,指定窗口坐標(biāo)中的一個(gè)局部觀察區(qū)域中點(diǎn)的y坐標(biāo)??GLdoubledelX,指定窗口坐標(biāo)中的一個(gè)局部觀察區(qū)域的寬度??GLdoubledelY,指定窗口坐標(biāo)中的一個(gè)局部觀察區(qū)域的高度??GLint*viewport指定當(dāng)前視口(從調(diào)用函數(shù)glGetIntegerv()時(shí)起) ?);*/?/*建立一個(gè)投影矩陣,該矩陣可以用來(lái)限制在視口中的一個(gè)較小的范圍內(nèi)進(jìn)行的繪圖操作,可以有效地確定光標(biāo)四周的那些對(duì)象將被繪出。用例程gluPickMatrix()來(lái)約束光標(biāo)四周的一個(gè)小范圍中的繪之操作。*/?gluPerspective(45.0f,1.0f,100.0,425.0);/*函數(shù)gluPerspective(GLdoublefovy,指定y方向的取景區(qū)域的角度??GLdoubleaspect,指定x方向的用來(lái)取景區(qū)域的高寬比。高寬比? 是x(寬度)與y(高度)的比率.??GLdoublezNear,指定視點(diǎn)到最近的剪切平面的距離。(正數(shù)) GLdoublezFar指定視點(diǎn)到最近的剪切平面的距離.(負(fù)數(shù))??);*/?/*例程gluPerspective()用來(lái)指定一個(gè)世界坐標(biāo)系中的截椎體的取景區(qū)域.一般,例程gluPerspective()中的高寬比應(yīng)該與相應(yīng)的視口中的高寬比相匹配.例如,appect=2.0意味著取景區(qū)域在x方向的角度是它在y方向上的角度的2倍。這時(shí),如果視口的寬度是高度的2倍,則它所顯示的圖像將沒(méi)有扭曲變形。*/??//進(jìn)行圖形的選?。鋜awSphere(GL_SELECT);/*將drawSphere()的參數(shù)mode設(shè)置為選擇模式GE_SELECT進(jìn)行圖形的選取。*///返回選中記錄hits=glRenderMode(GL_RENDER);/*令hits等于glRenderMode(GL_RENDER)的返回值GL_SELECT的返回值為0*/?glMatrixMode(GL_PROJECTION);/*指定后續(xù)矩陣操作的對(duì)象是投影矩陣堆棧.*/glPopMatrix();/*從當(dāng)前矩陣堆棧中彈出一個(gè)矩陣,把當(dāng)前矩陣替換為其下一層的矩陣.*/?glMatrixMode(GL_MODELVIEW);/*指定后續(xù)矩陣操作的對(duì)象是投影矩陣堆棧。*/}//display()在屏幕上繪圖的函數(shù)voiddisplay(void){glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);/*用GL_COLOR_BUFFER_BIT和GL_DEPTH_BUFFER_BIT的二進(jìn)制規(guī)律或操作屏蔽指定的緩沖區(qū),從而用glClearColor()設(shè)定的顏色值清除該緩沖區(qū).*/drawSphere(GL_RENDER);/*用渲染模式GE_(tái)RENDER繪圖*/glFlush();/*在有限時(shí)間內(nèi)強(qiáng)制執(zhí)行GL命令。說(shuō)明:在不同的存儲(chǔ)單元(包括網(wǎng)絡(luò)緩沖區(qū)和圖形加速器本身)中含有不同GL實(shí)現(xiàn)的緩沖區(qū)命令時(shí),函數(shù)glFlush()將清空這些緩沖區(qū),使全部已發(fā)布的命令盡可能快地執(zhí)行.*/}voidmyReshape(intw,inth){if(h==0)h=1;?glViewport(0,0,w,h);/*設(shè)置視口。glViewport(Glintx,視口像素矩形左下角的x坐標(biāo)?? ????Glinty,視口像素矩形左下角的x坐標(biāo)?? ????GLsizeiwidth,視口寬度???????GLsizeiheight視口高度??);*/?/*當(dāng)一個(gè)GL環(huán)境被第一次連接到一個(gè)窗口時(shí),參數(shù)width和height按此窗口的大小設(shè)置。*/?glMatrixMode(GL_PROJECTION);/*指定后續(xù)矩陣操作的對(duì)象是投影矩陣堆棧。*/?glLoadIdentity();/*用單位矩陣替換當(dāng)前的矩陣*/gluPerspective(45.0f,(GLfloat)w/(GLfloat(yī))h,1.0,50.0);/*建立一個(gè)透視投影矩陣。說(shuō)明:gluPerspective(GLdoublefovy,指定y方向的取景區(qū)域的角度()????GLdoubleaspect,指定x方向的用來(lái)取景區(qū)域的高寬比。高寬比是x(寬度)與y(高度)的比率。此處視口寬高比等于窗口的寬高比w/h。?? GLdoublezNear,指定視點(diǎn)到最近的剪切平面的距離.(正數(shù))????GLdoublezFar指定視點(diǎn)到最近的剪切平面的距離。(負(fù)數(shù))? ????);*/??glMatrixMode(GL_MODELVIEW);/*指定后續(xù)矩陣操作的對(duì)象是模型視圖矩陣堆棧。*/glLoadIdentity();/*用單位矩陣替換當(dāng)前的矩陣,用該單位矩陣承載將要進(jìn)行的圖形變換。*/}intmain(intargc,char*argv[]){glutInit(&argc,argv);/*初始化GLUT庫(kù)*/glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);/*初始化顯示模式,建立一個(gè)帶有雙緩存、RGB顏色模型和深度緩存的窗口*/glutInitWindowSize(200,200);/*初始化窗口高和寬,指定了窗口以像素為單位的尺寸*/glutInitWindowPosition(200,200);/*初始化窗口位置*/glutCreateWindow("Select");/*?jiǎng)?chuàng)建一個(gè)OpenGL窗口,字符串Select為該窗口的窗口名*/myinit();/*調(diào)用myinit()函數(shù)激活深度比較功能,指定刷新緩沖區(qū)的顏色*/glutMouseFunc(MouseCallback);/*當(dāng)發(fā)生按下或釋放鼠標(biāo)的一個(gè)鍵的大事時(shí),調(diào)用鼠標(biāo)回調(diào)函數(shù)MouseCallback加以響應(yīng)*/glutReshapeFunc(myReshape);/*窗口大小被拖動(dòng)轉(zhuǎn)變時(shí),調(diào)用myReshape函數(shù)在寬高變化后的窗口重繪圖形.*/glutDisplayFunc(display);/*調(diào)用display函數(shù),在前窗口中繪制圖形。*/glutMainLoop();/*啟動(dòng)主GLUT處理循環(huán)。時(shí)間循環(huán)包括鼠標(biāo)、鍵盤(pán)、繪制及窗口的大事。*/return0;}在該程序中,drawSphere()分別繪制了四個(gè)圓球,并分別給它們命名為1、2、3和4.然后進(jìn)行選擇模式,并建立鼠標(biāo)回調(diào)函數(shù):glutMouseFunc(MouseCallback):在鼠標(biāo)響應(yīng)函數(shù)MouseCallback()中,通過(guò)按下鼠標(biāo)左鍵,調(diào)用以下語(yǔ)句在鼠標(biāo)位置周圍建立一個(gè)局部的觀察空間:gluPickMatrix(x,Viewport[3]-y,2,2,Viewport);在該空間下,推斷與之相交的球體:drawSphere(GL_SELECT);如某一球體與該觀察空間有相交,則被選中。最后退出選擇模式,并返回選中記錄:hits=glRenderMode(GL—RENDER);以上程序的運(yùn)行結(jié)果如圖6—20所示。圖6—20OpenGL中的選擇示例其次部分參考代碼:用鼠標(biāo)選擇的程序Pick#include〈stdlib.h>//預(yù)處理語(yǔ)句,包含C標(biāo)準(zhǔn)庫(kù)函數(shù)頭文件#include<stdio.h〉//包含C標(biāo)準(zhǔn)輸入輸出頭文件#include<GL/glut。h〉//包含OpenGLGL/GLUT庫(kù)頭文件voidinit(){glClearColor(0。0,0。0,0.0,0。0);//指定刷新緩沖區(qū)顏色}//繪圖函數(shù):voiddrawObjects(GLenummode){if(mode==GL_SELECT)glLoadName(1);glColor3f(1.0,0.0,0.0);glRectf(-0.5,-0.5,1。0,1.0);if(mode==GL_SELECT)glLoadName(2);glColor3f(0。0,0.0,1。0);glRectf(-1.0,—1.0,0。5,0.5);}voiddisplay(){glClear(GL_COLO(píng)R_BUFFER_BIT);drawObjects(GL_RENDER);glFlush();}/*processHitsprintsoutthecontentsofthe*selectionarray*/voidprocessHits(GLinthits,GLuintbuffer[]){unsigni,j;GLuintnames,*ptr;printf("hits=%d\n",hits);ptr=(GLuint*)buffer;for(i=0;i<hits;i++){/*foreachhit*/names=*ptr;ptr+=3;for(j=0;j<names;j++){/*foreachname*/if(*ptr==1)printf(”redrectangle\n”);elseprintf("bluerectangle\n");ptr++;}printf(”\n");}}//定義鼠標(biāo)響應(yīng)函數(shù)#defineSIZE512voidmouse(intbutton,intstate,intx,inty){GLuintselectBuf[SIZE];//定義一個(gè)數(shù)組selectBuff[],類型為無(wú)符號(hào)整型,長(zhǎng)度為BUFFER_LENGTHGLinthits;//定義一個(gè)整型變量hits記錄選中的圖形數(shù),整型數(shù)組viewport[]長(zhǎng)度為4.GLintviewport[4];//定義一個(gè)整型數(shù)組viewport[]長(zhǎng)度為4。if(button==GLUT_LEFT_BUTTON&&state==GLUT_DOWN){glGetIntegerv(GL_VIEWPORT,viewport);glSelectBuffer(SIZE,selectBuf);glRenderMode(GL_SELECT);glInitNames();glPushName(0);glMatrixMode(GL_PROJECTION);glPushMatrix();glLoadIdentity();/*create5x5pixelpickingregionnearcursorlocation*/gluPickMatrix((GLdouble)x,(GLdouble)(viewport[3]-y),5.0,5。0,viewport);gluOrtho2D(-2。0,2.0,—2.0,2.0);drawObjects(GL_SELECT);glMatrixMode(GL_PROJECTION);glPopMatrix();glFlush();hits=glRenderMode(GL_RENDER);processHits(hits,selectBuf);glutPostRedisplay();}}voidreshape(intw,inth){glViewport(0,0,w,h);glMat(yī)rixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(—2。0,2。0,-2.0,2.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();}voidkeyboard(unsignedcharkey,intx,inty){switch(key){case27:exit(0);break;}}/*mainloop*/intmain(intargc,char**argv){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(500,500);glutInitWindowPosition(100,100);glutCreateWindow(argv[0]);init();glutReshapeFunc(reshape);glutDisplayFunc(display);glutMouseFunc(mouse);glutKeyboardFunc(keyboard);glutMainLoop();return0;}第三部分參考代碼:參照其次部分pick。cpp代碼,修改第一部分的Select.cpp代碼,輸出hits的值,并打印所選球體的顏色。#include<windows.h>//包含widowsAPI函數(shù)的頭文件#include〈stdlib。h>//包含C語(yǔ)言標(biāo)準(zhǔn)函數(shù)庫(kù)stdlib的頭文件#include<stdio。h>//包含C語(yǔ)言標(biāo)準(zhǔn)輸入輸出函數(shù)庫(kù)stdio的頭文件#include〈GL/glut.h>//包含OpenGL圖形函數(shù)庫(kù)GL及有用庫(kù)函數(shù)庫(kù)glut的頭文件voidmyinit(){glEnable(GL_DEPTH_TEST);glClearColor(0.0f,0.0f,0。0f,1.0f);}//繪圖函數(shù)voiddrawSphere(GLenummode){?glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glMatrixMode(GL_MODELVIEW);glPushMatrix();??glInitNames();glPushName(0);??glTranslatef(-3。0f,-2。0f,-10。0f);glColor3f(1。0,0。0,0.0);if(mode==GL_SELECT)glLoadName(1);glutSolidSphere(1。0f,35,35);?glColor3f(1.0,0.0,1。0);glPushMatrix();glTranslatef(3.0f,2.0f,0.0f);if(mode==GL_SELECT)glLoadName(2);glutSolidSphere(1。5f,35,30);glPopMat(yī)rix();??/*glPushMatrix();glColor3f(0.0,1.0,0.0);glTranslatef(5.0f,5.0f,0.0f);if(mode==GL_SELECT)glLoadName(3);glutSolidSphere(0。5f,30,30);glPopMatrix();glPushMatrix();glColor3f(0。0,0。0,1.0);glTranslatef(5。0f,0.0f,0.0f);if(mode==GL_SELECT)glLoadName(4);glutSolidSphere(0.4f,30,30);glPopMatrix();*/}voiddisplay(void){glClear(GL_COLO(píng)R_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);drawSphere(GL_RENDER);glFlush();}voidprocessHits(GLuinthits,GLuintbuffer[]){ unsignedinti,j;/*定義無(wú)符號(hào)整形變量i,j*/?GLuintnames,*ptr;/*定義GL無(wú)符號(hào)整形變量name用來(lái)存儲(chǔ)對(duì)象的名字,指針變量*ptr?? 存放其他變量地址的變量稱為指針*/????? printf("hits=%d\n",hits);/*屏幕打印hits的值,打印格式%d十進(jìn)制小數(shù),換行\(zhòng)n*/?ptr=(GLuint*)buffer;/*將buffer數(shù)組的首地址賦值給指針變量ptr,? ????亦即將指針ptr指向buffer數(shù)組的首地址?? ? ?(GLuint*)將buffer的類型強(qiáng)制轉(zhuǎn)換為GLuint。*/? ?????? ??? ?for(i=0;i<hits;i++)/*i=0每次增加1循環(huán)到hits*/?{/*foreachhit*//*每次點(diǎn)擊*/?names=*ptr;/*令變量name的值等于指針*ptr指向地址的值*/ ptr+=3;/*ptr=ptr+3,ptr每次增加3個(gè)字節(jié)*/?for(j=0;j<names;j++)/*j=0每次增加1循環(huán)到name*/?{/*foreachname*//*每個(gè)name*/?if(*ptr==1)printf("redrectangle\n”);/*如果*ptr=1,打打印redrectangle并換行*/ elseprintf("pinkrectangle\n”);/*否則打印bluerectangle,換行。*/?ptr++;/*ptr增加1*/?}?printf("\n”);/*換行*/?}}//定義鼠標(biāo)響應(yīng)函數(shù)#defineBUFFER_LENGTH64voidMouseCallback(intbutton,intstate,intx,inty){GLuintselectBuff[BUFFER_LENGTH];/*定義一個(gè)數(shù)組selectBuff[],類型為無(wú)符號(hào)整型,長(zhǎng)度為BUFFER_LENGTH*/GLinthits,viewport[4];if(button?。紾LUT_LEFT_BUTTON&&stat(yī)e!=GLUT_DOWN)return;glSelectBuffer(BUFFER_LENGTH,selectBuff);glGetIntegerv(GL_VIEWPORT,viewport);glMat(yī)rixMode(GL_PROJECTION);glPushMatrix();glRenderMode(GL_SELECT);glLoadIdentity();gluPickMatrix(x,viewport[3]—y,2,2,viewport);gluPerspective(45.0f,1.0f,1.0,425.0);drawSphere(GL_SELECT);hits=glRenderMode(GL_RENDER);processHits(hits,selectBuff);glutPostRedisplay();glMatrixMode(GL_PROJECTION);glPopMatrix();glMatrixMode(GL_MODELVIEW);}voidmyReshape(intw,inth){if(h==0)h=1;?glViewport(0,0,w,h);/*設(shè)置視口.???glViewport(Glintx,視口像素矩形左下角的x坐標(biāo)?? ? ?Glinty,視口像素矩形左下角的x坐標(biāo)???? ??? ??GLsizeiwidth,視口寬度????? GLsizeiheight視口高度?);*/?/*當(dāng)一個(gè)GL環(huán)境被第一次連接到一個(gè)窗口時(shí),參數(shù)width和height按此窗口的大小設(shè)置。*/glMatrixMode(GL_PROJECTION);/*指定后續(xù)矩陣操作的對(duì)象是投影矩陣堆棧。*/glLoadIdentity();/*用單位矩陣替換當(dāng)前的矩陣*/?gluPerspective(45.0f,(GLfloat)w/(GLfloat)h,1。0,50.0);/*建立一個(gè)透視投影矩陣.??說(shuō)明:gluPerspective(GLdoublefovy,指定y方向的取景區(qū)域的角度()?? ????GLdoubleaspect,指定x方向的用來(lái)取景區(qū)域的高寬比。 ????高寬比是x(寬度)與y(高度)的比率。????? ??? 此處視口寬高比等于窗口的寬高比w/h。???? ??GLdoublezNear,指定視點(diǎn)到最近的剪切平面的距離。(正數(shù))? ??? ?GLdoublezFar指定視點(diǎn)到最近的剪切平面的距離.(負(fù)數(shù)) ?? ?);*/?glMatrixMode(GL_MODELVIEW);/*指定后續(xù)矩陣操作的對(duì)象是模型視圖矩陣堆棧。*/?glLoadIdentity();/*用單位矩陣替換當(dāng)前的矩陣,用該單位矩陣承載將要進(jìn)行的圖形變換。*/}intmain(intargc,char*argv[]){glutInit(&argc,argv);/*初始化GLUT庫(kù)*/?glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);/*初始化顯示模式,建立一個(gè)帶有雙緩存、RGB顏色模型和深度緩存的窗口*/ glutInitWindowSize(200,200);/*初始化窗口高和寬,指定了窗口以像素為單位的尺寸*/?glutInitWindowPosition(200,200);/*初始化窗口位置*/?glutCreat(yī)eWindow(”Select");/*創(chuàng)建一個(gè)OpenGL窗口,字符串Select為該窗口的窗口名*/?myinit();/*調(diào)用myinit()函數(shù)激活深度比較功能,指定刷新緩沖區(qū)的顏色*/ glutMouseFunc(MouseCallback);/*當(dāng)發(fā)生按下或釋放鼠標(biāo)的一個(gè)鍵的大事時(shí),調(diào)用鼠標(biāo)回調(diào)函數(shù)MouseCallback加以響應(yīng)*/ glutReshapeFunc(myReshape);/*窗口大小被拖動(dòng)轉(zhuǎn)變時(shí),調(diào)用myReshape函數(shù)在寬高變化后的窗口重繪圖形。*/?glutDisplayFunc(display);/*調(diào)用display函數(shù),在前窗口中繪制圖形。*/?glutMainLoop();/*啟動(dòng)主GLUT處理循環(huán)。時(shí)間循環(huán)包括鼠標(biāo)、鍵盤(pán)、繪制及窗口的大事。*/?return0;}2。6上機(jī)6:三維圖形變換上機(jī)練習(xí)(2學(xué)時(shí))1。目的要求:熟識(shí)OpenGL中三維圖形變換的方法。2。實(shí)驗(yàn)內(nèi)容:在VC++6。0環(huán)境中編寫(xiě):1)模型變換程序;2)透視投影程序;3)圖形裁剪程序;并上機(jī)運(yùn)行。3.主要儀器設(shè)備及軟件PC計(jì)算機(jī),VC++6.0,GLUT庫(kù)參考代碼:1)模型變換程序/*本程序?qū)σ粋€(gè)八面體進(jìn)行模型變換*/#include<windows。h>#include<GL/glut.h>voidmyinit(void){?glClearColor(1。0,1.0,1。0,0.0);}voiddisplay(void){?glClear(GL_COLO(píng)R_BUFFER_BIT);?glMatrixMode(GL_M(jìn)ODELVIEW);//指定當(dāng)前的矩陣操作類型為模型視圖矩陣?glLoadIdentity();??/*第一個(gè)八面體*/ glTranslatef(-1。0,-1.0,—5.0);//?glColor3f(0.0,0.0,0.0); glutWireOctahedron();/*其次個(gè)八面體*/?glPushMatrix();//把當(dāng)前操作矩陣壓入矩陣棧堆?/*平移變換*/?glTranslatef(2.0,1。0,0。0); glColor3f(1.0,0.0,0.0);?glutWireOctahedron(); /*第三個(gè)八面體*/?glPopMatrix();//當(dāng)前操作矩陣出棧,它下面的矩陣作為當(dāng)前矩陣?glPushMatrix();?/*平移變換*/?glTranslatef(-0。0,2.3,0.0);?/*比例變換*/?glScalef(0.8,0。5,1.2);?glColor3f(0.0,1。0,0.0);?glutWireOctahedron();?/*第四個(gè)八面體*/?glPopMatrix(); /*旋轉(zhuǎn)變換*/?glRotatef(15.0,0。0,1.0,0。0);//繞Y周旋轉(zhuǎn)15.0度?/*平移變換*/ glTranslatef(2。3,2.3,0.0); glColor3f(0.0,0.0,1。0);?glutWireOctahedron();?glFlush();}voidmyreshape(intw,inth){ if(h==0)? h=1;?glViewport(0,0,(GLsizei)w,(GLsizei)w);?glMatrixMode(GL_PROJECTION);?glLoadIdentity();?/*透視投影*/?gluPerspective(60.0,(GLfloat)w/(GLfloat)h,1。0,20。0);?glMatrixMode(GL_MODELVIEW); glLoadIdentity();}intmain(intargc,char**argv){?glutInit(&argc,argv);?glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);?glutInitWindowSize(250,250);?glutInitWindowPosition(200,200);?glutCreateWindow(”3DTransform");?myinit();?glutDisplayFunc(display);?glutReshapeFunc(myreshape);?glutMainLoop();?return0;}運(yùn)行結(jié)果:2)透視投影程序/*本程序?qū)σ粋€(gè)八面體進(jìn)行模型變換*/#include〈windows.h〉#include<GL/glut.h〉voidmyinit(void){?glClearColor(1.0,1.0,1.0,0.0);}voiddisp

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論