資源簡介
在3dsmax下自制的椅子貼上紋理導(dǎo)出為3ds格式,將3ds文件采用glut編程的方法將其導(dǎo)入opengl中,并用鼠標(biāo)左鍵實(shí)現(xiàn)旋轉(zhuǎn),右鍵實(shí)現(xiàn)縮放,ctrl+左鍵實(shí)現(xiàn)平移。

代碼片段和文件信息
#include?“main.h“
bool?CLoad3DS::Import3DS(t3DModel?*pModel?char?*strFileName)//********************************************************************
{
char?strMessage[255]?=?{0};
tChunk?currentChunk={0};
int?i=0;
//?打開一個3ds文件
m_FilePointer?=?fopen(strFileName?“rb“);
//?確保所獲得的文件指針合法
if(!m_FilePointer)?
{
sprintf(strMessage?“Unable?to?find?the?file:?%s!“?strFileName);
MessageBox(NULL?strMessage?“Error“?MB_OK);
return?false;
}
//?當(dāng)文件打開之后,首先應(yīng)該將文件最開始的數(shù)據(jù)塊讀出以判斷是否是一個3ds文件
//?如果是3ds文件的話,第一個塊ID應(yīng)該是PRIMARY
//?將文件的第一塊讀出并判斷是否是3ds文件
ReadChunk(¤tChunk);//讀出塊的id和塊的size
//?確保是3ds文件
if?(currentChunk.ID?!=?PRIMARY)//打頭的都是基本塊,這個是區(qū)別
{
sprintf(strMessage?“Unable?to?load?PRIMARY?chuck?from?file:?%s!“?strFileName);
MessageBox(NULL?strMessage?“Error“?MB_OK);
return?false;
}
//?現(xiàn)在開始讀入數(shù)據(jù),ProcessNextChunk()是一個遞歸函數(shù)
//?通過調(diào)用下面的遞歸函數(shù),將對象讀出
ProcessNextChunk(pModel?¤tChunk);
//?在讀完整個3ds文件之后,計算頂點(diǎn)的法線
ComputeNormals(pModel);
//?釋放內(nèi)存空間
CleanUp();
return?true;
}
//??下面的函數(shù)釋放所有的內(nèi)存空間,并關(guān)閉文件
void?CLoad3DS::CleanUp()//**************************************************************************
{
if(m_FilePointer)
{ fclose(m_FilePointer); //?關(guān)閉當(dāng)前的文件指針
m_FilePointer=NULL;
}
}
//??下面的函數(shù)讀出3ds文件的主要部分
void?CLoad3DS::ProcessNextChunk(t3DModel?*pModel?tChunk?*pPreviousChunk)//***************************************************************
{
t3Dobject?newobject?=?{0}; //?用來添加到對象鏈表
tMaterialInfo?newTexture?=?{0}; //?用來添加到材質(zhì)鏈表
tChunk?currentChunk={0};????????????????????//?用來添加到當(dāng)前塊鏈表
tChunk?tempChunk={0};???????????????????????//?用來添加到臨時塊鏈表
// unsigned?int?version?=?0; //?保存文件版本
int?gBuffer[50000]?=?{0}; //?用來跳過不需要的數(shù)據(jù)
// m_CurrentChunk?=?new?tChunk; //?為新的塊分配空間
//??下面每讀一個新塊,都要判斷一下塊的ID,如果該塊是需要的讀入的,則繼續(xù)進(jìn)行
//??如果是不需要讀入的塊,則略過
//?繼續(xù)讀入子塊,直到達(dá)到預(yù)定的長度
while?(pPreviousChunk->bytesRead?length)
{
//?讀入下一個塊
ReadChunk(¤tChunk);
//?判斷塊的ID號
switch?(currentChunk.ID)
{
case?VERSION: //?文件版本號
//?在該塊中有一個無符號短整型數(shù)保存了文件的版本
//?讀入文件的版本號,并將字節(jié)數(shù)添加到bytesRead變量中
currentChunk.bytesRead?+=?fread(gBuffer?1?currentChunk.length?-?currentChunk.bytesRead?m_FilePointer);
//?如果文件版本號大于3,給出一個警告信息
if?((currentChunk.length?-?currentChunk.bytesRead==4)&&(gBuffer[0]>?0x03))
MessageBox(NULL?“This?3DS?file?is?over?version?3?so?it?may?load?incorrectly“?“Warning“?MB_OK);
break;
case?objectINFO: //?網(wǎng)格版本信息
//?讀入下一個塊
ReadChunk(&tempChunk);
//?獲得網(wǎng)格的版本號
tempChunk.bytesRead?+=?fread(gBuffer?1?tempChunk.length?-?tempChunk.bytesRead?m_FilePointer);
//?增加讀入的字節(jié)數(shù)
currentChunk.bytesRead?+=?tempChunk.bytesRead;
//?進(jìn)入下一個塊
ProcessNextChunk(pModel?¤tChunk);
break;
case?MATERIAL: //?材質(zhì)信息
//?材質(zhì)的數(shù)目遞增
pModel->numOfMaterials++;
//?在紋理鏈表中添加一個空白紋理結(jié)構(gòu)
pModel->vctMaterials.push_back(newTex
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????20764??2012-09-26?14:05??3ds.cpp
?????文件???????10438??2012-09-26?13:57??main.cpp
?????文件????????5695??2012-09-25?23:55??main.h
?????文件??????413862??2012-09-25?21:15??mucai110.bmp
?????文件??????196662??2012-09-25?21:08??pige132.bmp
?????文件??????579654??2012-09-25?21:18??qiangzhi.bmp
?????文件????????4063??2012-09-25?22:10??ren.dsp
?????文件?????????512??2012-09-25?11:53??ren.dsw
?????文件??????190389??2012-09-25?21:54??wenli4.3DS
- 上一篇:板材玻璃下料問題
- 下一篇:Qt天氣預(yù)報程序
評論
共有 條評論