亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 3dsloader.cpp

?? 通過vc++編程實現3DS格式的模型載入
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
		/** 關鍵幀 */
		case EDITKEYFRAME:
			
			/** 跳過關鍵幀塊的讀入 */
			m_CurrentChunk->bytesRead += fread(buffer, 1, m_CurrentChunk->length - m_CurrentChunk->bytesRead, m_FilePointer);
			break;
		default: 
			
			/**  跳過所有忽略的塊的內容的讀入 */
			m_CurrentChunk->bytesRead += fread(buffer, 1, m_CurrentChunk->length - m_CurrentChunk->bytesRead, m_FilePointer);
			break;
		}
		
		/** 增加從最后塊讀入的字節數 */
		pPreChunk->bytesRead += m_CurrentChunk->bytesRead;
	}
	
	/** 釋放當前塊的內存空間 */
	delete m_CurrentChunk;
	m_CurrentChunk = pPreChunk;

}
/** 處理所有的文件中對象的信息 */
void C3DSLoader::ReadNextObjChunk(t3DModel *pModel, t3DObject *pObject, tChunk *pPreChunk)
{	
	int buffer[50000] = {0};					/** 用于讀入不需要的數據 */
	
	/** 對新的塊分配存儲空間 */
	m_CurrentChunk = new tChunk;
	
	/** 繼續讀入塊的內容直至本子塊結束 */
	while (pPreChunk->bytesRead < pPreChunk->length)
	{	
		/** 讀入下一個塊 */
		ReadChunk(m_CurrentChunk);
		
		/** 區別讀入是哪種塊 */
		switch (m_CurrentChunk->ID)
		{
		case OBJ_MESH:					/**< 正讀入的是一個新塊 */
			
			/** 使用遞歸函數調用,處理該新塊 */
			ReadNextObjChunk(pModel, pObject, m_CurrentChunk);
			break;
		case OBJ_VERTICES:				/**< 讀入是對象頂點 */
			ReadVertices(pObject, m_CurrentChunk);
			break;
		case OBJ_FACES:					/**< 讀入的是對象的面 */
			ReadVertexIndices(pObject, m_CurrentChunk);
			break;
		case OBJ_MATERIAL:				/**< 讀入的是對象的材質名稱 */
			
			/** 讀入對象的材質名稱 */
			ReadObjMat(pModel, pObject, m_CurrentChunk);			
			break;
		case OBJ_UV:						/**< 讀入對象的UV紋理坐標 */
			/** 讀入對象的UV紋理坐標 */
			ReadUVCoordinates(pObject, m_CurrentChunk);
			break;
		default:  
			/** 略過不需要讀入的塊 */
			m_CurrentChunk->bytesRead += fread(buffer, 1, m_CurrentChunk->length - m_CurrentChunk->bytesRead, m_FilePointer);
			break;
		}
		/** 添加從最后塊中讀入的字節數到前面的讀入的字節中 */
		pPreChunk->bytesRead += m_CurrentChunk->bytesRead;
	}
	/** 釋放當前塊的內存空間,并把當前塊設置為前面塊 */
	delete m_CurrentChunk;
	m_CurrentChunk = pPreChunk;
}
/** 處理所有的材質信息 */
void C3DSLoader::ReadNextMatChunk(t3DModel *pModel, tChunk *pPreChunk)
{	
	int buffer[50000] = {0};					/**< 用于讀入不需要的數據 */
	/** 給當前塊分配存儲空間 */
	m_CurrentChunk = new tChunk;
	/** 繼續讀入這些塊 */
	while (pPreChunk->bytesRead < pPreChunk->length)
	{	
		/** 讀入下一塊 */
		ReadChunk(m_CurrentChunk);
		/** 判斷讀入的是什么塊 */
		switch (m_CurrentChunk->ID)
		{
		case MATNAME:							/**< 材質的名稱 */
			/** 讀入材質的名稱 */
			m_CurrentChunk->bytesRead += fread(pModel->pMaterials[pModel->numOfMaterials - 1].strName, 1, m_CurrentChunk->length - m_CurrentChunk->bytesRead, m_FilePointer);
			break;
		case MATDIFFUSE:						/**< 對象的R G B顏色 */
			ReadColor(&(pModel->pMaterials[pModel->numOfMaterials - 1]), m_CurrentChunk);
			break;
		case MATMAP:							/**< 紋理信息的頭部 */
			/** 下一個材質塊信息 */
			ReadNextMatChunk(pModel, m_CurrentChunk);
			break;
		case MATMAPFILE:						/**< 材質文件的名稱 */
			/** 讀入材質的文件名稱 */
			m_CurrentChunk->bytesRead += fread(pModel->pMaterials[pModel->numOfMaterials - 1].strFile, 1, m_CurrentChunk->length - m_CurrentChunk->bytesRead, m_FilePointer);
			break;
		default:  
			/** 跳過不需要讀入的塊 */
			m_CurrentChunk->bytesRead += fread(buffer, 1, m_CurrentChunk->length - m_CurrentChunk->bytesRead, m_FilePointer);
			break;
		}
		/** 添加從最后塊中讀入的字節數 */
		pPreChunk->bytesRead += m_CurrentChunk->bytesRead;
	}
	/** 刪除當前塊,并將當前塊設置為前面的塊 */
	delete m_CurrentChunk;
	m_CurrentChunk = pPreChunk;
}


