2023年計算機圖形學實驗報告3_第1頁
2023年計算機圖形學實驗報告3_第2頁
2023年計算機圖形學實驗報告3_第3頁
2023年計算機圖形學實驗報告3_第4頁
2023年計算機圖形學實驗報告3_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

實驗一3D模型的加載、渲染與三維操作

學院:

專業(yè)班級:

指導老師:8

學號:。

姓名:。

完畢日期:,

目錄

一、實驗目的.......................................................................3

二、使用的工具軟件及環(huán)境.........................................錯誤!未定義書簽。

三、實驗內容錯誤!未定義書簽。

四、實驗環(huán)節(jié)。錯誤!未定義書簽。

五、思考。錯誤!未定義書簽。

一、實驗目的

1、掌握在MicrosoftVisualStudio環(huán)境中使用OpenGL、GLUT和GLUI;

2、了解計算機圖形學固定流水線;

3、了解OpenGL編程基礎;

4、掌握三維觀測的數(shù)學表達和程序實現(xiàn);

5、掌握多邊形網格的繪制;

二、使用的工具軟件及環(huán)境

MicrosoftVisualStudio2023、OpenGL>Glut>Glui

三、實驗內容

1、在VS2023中酉己置0penGL環(huán)境;

2、編譯簡樸的GLUT程序;

3、編譯GLUI源代碼,并在調試模式下執(zhí)行6個示例程序;

4、在給定的工程中添加繪制簡樸幾何體的代碼;

5、在給定的工程中添加讀取、繪制三維模型的代碼;

6、在給定的工程中添加旋轉、平移和縮放的控制代碼;

四、實驗環(huán)節(jié)

1、安裝MicrosoftVisualStudio軟件

版本選擇:MicrosoftVisua1Studio2023以上版本

2、VS2023中配置GLUT

1)下載GLUT。Windows環(huán)境下的GLUT下載地址:

2)將下載的壓縮包解開,將得到5個文獻:glut.h、glut.1ib>glut

32.lib%glut.dll>glut32.d11。3)將glut,h放至[,%WinDir%\Program

Files(x86)\MicrosoftSDKs\Windows\v7.OA\Include\g1\"文

獻夾中。

4)將g1ut.1ib和g1ut32.lib放到"%WinDir%\ProgramFile

s(x86)\MicrosoftVisualStudio10.O\VC\1ibV文獻夾中。

5)將glut.dll和glut32.d11放到級WinDir%\system32”文獻夾(3

2位操作系統(tǒng))或者"%WinDir%\SysWOW64"文獻夾(64位操作系統(tǒng))。

3、測試GLUT配置環(huán)境

1)打開VS2023,選擇文獻->新建-〉項目,選擇Win32控制臺應用程序,

填入合適的名字如OpenGLTest,然后選擇擬定。演在彈出的對話框中點擊

下一步,然后在附加選項中選擇空項目,點擊完畢。

3)然后向該工程添加一個源代碼文獻,取名為OpenGLTest.cpp。小)向0

penGLTest.c中添加代碼(可在公共郵箱下載)

#include<GL/glut,h>

#include<gl/gl.h>

#include<gl/GLU.h>

voidmyDisplay()

(

?glC1ear(GL_COLOR_BUFFER_BIT);

oglRectf(-0.5f,-0.5f,0.5f,0.5f);

?glFlush();

intmain(intargc,char*argv[])

glutInit(&argc,argv);

?g1utinitDisplayMode(GLUT_RGBIGLUT_SINGLE);

glutInitWindowPosition(100,100);

glutlnitWindowSize(400,400);

oglutCreateWindow("第一個OpenGL程序");

glutDisplayFunc(&myDisplay);

g1utMainLoop();

?return0;

}

5)設立必要的靜態(tài)鏈接庫列表

選擇“項目一>屬性->鏈接器->輸入->附加包含目錄”,填寫必要的靜態(tài)鏈

接庫列表,如“openg132.lib;glu32.lib;glut32.libM

6)編譯、鏈接、執(zhí)行該程序,生成一個黑色的窗口,中央顯示一個白色的矩

形,表白配置環(huán)境對的。

學|民石達|9.。.二>國|?|DebugWin32

1'-1十六進制力口?仁|享有工?|0GQ*0無*Q

W線程:

/glut.h>

gl.h>

;LU.h>

ay()

;L_COLOR_BUFFER_BIT):

-0.5f,-0.5f,0.5f,0.5f):

):

argCjchar*argv[])

(&argc,argv):

DisplayMode(GLUT_RGB|GLUT_SINGL

^indowPosition(100,100);

^indowSize(400,400);

teWindow("第一個OpenGL程序"):

1ayFunc(&myDisplay);

F.nnn(},

4、編譯GLUI庫文獻和示例程序

在公共郵箱中下載GLUI源代碼并解壓到合適的目錄

用VS2023打開"glui-2.36\src\msvc"目錄下的glui.s1n解決方案文

獻。

在“解決方案資源管理器”中右鍵點擊“解決方案"glui"”項,點擊批生成,

勾選前四項,點擊生成。

育出

痂遍出女⑸:|顰~|,|3金I京|至]

