版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
OpenGL高級(jí)編程
&
可視化系統(tǒng)開(kāi)發(fā)廣東工業(yè)大學(xué)圖學(xué)與數(shù)字媒體系羅立宏第六章星空的模擬6.2編程實(shí)例二
6.2.1程序說(shuō)明模擬太陽(yáng)系中各大星體的運(yùn)動(dòng),對(duì)太陽(yáng)系進(jìn)行可視化6.2.2使用到的技術(shù)繪圖坐標(biāo)的變換
注意glPushMatrix,glPopMatrix,glTranslate,glRotate的使用紋理的應(yīng)用
二次曲面紋理的應(yīng)用
raw格式紋理的使用
6.2.3程序閱讀本程序使用了第二章做的OpenGL單文檔模板,在此基礎(chǔ)上開(kāi)發(fā)而成3.2.2.1繪圖部分代碼繪圖的程序繪圖的工作都是在視圖類(lèi)的OnDraw()函數(shù)中開(kāi)始的。因此,可以從OnDraw開(kāi)始入手,找出繪圖相關(guān)的函數(shù):◆CMySolarsysView::RenderScene()◆
CMySolarsysView::DrawSun()◆
CMySolarsysView::DrawAllOrbits()◆
CMySolarsysView::DrawPlanets()◆
CMySolarsysView::DrawComet()(1)CMyTerrain1View::RenderScene()//////////////////////////////////////////////////////////// 場(chǎng)景繪制與渲染//////////////////////////////////////////////////////////BOOLCMySolarsysView::RenderScene(){ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glTranslatef(globalPosition.fPosX,0.0,0.0); glTranslatef(0.0,globalPosition.fPosY,0.0); LightPosition[0]=LightPosition[0]+globalPosition.fPosX;//第一個(gè)光源LightPosition[1]=LightPosition[1]+globalPosition.fPosX; LightPosition2[0]=LightPosition2[0]+globalPosition.fPosX;//第二個(gè)光LightPosition2[1]=LightPosition2[1]+globalPosition.fPosX; glLightfv(GL_LIGHT1,GL_POSITION,LightPosition); glLightfv(GL_LIGHT2,GL_POSITION,LightPosition2);
globalPosition.fPosX =0; globalPosition.fPosY =0; DrawSun(); //繪制太陽(yáng)
DrawAllOrbits();
//繪制所有軌道
DrawPlanets();
//繪制所有行星
DrawComet();//繪制彗星 ::SwapBuffers(m_pDC->GetSafeHdc()); //交互緩沖區(qū)
returnTRUE;}(2)CMySolarsysView::DrawSun()//繪制太陽(yáng)voidCMySolarsysView::DrawSun(){ glPushMatrix(); glutSolidSphere(0.05,10,10); glPopMatrix();}(3)CMySolarsysView::DrawAllOrbits()//繪制行星軌道voidCMySolarsysView::DrawAllOrbits(){ DrawOrbit(mercury); DrawOrbit(venus); DrawOrbit(earth); DrawOrbit(mars); DrawOrbit(jupiter); DrawOrbit(saturn); DrawOrbit(uranus); DrawOrbit(neptune); DrawOrbit(pluto);}(4)voidCMySolarsysView::DrawOrbit()//繪制行星軌道voidCMySolarsysView::DrawOrbit(Planetplanet){ glDisable(GL_LIGHTING); glColor3f(0.7,0.7,0.7);
glBegin(GL_LINE_LOOP); for(inti=0;i<360;i++) { glVertex3f(cos(DEG2RAD(i))*planet.posZ,0,sin(DEG2RAD(i))*planet.posZ); } glEnd(); glEnable(GL_LIGHTING);}(5)CMySolarsysView::DrawPlanets()//繪制9大行星voidCMySolarsysView::DrawPlanets(){ glEnable(GL_TEXTURE_2D);
DrawPlanet(mercury); DrawPlanet(venus); DrawPlanet(earth); DrawPlanet(mars); DrawPlanet(jupiter); DrawPlanet(saturn); DrawPlanet(uranus); DrawPlanet(neptune); DrawPlanet(pluto); glDisable(GL_TEXTURE_2D);}(6)CMySolarsysView::DrawPlanet()//繪制一個(gè)行星voidCMySolarsysView::DrawPlanet(Planetplanet){ glPushMatrix(); glRotatef(planet.SolarAngle,0,-1,0); glTranslatef(planet.posX,planet.posY,planet.posZ); glRotatef(planet.OwnAxisAngle,0,-1,0); glRotatef(90.0,1.0,0.0,0.0);
glBindTexture(GL_TEXTURE_2D,texture_id[planet.TextureID]); GLUquadricObj*q=gluNewQuadric();//新建一個(gè)二次曲面對(duì)象
gluQuadricDrawStyle(q,GLU_FILL);
//繪圖風(fēng)格
gluQuadricNormals(q,GLU_SMOOTH);//指定法線(xiàn)方式gluQuadricTexture(q,GL_TRUE);
//設(shè)置使用紋理
gluSphere(q,planet.size,planet.sections,planet.sections);//繪制球體
gluDeleteQuadric(q);
//刪除二次曲面對(duì)象
glPopMatrix();}繪圖坐標(biāo)系變換過(guò)程:開(kāi)始繪圖坐標(biāo)系在世界坐標(biāo)系的原點(diǎn),圖中紅色為x,綠色為y,藍(lán)色為z0//公轉(zhuǎn)。繞y軸(綠色)旋轉(zhuǎn),如45°
glRotatef(planet.SolarAngle,0,-1,0);12//沿z軸(藍(lán)色)移動(dòng),如(0,0,5)glTranslatef(planet.posX,planet.posY,planet.posZ);3//自轉(zhuǎn)。繞y軸(綠色)旋轉(zhuǎn),如30°
glRotatef(planet.SolarAngle,0,-1,0);4//把z軸轉(zhuǎn)為向上,使行星北極朝上。繞x軸轉(zhuǎn)90°glRotatef(90.0,1.0,0.0,0.0);5//在當(dāng)前繪圖坐標(biāo)系繪制球體(行星)gluSphere(q,planet.size,planet.sections,planet.sections);(7)CMySolarsysView::DrawComet()//繪制彗星voidCMySolarsysView::DrawComet(){ glPushMatrix(); glRotatef(iCometAngle,0,0,1); glTranslatef(1,0,0); glutSolidSphere(0.02,20,20); glPopMatrix();}3.2.2.2動(dòng)畫(huà)的實(shí)現(xiàn)動(dòng)畫(huà)的實(shí)現(xiàn)一般靠OnTimer()改變繪圖參數(shù),然后刷新屏幕。重新畫(huà)圖時(shí)由于數(shù)據(jù)不一樣,就畫(huà)出了與剛才不一樣的圖,就產(chǎn)生了動(dòng)畫(huà)。OnTimer()中發(fā)現(xiàn)改變參數(shù)的函數(shù)是:◆CMySolarsysView::rotate()(1)CMySolarsysView::rotate()voidCMySolarsysView::rotate(){ if(globalPosition.bRotationOn) { //comet iCometAngle+=2; if(iCometAngle>=360) {
iCometAngle-=360; } //solarrotation mercury.SolarAngle+=1.6*ROTATION_SPEED; if(mercury.SolarAngle>=360){mercury.SolarAngle-=360;}
……
//金星至海王星省略
……
pluto.SolarAngle+=0.01*ROTATION_SPEED; if(pluto.SolarAngle>=360) {pluto.SolarAngle-=360;} //axisrotation mercury.OwnAxisAngle+=0.1; if(mercury.OwnAxisAngle>=360) {mercury.OwnAxisAngle-=360;}
……
//金星至海王星省略 ……
pluto.OwnAxisAngle+=3; if(pluto.OwnAxisAngle>=360) {pluto.OwnAxisAngle-=360;} }}3.2.2.3初始化代碼查看一下程序常用于初始化的地方(如App類(lèi)的InitInstance()、視圖類(lèi)的OnCreate()等)有沒(méi)有額外的初始化代碼,發(fā)現(xiàn)有:◆CMySolarsysView::Init()◆CMySolarsysView::InitPlanets()
這些函數(shù)應(yīng)包括了各星體數(shù)據(jù)的初始化(1)CMySolarsysView::Init()voidCMySolarsysView::Init(void){ glLightfv(GL_LIGHT1,GL_AMBIENT,LightAmbient); glLightfv(GL_LIGHT1,GL_DIFFUSE,LightDiffuse); glLightfv(GL_LIGHT1,GL_POSITION,LightPosition); glEnable(GL_LIGHT1);//啟用1號(hào)光源
glLightfv(GL_LIGHT2,GL_AMBIENT,LightAmbient2); glLightfv(GL_LIGHT2,GL_DIFFUSE,LightDiffuse2); glLightfv(GL_LIGHT2,GL_POSITION,LightPosition2); glEnable(GL_LIGHT2);//啟用2號(hào)光源
glClearColor(0,0,0,0);//設(shè)置清屏顏色
glShadeModel(GL_SMOOTH);//設(shè)置面著色模式為平滑模式
glEnable(GL_DEPTH_TEST);//啟用深度測(cè)試
glEnable(GL_LIGHTING);
//啟用光照功能
glEnable(GL_CULL_FACE);//啟用無(wú)用面剔除功能
m_Textures.LoadTextures(texture_id,MAX_NO_TEXTURES); globalPosition.fPosX=0; globalPosition.fPosY=0; globalPosition.iDegreesX=20;
globalPosition.iDegreesY=25; globalPosition.bRotationOn=true;//等于true才不斷旋轉(zhuǎn) //旋轉(zhuǎn)繪圖坐標(biāo)系,讓用戶(hù)看到太陽(yáng)系的全貌。配合OnSize()中//的glTranslatef(0.0,0.0,-5.0)就能得到觀察的效果
glRotatef(globalPosition.iDegreesX,0.0,1.0,0.0); glRotatef(globalPosition.iDegreesY,1.0,0.0,0.0);}觀察位置的設(shè)置0圖中為繪圖坐標(biāo)系1//繪圖坐標(biāo)系繞y軸旋轉(zhuǎn)20°glRotatef(globalPosition.iDegreesX,0.0,1.0,0.0);2//繪圖坐標(biāo)系繞x軸旋轉(zhuǎn)25°glRotatef(globalPosition.iDegreesY,1.0,0.0,0.0);3//在OnDraw()中畫(huà)了整個(gè)太陽(yáng)系4//把原始的觀察坐標(biāo)系畫(huà)出來(lái),它是左手系5//在OnSize中有以下代碼,把觀察坐標(biāo)系向z負(fù)向移動(dòng)了5glMatrixMode(GL_PROJECTION);glTranslatef(0.0,0.0,-5.0);6//把視點(diǎn)移至觀察坐標(biāo)系來(lái)看,發(fā)現(xiàn)看的東西是這樣的:(2)CTextures::LoadTextures()//加載9個(gè)行星的紋理voidCTextures::LoadTextures(GLuint*texture_id,intMaxNrOfTextures){ glPixelStorei(GL_UNPACK_ALIGNMENT,1);//對(duì)齊像素字節(jié)glGenTextures(MaxNrOfTextures,texture_id);//生成9個(gè)紋理對(duì)象
//加載水星紋理
glBindTexture(GL_TEXTURE_2D,texture_id[0]);//紋理準(zhǔn)備加載到0號(hào)
//以下load_texture()函數(shù)封裝了加載raw圖像的方法,以后需要使用raw//格式圖像時(shí)大家可直接使用
if(load_texture("mercury.raw",640,320,3,GL_RGB,GL_NEAREST)) { MessageBox(NULL,TEXTURE_LOAD_ERROR,"Error",MB_OK); exit(1); }
…………
glBindTexture(GL_TEXTURE_2D,texture_id[8]); if(load_texture("pluto.raw",640,320,3,GL_RGB,GL_NEAREST)) { MessageBox(NULL,TEXTURE_LOAD_ERROR,"Error",MB_OK); exit(1); }}(3)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024至2030年中國(guó)彩色絲方巾行業(yè)投資前景及策略咨詢(xún)研究報(bào)告
- 2024至2030年保健羊皮產(chǎn)品項(xiàng)目投資價(jià)值分析報(bào)告
- 2024-2030年中國(guó)膠鞋行業(yè)市場(chǎng)運(yùn)行狀況及發(fā)展趨勢(shì)預(yù)測(cè)報(bào)告
- 2024-2030年中國(guó)電子專(zhuān)用可靠性能試驗(yàn)設(shè)備項(xiàng)目可行性研究報(bào)告
- 2024-2030年中國(guó)火鍋店連鎖經(jīng)營(yíng)市場(chǎng)運(yùn)行狀況及前景趨勢(shì)分析報(bào)告
- 安裝工程分包合同書(shū)3篇
- 數(shù)據(jù)中心運(yùn)維合同3篇
- 收購(gòu)牧草合同書(shū)樣本3篇
- 教育志愿者服務(wù)合作合同3篇
- 整棟樓房租賃合同3篇
- 產(chǎn)科利用PDCA循環(huán)降低初產(chǎn)婦陰道分娩會(huì)陰側(cè)切率品管圈QCC成果匯報(bào)
- 2024屆黑龍江省齊齊哈爾市建華區(qū)中考聯(lián)考數(shù)學(xué)試題含解析
- 美國(guó)RAZ分級(jí)讀物目錄整理
- 2023年我國(guó)及部分省市畜牧業(yè)相關(guān)政策 深入推進(jìn)草原畜牧業(yè)轉(zhuǎn)型升級(jí)
- 小學(xué)六年級(jí)語(yǔ)文:《常考的10篇文言文》
- DB31∕T 1154-2019 手術(shù)室X射線(xiàn)影像診斷放射防護(hù)及檢測(cè)要求
- 花崗巖檢測(cè)報(bào)告-實(shí)用文檔
- 保育員(高級(jí))考試題庫(kù)附答案(600題)
- 全廣東江門(mén)市蓬江區(qū)2022年九年級(jí)數(shù)學(xué)上學(xué)期期末試題含答案
- 國(guó)家文化安全戰(zhàn)略研究論文
- 中國(guó)傳統(tǒng)文化英語(yǔ)(課堂PPT)
評(píng)論
0/150
提交評(píng)論