/** 讀入RGB顏色 */
void C3DSLoader::ReadColor(tMatInfo *pMaterial, tChunk *pChunk)
{	
	/** 讀入顏色塊信息 */
	ReadChunk(m_TempChunk);
	/** 讀入RGB顏色 */
	m_TempChunk->bytesRead += fread(pMaterial->color, 1, m_TempChunk->length - m_TempChunk->bytesRead, m_FilePointer);
	/** 增加讀入的字節數 */
	pChunk->bytesRead += m_TempChunk->bytesRead;
}
/** 讀入頂點索引 */
void C3DSLoader::ReadVertexIndices(t3DObject *pObject, tChunk *pPreChunk)
{	
	unsigned short index = 0;					/**< 用于讀入當前面的索引 */
	/** 讀入該對象中面的數目 */
	pPreChunk->bytesRead += fread(&pObject->numOfFaces, 1, 2, m_FilePointer);
	/** 分配所有面的存儲空間,并初始化結構 */
	pObject->pFaces = new tFace [pObject->numOfFaces];
	memset(pObject->pFaces, 0, sizeof(tFace) * pObject->numOfFaces);
	/** 遍歷對象中所有的面 */
	for(int i = 0; i < pObject->numOfFaces; i++)
	{	for(int j = 0; j < 4; j++)
		{	
			/** 讀入當前面的第一個點  */
			pPreChunk->bytesRead += fread(&index, 1, sizeof(index), m_FilePointer);
			if(j < 3)
			{	
				/** 將索引保存在面的結構中 */
				pObject->pFaces[i].vertIndex[j] = index;
			}
		}
	}
}

/** 讀入對象的UV坐標 */
void C3DSLoader::ReadUVCoordinates(t3DObject *pObject, tChunk *pPreChunk)
{	
	/** 讀入UV坐標的數量 */
	pPreChunk->bytesRead += fread(&pObject->numTexVertex, 1, 2, m_FilePointer);
	
	/** 分配保存UV坐標的內存空間 */
	pObject->pTexVerts = new Vector2 [pObject->numTexVertex];
	
	/** 讀入紋理坐標 */
	pPreChunk->bytesRead += fread(pObject->pTexVerts, 1, pPreChunk->length - pPreChunk->bytesRead, m_FilePointer);
}