glui_window.cpp

quaternion.cpp

正在生成代碼…

C:\ProgramFilesGc86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(1151,5):warningMSB8012:TargetP

C:\ProgramFilesGc86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(U53/5):warningMSB8012:TargetN

Lib:

glui.vcxproj->E:\課件,計算機圖形學課件\glui_2.36\glui~2.36\src\msvc\.\Debug\_gluilibrary.lib

FinalizeBuildStatus:

正在刪除文件“.\Debug\_gluilibrary,xinsuccessfulbui1d,J。

正在對“?'Debug'gluilibrary,lastbuiIdstate”執(zhí)行Touch任務。

生成成功。

已用時間00:00:33.09

==========生成:成功4個,失敗0個,最賴0個,跳過0個==========

.IiiiI

在“解決方案資源管理器”中右鍵點擊“解決方案"g1ui〃”項,點擊批生

成,取消選擇前四項,勾選其余項,點擊生成。

是出

顯5遍出來源⑤:|生成F|5|321Tl司

InitializeBuildStatus:

正在創(chuàng)建"DebugDLL\example1.unsuccessfulbuildM,因為已指定“AlwaysCreateM。

CICompile:

examplel.cpp

C:\ProgramFiles6<86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(990.5):warningMSB8012:TargetPa

C:\ProgramFilesGc86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(992?5):warningMSB8012:TargetNai

Link:

example1.vcxproj->E:\課件,計算機圖形學課件\glui-2.36\glui_2.36\,src\msvc\DebugDLL\examplel.exe

FinalizeBuildStatus:

正在刪除文件“DebugDLLKexample1.unsuccessfulbuiId”。

正在對“DebugDLlAexamplel.lastbuildstate"執(zhí)行Touch任務"o

生成成功。

已用時間00:00:01.94

==========生成:成功24個,失敗0個,最新0個,跳過。個==========

在"glui-2.36\src\msvc\bin”目錄下可見到生成的動態(tài)鏈接庫文獻以

及可執(zhí)行文獻。

在"glui-2.36\src\msvc\lib”目錄下可見到生成的靜態(tài)鏈接庫文獻。

將glui相關的頭文獻、靜態(tài)鏈接庫文獻、動態(tài)鏈接庫文獻依次放入4.2節(jié)

中所述目錄下。

5、編譯MeshViewer示例程序

從公共郵箱中下載MeshViewer示例程序,試編譯運營。

6、在示例程序中添加代碼實現(xiàn)下述功能

1)在MeshViewer.cpp文獻myGlutDisplay函數(shù)的相應位置,添加繪

制圓柱的代碼

voidDrawCylinder0

{//繪制圓柱體

floath=1.Of;

//繪制上面的圓

?g1Begin(GL_TRIANGLES);

glNorma13f(0.Of,0.Of,1.Of);〃擬定法向

。for(inti=0;i<=n;i++)

。//點的順序(n,h),(0,h),(n+1,h)

8glVertex3f(R*cos((2*Pi)*i/n),R*sin((2*Pi)*i/n),h);

ogIVertex3f(0,0,h);

。glVertex3f(R*cos((2*Pi)*(i+1)/n),R*sin((2*Pi)*(i

+1)/n),h);

°)

*End();

。//繪制下面的圓

glBegin(GL_TRIANGLES);

glNormal3f(0.Of,0.Of,-l.Of);〃擬定法向

。for(inti=0;i<=n;i++)

°{

//點的順序(n,0),(n+1,0),(0,0)

oglVertex3f(R*cos((2*Pi)*i/n),R*sin((2*Pi)*i/n),

-h);

oooglVertex3f(R*cos((2*Pi)*(i+1)/n),R*sin((2*Pi)*(i+1)

/n),-h);

og1Vertex3f(0,0,0);

glEnd();

//繪制側面

oglBegin(GL_QUADS);

ointi=0;

0for(inti=0;i<=n;i++)

1dOO

gINormal3f(R*cos((2*Pi)*i/n),R*sin((2*Pi)*i/n),0);

。//畫點的順序v(n,0),(n,h),(n+1,h),(n+1,0)

。glVertex3f(R*cos((2*Pi)*i/n),R*sin((2*Pi)*i/n),-h);

。。gIVertex3f(R*cos((2*Pi)*i/n),R*sin((2*Pi)*i/n),

h):

glVertex3f(R*cos((2*Pi)*(i+1)/n),R*sin((2*Pi)*

(i+1)/n),h);

glVertex3f(R*cos((2*Pi)*(i+1)/n),R*sin((2*Pi)*

(i+1)/n),—h);

?)

glEnd();

}

2)在MeshViewer.cpp文獻myGlutDisp1ay函數(shù)的相應位置,添加繪

制圓錐的代碼

voidDrawCone()

