版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、#includetotal.h#include#include#include#include#include#include#include#include#include#include#include#include#include#include#defineGLUT_DISABLE_ATEXIT_HACK#defineFILE_NAMEfeiji.3DS/指定對(duì)應(yīng)的FILENAME#defineSCREEN_WIDTH800#defineSCREEN_HEIGHT600#defineSCREEN_DEPTH16#defineMAX_TEXTURES100/最大的紋理數(shù)目#define
2、PRIMARY/主塊(MainChunks)#defineOBJECTINFO0 x3D3D#defineVERSION0 x0002#defineEDITKEYFRAME0 xB0000 x4D4D基本塊(PrimaryChunk),位于文件的開女臺(tái)/對(duì)象的次級(jí)定義(包括對(duì)象的材質(zhì)和對(duì)象)#defineMATERIAL0 xAFFF#defineOBJECT0 x4000/材質(zhì)的次級(jí)定義#defineMATNAME0 xA000#defineMATDIFFUSE0 xA020#defineMATMAP0 xA200#defineMATMAPFILE0 xA300#defineOBJECT_M
3、ESH0 x4100/OBJECT_MESH的次級(jí)定義#defineOBJECT_VERTICES0 x4110#defineOBJECT_FACES0 x4120#defineOBJECT_MATERIAL0 x4130#defineOBJECT_UV0 x4140/網(wǎng)格對(duì)象的版本號(hào)/.3ds文件的版本/所有關(guān)鍵幀信息的頭部/保存紋理信息/保存對(duì)象的面、頂點(diǎn)等信息/保存材質(zhì)名稱/對(duì)象/材質(zhì)的顏色/新材質(zhì)的頭部/保存紋理的文件名/新的網(wǎng)格對(duì)象/對(duì)象頂點(diǎn)/對(duì)象的面/對(duì)象的材質(zhì)/對(duì)象的UV紋理坐標(biāo)intg_ViewMode=GL_TRIANGLES;boolg_bLighting=true;flo
4、atg_Rotatex=0;floatg_Rotatey=0;floatg_Rotatez=0;floatg_x=0;floatg_y=0;floatg_z=0;/。定義需要導(dǎo)入的數(shù)據(jù)floatRotatex;floatRotatey;floatRotatez;floatx;floaty;floatz;doublegl_x;doublegl_y;doublegl_z;doublegl_pitch;doublegl_roll;doublegl_yaw;doublegl_wcpitch;doublegl_wcroll;doublegl_wcyaw;usingnamespacestd;UINTg_T
5、extureMAX_TEXTURES=0;HWNDg_hWnd;RECTg_rRect;HDCg_hDC;HGLRCg_hRC;HINSTANCEg_hInstance;HINSTANCEhInstance;MMRESULTidtimer_Opengl;HWNDCreateMyWindow(LPSTRstrWindowName,intwidth,intheight,DWORDdwStyle,HINSTANCEhInstance);/生成用戶窗口LRESULTCALLBACKWinProc(HWNDgl_hwnd,UINTmessage,WPARAMwParam,LPARAMIParam);/艄
6、息響應(yīng)voidInit(HWNDgl_hWnd);/初始化整個(gè)程序voidInitializeOpenGL(intwidth,intheight);/初始化OpenGLboolbSetupPixelFormat(HDChdc);/設(shè)置像素格式voidSizeOpenGLScreen(intwidth,intheight);/初始化投影變換intMainLoop();主循環(huán)voidRenderScene(doublegl_x,doublegl_y,doublegl_z,doublegl_roll,doublegl_pitch,doublegl_yaw);voidDeInit();/釋放程序占用的
7、內(nèi)存空間voidmyDisplaycube();繪制外框架voidglprintf();/輸出文字/定義結(jié)構(gòu)變量/定義3D點(diǎn)的類,用于保存模型中的頂點(diǎn)classCVector3public:floatx,y,z;/定義2D點(diǎn)類,用于保存模型的UV紋理坐標(biāo)classCVector2public:floatx,y;/面的結(jié)構(gòu)定義structtFaceintvertIndex3;intcoordIndex3;/頂點(diǎn)索引/紋理坐標(biāo)索引/材質(zhì)信息結(jié)構(gòu)體structtMaterialInfocharstrName255;charstrFile255;BYTEcolor3;inttexureId;float
8、uTile;floatvTile;floatuOffset;floatvOffset;/紋理名稱/如果存在紋理映射,則表示紋理文件名稱/對(duì)象的RGB顏色/紋理ID/u重復(fù)/v重復(fù)/u紋理偏移/v紋理偏移/對(duì)象信息結(jié)構(gòu)體structt3DObjectintnumOfVerts;intnumOfFaces;intnumTexVertex;intmaterialID;charstrName255;CVector3*pVerts;/模型中頂點(diǎn)的數(shù)目/模型中面的數(shù)目/模型中紋理坐標(biāo)的數(shù)目/紋理ID/對(duì)象的名稱/對(duì)象的頂點(diǎn)CVector3*pNormals;/對(duì)象的法向量CVector2*pTexVert
9、s;/紋理UV坐標(biāo)tFace*pFaces;/對(duì)象的面信息;/模型信息結(jié)構(gòu)體structt3DModelvectorpMaterials;/材質(zhì)鏈表信息vectorpObject;/模型中對(duì)象鏈表信息;structtIndicesunsignedshorta,b,c,bVisible;/保存塊信息的結(jié)構(gòu)structtChunkunsignedshortintID;unsignedintlength;unsignedintbytesRead;/CLoad3DS類處理所有的裝入代碼classCLoad3DSpublic:/可以被該類中的函數(shù)、子類的函數(shù)、其友元函數(shù)訪問,也可以由該類的對(duì)象訪問CLo
10、ad3DS();/初始化數(shù)據(jù)成員/裝入3ds文件到模型結(jié)構(gòu)中boolImport3DS(t3DModel*pModel,char*strFileName);/只能由該類中的函數(shù)、其友元函數(shù)訪問,不能被任何其他訪問,該類的對(duì)象也不能訪問/讀一個(gè)字符串intGetString(char*);/讀下一個(gè)塊voidReadChunk(tChunk*);/讀下一個(gè)塊voidProcessNextChunk(t3DModel*pModel,tChunk*);/讀下一個(gè)對(duì)象塊voidProcessNextObjectChunk(t3DModel*pModel,t3DObject*pObject,tChunk
11、*);/讀下一個(gè)材質(zhì)塊voidProcessNextMaterialChunk(t3DModel*pModel,tChunk*);/讀對(duì)象顏色的RGB值voidReadColorChunk(tMaterialInfo*pMaterial,tChunk*pChunk);intnumOfObjects;intnumOfMaterials;/模型中對(duì)象的數(shù)目/模型中材質(zhì)的數(shù)目/塊的ID/塊的長度/需要讀的塊數(shù)據(jù)的字節(jié)數(shù)/讀對(duì)象的頂點(diǎn)voidReadVertices(t3DObject*pObject,tChunk*);/讀對(duì)象的面信息voidReadVertexIndices(t3DObject*p
12、Object,tChunk*);/讀對(duì)象的紋理坐標(biāo)voidReadUVCoordinates(t3DObject*pObject,tChunk*);/讀賦予對(duì)象的材質(zhì)名稱voidReadObjectMaterial(t3DModel*pModel,t3DObject*pObject,tChunk*pPreviousChunk);/計(jì)算對(duì)象頂點(diǎn)的法向量voidComputeNormals(t3DModel*pModel);/關(guān)閉文件,釋放內(nèi)存空間voidCleanUp();/文件指針FILE*m_FilePointer;tChunk*m_CurrentChunk;當(dāng)前塊tChunk*m_Temp
13、Chunk;/下一個(gè)塊;CLoad3DSg_Load3ds;t3DModelg_3DModel;/程序函數(shù)intOpenGL_Main()入口程序gl_hWnd=CreateMyWindow(”飛機(jī)動(dòng)態(tài)飛行模擬,SCREEN_WIDTH,SCREEN_HEIGHT,0,hInstance);if(gl_hWnd=NULL)returntrue;Init(gl_hWnd);/初始化整個(gè)程序MainLoop();return0;/創(chuàng)建窗口HWNDCreateMyWindow(LPSTRstrWindowName,intwidth,intheight,DWORDdwStyle,HINSTANCEhI
14、nstance)HWNDgl_hWnd;WNDCLASSwndclass;/*wndclass用來保存我們的窗口類的結(jié)構(gòu)。窗口類結(jié)構(gòu)中保存著我們的窗口信息。通過改變類的不同字段我們可以改變窗口的外觀和行為。每個(gè)窗口都屬于一個(gè)窗口類。當(dāng)您創(chuàng)建窗口時(shí),您必須為窗口注冊(cè)類。*/memset(&wndclass,0,sizeof(WNDCLASS);wndclass.style=CS_HREDRAWICS_VREDRAW;/沒置窗口風(fēng)格wndclass.lpfnWndProc=WinProc;/WndProc處理消息其實(shí)就是鍵盤響應(yīng)wndclass.hInstance=hInstance;/設(shè)
15、置實(shí)例wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);/裝入缺省圖標(biāo)要使用windows預(yù)定義的圖標(biāo),這時(shí)hInstance必須設(shè)置成NULLwndclass.hCursor=LoadCursor(NULL,IDC_ARROW);/裝入鼠標(biāo)指針wndclass.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);/設(shè)置opengl的背景色wndclass.lpszClassName=opengl;/只是設(shè)定一個(gè)類型名RegisterClass(&wndclass);注冊(cè)窗口的if(!dwStyle)dwStyle=W
16、S_OVERLAPPEDWINDOW|WS_CLIPSIBLINGS|WS_CLIPCHILDREN;拓展窗口風(fēng)格的/*WS_CLIPCHILDREN裁剪子窗口。就是不繪制與子窗口重合的父窗口部分子窗口間相互裁減。當(dāng)兩個(gè)窗口相互重疊時(shí),設(shè)置了WS_CLIPSIBLINGS樣式的子窗口重繪時(shí)不能繪制被重疊的部分。WS_OVERLAPPEDWINDOW可以創(chuàng)建一個(gè)擁有各種窗口風(fēng)格的窗體,包括標(biāo)題,系統(tǒng)菜單,邊框,最小化和最大化按鈕等*/g_hInstance=hInstance;RECTrWindow;/取得矩形的左上角和右下角的坐標(biāo)值rWindow.left=0;/將Left設(shè)為0rWindow
17、.right=width;/寬度rWindow.top=0;rWindow.bottom=height;/高度AdjustWindowRect(&rWindow,dwStyle,false);/該函數(shù)依據(jù)所需計(jì)算需要的窗口矩形的大小隨后傳遞給CreateWindow函數(shù),用于創(chuàng)建一個(gè)客戶區(qū)所需大小的窗口。gl_hWnd=CreateWindow(opengl,strWindowName,dwStyle,0,0,rWindow.right-rWindow.left,rWindow.bottom-rWindow.top,NULL,/無父窗口NULL,/無菜單hInstance,/實(shí)例NUL
18、L);/不向WM_CREATE傳遞信息if(!gl_hWnd)returnNULL;ShowWindow(gl_hWnd,SW_SHOWNORMAL);/該函數(shù)設(shè)置指定窗口的顯示狀態(tài)SW_SHOWNORMAL運(yùn)行時(shí)正常大小顯示UpdateWindow(gl_hWnd);/指定客戶區(qū)SetFocus(gl_hWnd);設(shè)置鍵盤焦點(diǎn)returngl_hWnd;LRESULTCALLBACKWinProc(HWNDgl_hWnd,UINTuMsg,WPARAMwParam,LPARAMIParam)/窗口響應(yīng)staticintcxClient,cyClient;LONGlRet=0;switch(u
19、Msg)caseWM_SIZE:用于控制窗口的形狀變化cxClient=LOWORD(lParam);cyClient=HIWORD(lParam);return0;caseWM_CLOSE:/關(guān)閉窗口的響應(yīng)ShowWindow(gl_hWnd,SW_HIDE);/隱藏窗口break;default:lRet=DefWindowProc(gl_hWnd,uMsg,wParam,lParam);/處理無關(guān)消息break;returnlRet;voidInit(HWNDgl_hWnd)/初始化整個(gè)窗口g_hWnd=gl_hWnd;GetClientRect(g_hWnd,&g_rRect)
20、;該函數(shù)獲取窗口客戶區(qū)的坐標(biāo)。InitializeOpenGL(g_rRect.right,g_rRect.bottom);以hWnd代表的客戶區(qū)的矩形的寬和高為變量初始化openglg_Load3ds.Import3DS(&g_3DModel,FILE_NAME);/將3ds文件裝入到模型結(jié)構(gòu)體中g(shù)lEnable(GL_LIGHT0);/使用默認(rèn)的0號(hào)燈glEnable(GL_LIGHTING);/使用燈光glEnable(GL_COLOR_MATERIAL);/使用顏色材質(zhì)voidInitializeOpenGL(intwidth,intheight)/初始化OpenGLg_hDC
21、=GetDC(g_hWnd);if(!bSetupPixelFormat(g_hDC)PostQuitMessage(0);g_hRC=wglCreateContext(g_hDC);/函數(shù)建立一個(gè)適合在指定hdc上繪制的RC,RC與DC有相同的像素格式wglMakeCurrent(g_hDC,g_hRC);glEnable(GL_TEXTURE_2D); 開啟2D紋理貼圖功能glEnable(GL_DEPTH_TEST);/開啟深度測(cè)試SizeOpenGLScreen(width,height);boolbSetupPixelFormat(HDChdc)/設(shè)置設(shè)置像素格式PIXELFORMA
22、TDESCRIPTORpfd;intpixelformat;pfd.nSize=sizeof(PIXELFORMATDESCRIPTOR);pfd.nVersion=1;pfd.dwFlags=PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER;pfd.dwLayerMask=PFD_MAIN_PLANE;pfd.iPixelType=PFD_TYPE_RGBA;pfd.cColorBits=SCREEN_DEPTH;pfd.cDepthBits=SCREEN_DEPTH;pfd.cAccumBits=0;pfd.cStencilBit
23、s=0;if(pixelformat=ChoosePixelFormat(hdc,&pfd)=FALSE)/獲取opengl最佳像素returnFALSE;if(SetPixelFormat(hdc,pixelformat,&pfd)=FALSE)/設(shè)置像素格式returnFALSE;returnTRUE;voidSizeOpenGLScreen(intwidth,intheight)/初始化投影變換if(height=0)height=1;glViewport(0,0,width,height);/設(shè)置實(shí)際圖像映射的像素矩形glMatrixMode(GL_PROJECTION
24、);/指定當(dāng)前矩陣glLoadIdentity();/變成單位矩陣gluPerspective(45.0f,/角度(GLfloat)width/(GLfloat)height,/視景體的寬高比.5f,/沿z軸方向的兩裁面之間的距離的近處150.0f沿z軸方向的兩裁面之間的距離的遠(yuǎn)處);/設(shè)置透視投影矩陣glMatrixMode(GL_MODELVIEW);glLoadIdentity();intMainLoop()主循環(huán)MSGmsg;while(1)if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)/該函數(shù)為一個(gè)消息檢查線程消息隊(duì)列,并將該消息(如果存在)放
25、于指定的結(jié)構(gòu)。/PM_REMOVE:PeekMessage處理后,消息從隊(duì)列里除掉if(msg.message=WM_CLOSE)break;TranslateMessage(&msg);/鍵盤碼的轉(zhuǎn)化DispatchMessage(&msg);/分發(fā)消息到回調(diào)函數(shù),系統(tǒng)通過調(diào)用回調(diào)函數(shù)實(shí)現(xiàn)在窗體中實(shí)現(xiàn)對(duì)應(yīng)操作elseglprintf();輸出狀態(tài)文字gl_x=0;gl_y=0;gl_z=0;gl_wcpitch=wc.pitch;gl_wcroll=wc.roll;gl_wcyaw=wc.yaw;gl_pitch=gl_wcpitch;gl_roll=gl_wcroll;gl
26、_yaw=gl_wcyaw;RenderScene(gl_x,gl_y,gl_z,gl_roll,gl_pitch,gl_yaw);/控制飛機(jī)的姿態(tài)和觀察角度并且對(duì)應(yīng)的在opengl中繪制3ds模型for(inti=0;ig_3DModel.numOfObjects;i+)/清空?qǐng)D形的相關(guān)變量/刪除所有的變量deleteg_3DModel.pObjecti.pFaces;/對(duì)象的面deleteg_3DModel.pObjecti.pNormals;/給出法向量deleteg_3DModel.pObjecti.pVerts;/對(duì)象的頂點(diǎn)deleteg_3DModel.pObjecti.pTexV
27、erts;紋理UV坐標(biāo)DeInit();/釋放程序占用的內(nèi)存空間return(msg.wParam);voidDeInit()/釋放程序占用的內(nèi)存空間if(g_hRC)wglMakeCurrent(NULL,NULL);/用于釋放opengl里面的上下文環(huán)境渲染上下文句柄為null時(shí)才有這個(gè)功能wglDeleteContext(g_hRC);刪除渲染內(nèi)容的句柄if(g_hDC)ReleaseDC(g_hWnd,g_hDC);函數(shù)釋放設(shè)備上下文環(huán)境(DC)供其他應(yīng)用程序使用UnregisterClass(opengl,g_hInstance);/該函數(shù)注銷一個(gè)窗口類,一類釋放所需的內(nèi)存PostQ
28、uitMessage(0);/文字顯示voidglprintf()charstr0100;sprintf(str0,%-08.3lf,wc.pitch);charstr_pitch=俯仰角度:;strcat(str_pitch,str0);SetBkColor(g_hDC,NULL);TextOut(g_hDC,5,5,str_pitch,strlen(str_pitch);SetTextColor(g_hDC,RGB(0,200,0);charstr1100;sprintf(str1,%-08.3lf,wc.roll);charstr_roll=滾轉(zhuǎn)角度:;strcat(str_roll,s
29、tr1);SetBkColor(g_hDC,NULL);TextOut(g_hDC,5,20,str_roll,strlen(str_roll);SetTextColor(g_hDC,RGB(0,200,0);charstr2100;sprintf(str2,%-08.3lf,wc.yaw);charstr_yaw=偏航角度:;strcat(str_yaw,str2);SetBkColor(g_hDC,NULL);TextOut(g_hDC,5,35,str_yaw,strlen(str_yaw);SetTextColor(g_hDC,RGB(0,200,0);charstr3100;spri
30、ntf(str3,%-08.3lf,x);charstr_x=X軸位移:;strcat(str_x,str3);SetBkColor(g_hDC,NULL);TextOut(g_hDC,5,60,str_x,strlen(str_x);SetTextColor(g_hDC,RGB(0,200,0);charstr4100;sprintf(str4,%-08.3lf,y);charstr_y=Y軸位移:strcat(str_y,str4);SetBkColor(g_hDC,NULL);TextOut(g_hDC,5,75,str_y,strlen(str_y);SetTextColor(g_hD
31、C,RGB(0,200,0);charstr5100;sprintf(str5,%-08.3lf,z);charstr_z=Z軸位移:;strcat(str_z,str5);SetBkColor(g_hDC,NULL);TextOut(g_hDC,5,90,str_z,strlen(str_z);SetTextColor(g_hDC,RGB(0,200,0);voidRenderScene(doublegl_x,doublegl_y,doublegl_z,doublegl_roll,doublegl_pitch,doublegl_yaw)glClear(GL_COLOR_BUFFER_BIT|
32、GL_DEPTH_BUFFER_BIT);/清除顏色緩沖以及深度緩沖glLoadIdentity();設(shè)置為單位矩陣gluLookAt(1.2,1.2,-1.2,0,0,0,-1,-1,-1);/設(shè)置觀察坐標(biāo),視點(diǎn)坐標(biāo),視線朝向glPushMatrix();myDisplaycube();glPopMatrix();繪制外部正方體框架g_x=gl_x;g_y=gl_y;g_z=gl_z;g_Rotatex=gl_roll;g_Rotatey=gl_pitch;g_Rotatez=gl_yaw;glTranslatef(g_x,g_y,g_z);/機(jī)翼是y方向從機(jī)頭前方看右側(cè)有正,機(jī)身前后方向是
33、x機(jī)頭方向?yàn)檎较?,機(jī)身垂直是z向下為正方向glRotatef(g_Rotatex,1.0f,0,0);/是飛機(jī)roll的角度glRotatef(g_Rotatey,0,1.0f,0);/pitch的角度glRotatef(g_Rotatez,0,0,1.0f);/yaw的角度glPushMatrix();/將當(dāng)前變換矩陣(單位陣)壓入堆棧glPopMatrix();/遍歷模型中所有的對(duì)象(將顯示列表里的信息顯示出來)for(inti=0;ig_3DModel.numOfObjects;i+)/如果模型中沒有對(duì)應(yīng)的對(duì)象,則退出if(g_3DModel.pObject.size()=0)brea
34、k;/獲得當(dāng)前顯示的對(duì)象t3DObject*pObject=&g_3DModel.pObjecti;glBegin(g_ViewMode); 開始以g_ViewMode模式繪制/遍歷所有的面for(intj=0;jnumOfFaces;j+)/遍歷三角形的所有點(diǎn)for(intwhichVertex=0;whichVertexpFacesj.vertIndexwhichVertex;/給出法向量glNormal3f(pObject-pNormalsindex.x,pObject-pNormalsindex.y,pObject-pNormalsindex.z);glVertex3f(pOb
35、ject-pVertsindex.x,pObject-pVertsindex.y,pObject-pVertsindex.z);glEnd();/繪制結(jié)束Sleep(60);為了降低opengl的cpu占用率,降低刷新頻率SwapBuffers(g_hDC);/交換緩沖區(qū)voidmyDisplaycube()繪制矩形邊框glColor3f(1.0f,1.0f,1.0f);staticconstGLfloatvertex_list3=-0.41f,-0.39f,-0.52f,0.41f,-0.39f,-0.52f,-0.41f,0.39f,-0.52f,0.41f,0.39f,-0.52f,-0
36、.41f,-0.39f,0.52f,0.41f,-0.39f,0.52f,-0.41f,0.39f,0.52f,0.41f,0.39f,0.52f,;glBegin(GL_LINE_LOOP);glVertex3fv(vertex_list0);glVertex3fv(vertex_list2);glVertex3fv(vertex_list3);glVertex3fv(vertex_list1);glEnd();glBegin(GL_LINE_LOOP);glVertex3fv(vertex_list0);glVertex3fv(vertex_list4);glVertex3fv(verte
37、x_list5);glVertex3fv(vertex_list1);glEnd();glBegin(GL_LINE_LOOP);glVertex3fv(vertex_list0);glVertex3fv(vertex_list4);glVertex3fv(vertex_list6);glVertex3fv(vertex_list2);glEnd();glBegin(GL_LINE_LOOP);glVertex3fv(vertex_list2);glVertex3fv(vertex_list6);glVertex3fv(vertex_list7);glVertex3fv(vertex_list
38、3);glEnd();glBegin(GL_LINE_LOOP);glVertex3fv(vertex_list3);glVertex3fv(vertex_list7);glVertex3fv(vertex_list5);glVertex3fv(vertex_list1);glEnd();glBegin(GL_LINE_LOOP);glVertex3fv(vertex_list5);glVertex3fv(vertex_list7);glVertex3fv(vertex_list6);glVertex3fv(vertex_list4);glEnd();glPointSize(5.0f);glF
39、lush();/導(dǎo)入3ds文件部分,生成顯示列表部分/構(gòu)造函數(shù)的功能是初始化tChunk數(shù)據(jù),分配內(nèi)存空間CLoad3DS:CLoad3DS()m_CurrentChunk=newtChunk;m_TempChunk=newtChunk;/初始化并為當(dāng)前的塊分配空間/初始化一個(gè)臨時(shí)塊并分配空間/打開一個(gè)3ds文件,讀出其中的內(nèi)容,并釋放內(nèi)存boolCLoad3DS:Import3DS(t3DModel*pModel,char*strFileName)charstrMessage255=0;m_FilePointer=fopen(strFileName,rb);/打開一個(gè)3ds文件ReadChu
40、nk(m_CurrentChunk);讀出塊的id和塊的sizeProcessNextChunk(pModel,m_CurrentChunk);/現(xiàn)在開始讀入數(shù)據(jù),ProcessNextChunk()是一個(gè)遞歸函數(shù)通過調(diào)用下面的遞歸函數(shù),將對(duì)象讀出ComputeNormals(pModel);/在讀完整個(gè)3ds文件之后, 計(jì)算頂點(diǎn)的法線CleanUp();/釋放內(nèi)存空間returntrue;voidCLoad3DS:CleanUp()/下面的函數(shù)釋放所有的內(nèi)存空間,并關(guān)閉文件fclose(m_FilePointer);/關(guān)閉當(dāng)前的文件指針deletem_CurrentChunk;/釋放當(dāng)前塊d
41、eletem_TempChunk;/釋放臨時(shí)塊/*fread函數(shù)的功能是從一個(gè)文件流中讀數(shù)據(jù),讀取count個(gè)元素,每個(gè)元素size字節(jié).如果調(diào)用成功返回count.如果調(diào)用成功則實(shí)際讀取size*count字節(jié)*/下面的函數(shù)讀出3ds文件的主要部分voidCLoad3DS:ProcessNextChunk(t3DModel*pModel,tChunk*pPreviousChunk)t3DObjectnewObject=0;/用來添加到對(duì)象鏈表ReadChunk(m_CurrentChunk);/判斷塊的ID號(hào)switch(m_CurrentChunk-ID)caseVERSION:/讀入文件
42、的版本號(hào),并將字節(jié)數(shù)添加到bytesRead變量中m_CurrentChunk-bytesRead+=fread(&version,1,m_CurrentChunk-length-m_CurrentChunk-bytesRead,m_FilePointer);if(version0 x03)/如果文件版本號(hào)大于3,給出一個(gè)警告信息MessageBox(NULL,This3DSfileisoverversion3soitmayloadincorrectly,Warning,MB_OK);break;unsignedintversion=0;intbuffer50000=0;m_Curre
43、ntChunk=newtChunk;while(pPreviousChunk-bytesReadlength)caseOBJECTINFO:/網(wǎng)格對(duì)象的信息ReadChunk(m_TempChunk);m_TempChunk-bytesRead+=fread(&version,1,m_TempChunk-length-m_TempChunk-bytesRead,m_FilePointer);m_CurrentChunk-bytesRead+=m_TempChunk-bytesRead;ProcessNextChunk(pModel,m_CurrentChunk);break;caseO
44、BJECT:/對(duì)象的名稱/該塊是對(duì)象信息塊的頭部,保存了對(duì)象了名稱/對(duì)象數(shù)遞增pModel-numOfObjects+;/添加一個(gè)新的tObject節(jié)點(diǎn)到對(duì)象鏈表中pModel-pObject.push_back(newObject);/初始化對(duì)象和它的所有數(shù)據(jù)成員memset(&(pModel-pObjectpModel-numOfObjects-1),0,sizeof(t3DObject);/獲得并保存對(duì)象的名稱,然后增加讀入的字節(jié)數(shù)m_CurrentChunk-bytesRead+=GetString(pModel-pObjectpModel-numOfObjects-1.str
45、Name);/進(jìn)入其余的對(duì)象信息的讀入ProcessNextObjectChunk(pModel,&(pModel-pObjectpModel-numOfObjects-1),m_CurrentChunk);break;caseEDITKEYFRAME:/跳過關(guān)鍵幀塊的讀入,增加需要讀入的字節(jié)數(shù)m_CurrentChunk-bytesRead+=fread(buffer,1,m_CurrentChunk-length-m_CurrentChunk-bytesRead,m_FilePointer);break;default:/跳過所有忽略的塊的內(nèi)容的讀入,增加需要讀入的字節(jié)數(shù)m_Cur
46、rentChunk-bytesRead+=fread(buffer,1,m_CurrentChunk-length-m_CurrentChunk-bytesRead,m_FilePointer);break;/增加從最后塊讀入的字節(jié)數(shù)pPreviousChunk-bytesRead+=m_CurrentChunk-bytesRead;/釋放當(dāng)前塊的內(nèi)存空間deletem_CurrentChunk;m_CurrentChunk=pPreviousChunk;/下面的函數(shù)處理所有的文件中對(duì)象的信息voidCLoad3DS:ProcessNextObjectChunk(t3DModel*pModel
47、,t3DObject*pObject,tChunk*pPreviousChunk)intbuffer50000=0;/用于讀入不需要的數(shù)據(jù)/對(duì)新的塊分配存儲(chǔ)空間m_CurrentChunk=newtChunk;/繼續(xù)讀入塊的內(nèi)容直至本子塊結(jié)束while(pPreviousChunk-bytesReadlength)/讀入下一個(gè)塊ReadChunk(m_CurrentChunk);/區(qū)別讀入是哪種塊switch(m_CurrentChunk-ID)caseOBJECT_MESH:/正讀入的是一個(gè)新塊/使用遞歸函數(shù)調(diào)用,處理該新塊ProcessNextObjectChunk(pModel,pObj
48、ect,m_CurrentChunk);break;caseOBJECT_VERTICES:/讀入是對(duì)象頂點(diǎn)ReadVertices(pObject,m_CurrentChunk);break;caseOBJECT_FACES:/讀入的是對(duì)象的面ReadVertexIndices(pObject,m_CurrentChunk);break;caseOBJECT_UV:/讀入對(duì)象的UV紋理坐標(biāo)/讀入對(duì)象的UV紋理坐標(biāo)ReadUVCoordinates(pObject,m_CurrentChunk);break;default:/略過不需要讀入的塊m_CurrentChunk-bytesRead+
49、=fread(buffer,1,m_CurrentChunk-length-m_CurrentChunk-bytesRead,m_FilePointer);break;/添加從最后塊中讀入的字節(jié)數(shù)到前面的讀入的字節(jié)中pPreviousChunk-bytesRead+=m_CurrentChunk-bytesRead;/釋放當(dāng)前塊的內(nèi)存空間,并把當(dāng)前塊設(shè)置為前面塊deletem_CurrentChunk;m_CurrentChunk=pPreviousChunk;/下面函數(shù)讀入塊的ID號(hào)和它的字節(jié)長度voidCLoad3DS:ReadChunk(tChunk*pChunk)/讀入塊的ID號(hào),占用
50、了2個(gè)字節(jié)。塊的ID號(hào)象OBJECT或MATERIAL一樣,說明了在塊中所包含的內(nèi)容pChunk-bytesRead=fread(&pChunk-ID,1,2,m_FilePointer);/然后讀入塊占用的長度,包含了四個(gè)字節(jié)pChunk-bytesRead+=fread(&pChunk-length,1,4,m_FilePointer);/下面的函數(shù)讀入一個(gè)字符串intCLoad3DS:GetString(char*pBuffer)intindex=0;/讀入一個(gè)字節(jié)的數(shù)據(jù)fread(pBuffer,1,1,m_FilePointer);/直到結(jié)束while(*(pBuff
51、er+index+)!=0)/讀入一個(gè)字符直到NULLfread(pBuffer+index,1,1,m_FilePointer);/返回字符串的長度returnstrlen(pBuffer)+1;/下面的函數(shù)讀入RGB顏色voidCLoad3DS:ReadColorChunk(tMaterialInfo*pMaterial,tChunk*pChunk)/讀入顏色塊信息ReadChunk(m_TempChunk);/讀入RGB顏色m_TempChunk-bytesRead+=fread(pMaterial-color,1,m_TempChunk-length-m_TempChunk-bytes
52、Read,m_FilePointer);/將索引保存在面的結(jié)構(gòu)中/增加讀入的字節(jié)數(shù)pChunk-bytesRead+=m_TempChunk-bytesRead;/下面的函數(shù)讀入頂點(diǎn)索引voidCLoad3DS:ReadVertexIndices(t3DObject*pObject,tChunk*pPreviousChunk)unsignedshortindex=0;/用于讀入當(dāng)前面的索引/讀入該對(duì)象中面的數(shù)目pPreviousChunk-bytesRead+=fread(&pObject-numOfFaces,1,2,m_FilePointer);/分配所有面的存儲(chǔ)空間, 并初始化結(jié)
53、構(gòu)pObject-pFaces=newtFacepObject-numOfFaces;memset(pObject-pFaces,0,sizeof(tFace)*pObject-numOfFaces);/遍歷對(duì)象中所有的面for(inti=0;inumOfFaces;i+)for(intj=0;jbytesRead+=fread(&index,1,sizeof(index),m_FilePointer);if(jpFacesi.vertIndexj=index;/下面的函數(shù)讀入對(duì)象的UV坐標(biāo)voidCLoad3DS:ReadUVCoordinates(t3DObject*pObject
54、,tChunk*pPreviousChunk)/為了讀入對(duì)象的UV坐標(biāo),首先需要讀入U(xiǎn)V坐標(biāo)的數(shù)量,然后才讀入具體的數(shù)據(jù)/讀入U(xiǎn)V坐標(biāo)的數(shù)量pPreviousChunk-bytesRead+=fread(&pObject-numTexVertex,1,2,m_FilePointer);/分配保存UV坐標(biāo)的內(nèi)存空間pObject-pTexVerts=newCVector2pObject-numTexVertex;/讀入紋理坐標(biāo)pPreviousChunk-bytesRead+=fread(pObject-pTexVerts,1,pPreviousChunk-length-pPreviou
55、sChunk-bytesRead,m_FilePointer);/讀入對(duì)象的頂點(diǎn)voidCLoad3DS:ReadVertices(t3DObject*pObject,tChunk*pPreviousChunk)/在讀入實(shí)際的頂點(diǎn)之前,首先必須確定需要讀入多少個(gè)頂點(diǎn)。/讀入頂點(diǎn)的數(shù)目pPreviousChunk-bytesRead+=fread(&(pObject-numOfVerts),1,2,m_FilePointer);/分配頂點(diǎn)的存儲(chǔ)空間,然后初始化結(jié)構(gòu)體pObject-pVerts=newCVector3pObject-numOfVerts;memset(pObject-pV
56、erts,0,sizeof(CVector3)*pObject-numOfVerts);/讀入頂點(diǎn)序列pPreviousChunk-bytesRead+=fread(pObject-pVerts,1,pPreviousChunk-length-pPreviousChunk-bytesRead,m_FilePointer);/*現(xiàn)在已經(jīng)讀入了所有的頂點(diǎn)。因?yàn)?DStudioMax的模型的Z軸是指向上的,因此需要將y軸和z軸翻轉(zhuǎn)過來。具體的做法是將Y軸和Z軸交換,然后將Z軸反向。*/for(inti=0;inumOfVerts;i+)/保存X,Y軸的值floatfTempX=pObject-pVe
57、rtsi.x;floatfTempY=pObject-pVertsi.y;/下面的這些函數(shù)主要用來計(jì)算頂點(diǎn)的法向量,頂點(diǎn)的法向量主要用來計(jì)算光照/下面的宏定義計(jì)算一個(gè)矢量的長度#defineMag(Normal)(sqrt(Normal.x*Normal.x+Normal.y*Normal.y+Normal.z*Normal.z)/下面的函數(shù)求兩點(diǎn)決定的矢量CVector3Vector(CVector3vPoint1,CVector3vPoint2)CVector3vVector;vVector.x=vPoint1.x-vPoint2.x;vVector.y=vPoint1.y-vPoint2.y;vVector.z=vPoint1.z-vPoint2.z;returnvVector;/下面的函數(shù)兩個(gè)矢量相加CVector3AddVector(CVector3vVector1,CVector3vVector2)CVector3vResult;vResult.x=vVector2.x+vVector1.x;vResult.y=vVector2.y+vVector1.y;vResult.z=vVector2.z+vVector1.z;returnvResu
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年粵人版七年級(jí)物理上冊(cè)月考試卷
- 2025年度住宅裝修木工支模施工合同協(xié)議4篇
- 2025年浙教新版選擇性必修3歷史上冊(cè)月考試卷
- 二零二五版門窗行業(yè)綠色供應(yīng)鏈管理合同7篇
- 二零二五年度幕墻節(jié)能診斷與改進(jìn)合同4篇
- 二零二五年度寧波廣告?zhèn)髅狡髽I(yè)勞動(dòng)合同與知識(shí)產(chǎn)權(quán)保護(hù)協(xié)議4篇
- 二零二五版定制門窗設(shè)計(jì)制作與售后服務(wù)合同3篇
- 公共管理理論專題知到智慧樹章節(jié)測(cè)試課后答案2024年秋武漢科技大學(xué)
- 二零二五年度農(nóng)藥生產(chǎn)許可證延續(xù)及變更服務(wù)合同3篇
- 二零二五年度電子信息產(chǎn)業(yè)農(nóng)民工勞動(dòng)合同參考文本4篇
- 中級(jí)半導(dǎo)體分立器件和集成電路裝調(diào)工技能鑒定考試題庫(含答案)
- 2024年江西生物科技職業(yè)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫帶解析答案
- 橋本甲狀腺炎-90天治療方案
- (2024年)安全注射培訓(xùn)課件
- 2024版《建設(shè)工程開工、停工、復(fù)工安全管理臺(tái)賬表格(流程圖、申請(qǐng)表、報(bào)審表、考核表、通知單等)》模版
- 部編版《道德與法治》六年級(jí)下冊(cè)教材分析萬永霞
- 粘液腺肺癌病理報(bào)告
- 酒店人防管理制度
- 油田酸化工藝技術(shù)
- 上海高考英語詞匯手冊(cè)列表
- 移動(dòng)商務(wù)內(nèi)容運(yùn)營(吳洪貴)任務(wù)五 其他內(nèi)容類型的生產(chǎn)
評(píng)論
0/150
提交評(píng)論