/**  讀入對象的頂點 */
void C3DSLoader::ReadVertices(t3DObject *pObject, tChunk *pPreChunk)
{	
	/** 讀入頂點的數目 */
	pPreChunk->bytesRead += fread(&(pObject->numOfVerts), 1, 2, m_FilePointer);
	
	/** 分配頂點的存儲空間,然后初始化結構體 */
	pObject->pVerts = new Vector3 [pObject->numOfVerts];
	memset(pObject->pVerts, 0, sizeof(Vector3) * pObject->numOfVerts);
	
	/** 讀入頂點序列 */
	pPreChunk->bytesRead += fread(pObject->pVerts, 1, pPreChunk->length - pPreChunk->bytesRead, m_FilePointer);
	
	/** 遍歷所有的頂點將Y軸和Z軸交換,然后將Z軸反向 */
	for(int i = 0; i < pObject->numOfVerts; i++)
	{	
		/** 保存Y軸的值 */
		float fTempY = pObject->pVerts[i].y;
		/** 設置Y軸的值等于Z軸的值 */
		pObject->pVerts[i].y = pObject->pVerts[i].z;
		/** 設置Z軸的值等于-Y軸的值  */
		pObject->pVerts[i].z = -fTempY;
	}
}

/** 讀入對象的材質名稱 */
void C3DSLoader::ReadObjMat(t3DModel *pModel, t3DObject *pObject, tChunk *pPreChunk)
{	
	char strMaterial[255] = {0};			/**< 用來保存對象的材質名稱 */
	int buffer[50000] = {0};				/**< 用來讀入不需要的數據 */
	
	/** 讀入賦予當前對象的材質名稱 */
	pPreChunk->bytesRead += GetString(strMaterial);
	
	/** 遍歷所有的紋理 */
	for(int i = 0; i < pModel->numOfMaterials; i++)
	{	
		/** 如果讀入的紋理與當前的紋理名稱匹配 */
		if(strcmp(strMaterial, pModel->pMaterials[i].strName) == 0)
		{	
			/** 設置材質ID */
			pObject->materialID = i;
			
			/** 判斷是否是紋理映射 */
			if(strlen(pModel->pMaterials[i].strFile) > 0) {
				
				/** 設置對象的紋理映射標志 */
				pObject->bHasTexture = true;
			}	
			break;
		}
		else
		{	
			/** 如果該對象沒有材質,則設置ID為-1 */
			pObject->materialID = -1;
		}
	}
	pPreChunk->bytesRead += fread(buffer, 1, pPreChunk->length - pPreChunk->bytesRead, m_FilePointer);
}


/** 計算對象的法向量 */
void C3DSLoader::ComputeNormals(t3DModel *pModel)
{	
	Vector3 vVector1, vVector2, vNormal, vPoly[3];
	
	/** 如果模型中沒有對象,則返回 */
	if(pModel->numOfObjects <= 0)
		return;
	
	/** 遍歷模型中所有的對象 */
	for(int index = 0; index < pModel->numOfObjects; index++)
	{	
		/** 獲得當前的對象 */
		t3DObject *pObject = &(pModel->pObject[index]);
		
		/** 分配需要的存儲空間 */
		Vector3 *pNormals		= new Vector3 [pObject->numOfFaces];
		Vector3 *pTempNormals	= new Vector3 [pObject->numOfFaces];
		pObject->pNormals		= new Vector3 [pObject->numOfVerts];
		
		/** 遍歷對象的所有面 */
		for(int i=0; i < pObject->numOfFaces; i++)
		{	vPoly[0] = pObject->pVerts[pObject->pFaces[i].vertIndex[0]];
			vPoly[1] = pObject->pVerts[pObject->pFaces[i].vertIndex[1]];
			vPoly[2] = pObject->pVerts[pObject->pFaces[i].vertIndex[2]];
			
			/** 計算面的法向量 */
			vVector1 = vPoly[0] - vPoly[2];		        /**< 獲得多邊形的矢量 */
			vVector2 = vPoly[2] - vPoly[1];		        /**< 獲得多邊形的第二個矢量 */
			vNormal  = vVector1.crossProduct(vVector2);	/**< 計算兩個矢量的叉積 */
			pTempNormals[i] = vNormal;					
			vNormal  = vNormal.normalize();				/**< 規一化叉積 */
			pNormals[i] = vNormal;						/**< 將法向量添加到法向量列表中 */
		}
		
		/** 計算頂點法向量 */
		Vector3 vSum(0.0,0.0,0.0);
		Vector3 vZero = vSum;
		int shared=0;
		
		/** 遍歷所有的頂點 */
		for (i = 0; i < pObject->numOfVerts; i++)			
		{	for (int j = 0; j < pObject->numOfFaces; j++)	/**< 遍歷所有的三角形面 */
			{												/**< 判斷該點是否與其它的面共享 */
				if (pObject->pFaces[j].vertIndex[0] == i || 
					pObject->pFaces[j].vertIndex[1] == i || 
					pObject->pFaces[j].vertIndex[2] == i)
				{	
					vSum = vSum + pTempNormals[j];
					shared++;								
				}
			}      
			pObject->pNormals[i] = vSum / float(-shared);
			
			/** 規一化頂點法向 */
			pObject->pNormals[i] = pObject->pNormals[i].normalize();	
			vSum = vZero;								
			shared = 0;										
		}
		/** 釋放存儲空間,開始下一個對象 */
		delete [] pTempNormals;
		delete [] pNormals;
	}
}