{〃繪制圓錐

。floath=2.Of;〃定義圓錐的高

〃繪制下面的圓

glBegin(GL_TRIANGLES);

。g1Normal3f(0.Of,0.Of,-1.Of);//擬定法向

。for(inti=0;i<=n;i++)

8{

8〃點的順序(n,0),(n+1,0),(0,0)

8glVertex3f(R*cos((2*Pi)*i/n),R*sin((2*Pi)*i/n),0);

。oglVertex3f(R*cos((2*Pi)*(i+l)/n),R*sin((2*Pi)*(i+1)

/n),0);

glVertex3f(0,0,0);

)

?glEnd();

〃繪制圓錐的側面

oglBegin(GL_TR1ANGLES);

ointi=0;

3for(inti=0;i<=n;i++)

8{

。//計算圓錐面的法向量

?>Vector3v1(R*cos((2*Pi)*i/n),R*sin((2*Pi)*i/n),

0);

o?Vector3v2(0,0,h);

Vector3v3(R*cos((2*Pi)*(i+1)/n),R*sin((2*Pi)

*(i+1)/n),0);

的Vector3vnorma1=Cross((v3-v2),(v2-vl));

wogINormal3f(vnorma1.fX,vnorma1.fY,vnormal.fZ);

。//繪?制?順3序6(n,0),(0,h),(n+1,0)

oglVertex3f(R*cos((2*Pi)*i/n),R*sin((2*Pi)*i/n),0);

^glVertex3f(0,0,h);

IVertex3f(R*cos((2*Pi)*(i+1)/n),R*sin((2*Pi)

*(i+1)/n),0);

^glEndO;

)

3)從.obj文獻中讀取頂點數(shù)據(jù)和面數(shù)據(jù):實現(xiàn)方法CObj::ReadObjFile();

boolCObj::ReadObjFile(constchar*pcszFi1eName)

{〃讀取模型文獻

oFILE*fpFile=fopen(pcszFileName,;//以只讀方式打開文獻

if(fpFi1e==NULL)

°(

eturnfalse;

)

3mpts.clear();

m—faces.clear();

〃將模型文獻中的點和面數(shù)據(jù)分別存入m_pts和faces中

oconstintnLineLenth=256;

charszLine[nLineLenth];

0Pointpt;

Facef;

owhile(fgets(szLine,nLineLenth,fpFile))

ft(

std::stringstream1ineStream(szLine);

?charszType[l0];

lineStream>>szType;

oif(szType[0]=='v'&&szType[1]=='\0')〃讀入頂點

q1ineStream>>pt.pos.fX?pt.pos.fY>>pt.pos.fZ;

m_pts.pushback(pt);

oaelseif(szType[0]&&szTypet1]=='\0')//讀入面

?ineStream>>f.pts[0]>>f.pts[l]>>f.pts[2];

。of.pts[0]一;

。f.pts[1]----;

0of.pts[2]一;

。m_faces.push_back(f);

0}

)

。fclose(fpFile);

UnifyMode1();〃將模型歸一化

3computeNormaIs();//計算法線

returntrue;

)

4)將模型歸一化:實現(xiàn)方法CObj"UnifyModel。;

voidCObj::UnifyMode1()

(

〃模型歸一化

Vector3vMax,vMin;

vMax=vMin=mpts[0].pos;

?for(inti=1;i<m_pts.size();++i)

ovMin.fX=min(vMin.fX,mjpts[i].pos.fX);

?vMin.fY=min(vMin.fY,m_pts[i].pos.fY);

ovMin.fZ=min(vMin.fZ,m_pts[i].pos.fZ);

ovMax.fX=max(vMax.fX,m_pts[i].pos.fX);

vMax.fY=max(vMax.fY,m_pts[i].pos.fY);

°vMax.fZ=max(vMax.fZ,m_pts[i].pos.fZ);

Vector3center=(vMax+vMin)*0.5;

。//Calcu1atescaleration

doublefScale;

Vector3vBounding;

ovBounding=vMax-vMin;

ofSca1e=vBounding.Length();

ofSca1e=10.0/fScale;

ofor(inti=0;i<m_pts.size();++i)

(

。Vector3&pos=m_pts[i].pos;

opos=(pos-center)*fScale;

}

)

5)計算各個三角面片的法向:實現(xiàn)方法CObj::ComputeFaceNorma1();

voidCObj::ComputeFaceNorma1(Face&f)

{//計算面f的法向量,并保存

Vector3one;

Vector3two;

oone=m_ptsLf.pts[l]J.pos-mpts[f.pts[0]].pos;

two=m_pts[f.pts[2]].pos—m_pts[f.pts[0]].pos;

of.normal=Cross(one,two);//通過叉積y計算法線量

f.norma1.NormalizeO;//對法向量長度進行歸一化

)

6)繪制讀取的模型:實現(xiàn)函數(shù)DrawModelO;

voidDrawModel(CObj&mode1)

{〃繪制模型

oglBegin(GL_TRIANGLES);〃開始畫模型

for(inti=0;i<model.m_faces.size();++i)

8for(intj=0;j<3;++j)

0{

glNorma13dv((double*)&

溫馨提示

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

評論

0/150

提交評論