?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩成人一区| 欧美自拍偷拍一区| 另类小说欧美激情| 日本不卡一区二区三区| 偷拍与自拍一区| 日韩—二三区免费观看av| 日产精品久久久久久久性色| 亚洲成av人影院在线观看网| 日韩成人av影视| 国模无码大尺度一区二区三区| 日韩中文字幕麻豆| 久草中文综合在线| 国产成人在线影院| 91亚洲精华国产精华精华液| 在线免费观看不卡av| 欧美日韩一区在线观看| 7799精品视频| 26uuu亚洲| 国产精品毛片久久久久久| 国产精品久久网站| 亚洲激情校园春色| 美女精品自拍一二三四| 国产高清亚洲一区| 欧美天堂亚洲电影院在线播放| 717成人午夜免费福利电影| 精品少妇一区二区三区日产乱码| 欧美国产激情二区三区| 亚洲国产精品麻豆| 久久99精品久久久久久国产越南 | 亚洲女人的天堂| 青青草97国产精品免费观看无弹窗版| 精品在线观看免费| 色乱码一区二区三区88| 日韩视频国产视频| 一区视频在线播放| 蓝色福利精品导航| 97久久精品人人爽人人爽蜜臀| 欧美精品第1页| 国产精品第五页| 日本一区中文字幕| 91色|porny| 久久麻豆一区二区| 日韩av电影一区| 色欧美日韩亚洲| 国产人成亚洲第一网站在线播放 | 2023国产一二三区日本精品2022| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 久久精品一二三| 2021久久国产精品不只是精品| 亚洲少妇屁股交4| 国内成+人亚洲+欧美+综合在线| 一本色道久久综合亚洲91| 2020国产精品自拍| 日韩综合小视频| 欧美亚洲禁片免费| 亚洲精品国产精华液| 国产成人啪午夜精品网站男同| 在线综合视频播放| 亚洲sss视频在线视频| 不卡大黄网站免费看| www久久精品| 黄色日韩网站视频| 欧美不卡123| 久久成人免费日本黄色| 欧美日韩一区视频| 亚洲第一av色| 欧美日韩成人激情| 天天影视涩香欲综合网| 欧美日韩午夜精品| 亚洲18色成人| 欧美一级欧美一级在线播放| 亚洲无人区一区| 欧美色中文字幕| 亚洲国产视频网站| 欧美老女人第四色| 日产精品久久久久久久性色| 3d成人动漫网站| 午夜国产精品一区| 日韩区在线观看| 激情久久五月天| 久久久国际精品| 国产精品一区二区在线观看网站 | 国产成人在线看| 久久久久久**毛片大全| 国产999精品久久| 国产精品水嫩水嫩| 91高清在线观看| 日韩在线一区二区三区| 91精品国产欧美一区二区成人| 蜜桃视频一区二区三区 | 亚洲精品中文字幕在线观看| 99国产精品久久久久久久久久| 成人免费在线播放视频| 91国偷自产一区二区三区成为亚洲经典 | 精品视频一区三区九区| 午夜久久久久久久久| 欧美成人一区二区三区| 丁香亚洲综合激情啪啪综合| 亚洲美女一区二区三区| 在线播放亚洲一区| 国产剧情在线观看一区二区| 亚洲色图一区二区| 日韩欧美色电影| 国产白丝精品91爽爽久久| 亚洲人成网站色在线观看| 欧美精品一卡二卡| 成人网男人的天堂| 日产欧产美韩系列久久99| 国产欧美一区二区三区鸳鸯浴 | 欧美变态口味重另类| 成人avav影音| 日本少妇一区二区| 中文字幕一区二区在线播放 | 国产拍欧美日韩视频二区 | 日韩激情视频在线观看| 精品国产第一区二区三区观看体验| 国产99久久久国产精品潘金 | 亚洲国产综合视频在线观看| 精品国产在天天线2019| 色婷婷精品大在线视频| 国产乱码精品一品二品| 午夜精品久久久久久| 国产精品久久网站| 久久综合999| 欧美日韩国产成人在线免费| 成人av免费网站| 国产一区二区成人久久免费影院| 一区二区三区欧美| 国产精品无遮挡| 精品日韩在线一区| 在线电影国产精品| 日本丰满少妇一区二区三区| 久久99精品国产麻豆婷婷洗澡| 亚洲在线免费播放| 亚洲欧美一区二区三区孕妇| 国产三级精品在线| 精品电影一区二区| 日韩天堂在线观看| 欧美一区二区女人| 欧美日韩国产高清一区| 欧美色精品天天在线观看视频| av一本久道久久综合久久鬼色| 国产一区二区在线电影| 久久66热偷产精品| 久草精品在线观看| 久久99精品国产麻豆不卡| 男女激情视频一区| 免费不卡在线视频| 琪琪一区二区三区| 久久电影网电视剧免费观看| 免费在线观看精品| 极品美女销魂一区二区三区免费 | 久久香蕉国产线看观看99| 337p亚洲精品色噜噜| 欧美日韩五月天| 91精品国产一区二区三区蜜臀| 欧美剧情片在线观看| 欧美一级一级性生活免费录像| 欧美精品1区2区3区| 欧美一区二区三区色| 欧美一区二区三级| 久久综合九色综合97婷婷| 欧美激情一区二区在线| 中文字幕中文字幕在线一区| 亚洲精品国产品国语在线app| 亚洲国产视频在线| 美女在线观看视频一区二区| 久久精品免费观看| 成人午夜在线免费| 色综合天天综合色综合av| 在线观看不卡一区| 日韩网站在线看片你懂的| 国产欧美日韩三区| 悠悠色在线精品| 日本三级韩国三级欧美三级| 国产精品一区二区男女羞羞无遮挡| 国产成人一区在线| 色婷婷亚洲婷婷| 精品少妇一区二区三区在线视频 | 欧美性大战xxxxx久久久| 欧美疯狂性受xxxxx喷水图片| 日韩精品一区二区三区视频 | 久久女同精品一区二区| 亚洲天堂av一区| 日本一区中文字幕| jiyouzz国产精品久久| 3d动漫精品啪啪| 最新日韩av在线| 久久精品国产亚洲a| 99re8在线精品视频免费播放| 欧美一区二区久久久| 中文在线一区二区| 日本伊人色综合网| 97se亚洲国产综合自在线观| 日韩一区二区在线观看视频 | 国产一区久久久| 欧美视频一区二区三区在线观看| 久久影音资源网| 午夜视黄欧洲亚洲| 91香蕉视频在线|